You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中生成行与一阶滞后行的协方差(对应EXCEL COVARIANCE.P)

计算DataFrame每行与一阶滞后行的总体协方差(匹配Excel COVARIANCE.P)

嘿,我来帮你搞定这个需求!首先得明确:Excel的COVARIANCE.P计算的是总体协方差,分母是数据点的数量(也就是你的4列,n=4),而非样本协方差用的n-1。我们要做的就是对每一行(从第二行开始)和它的上一行(一阶滞后),把这两行的4个值分别看作两个变量序列,计算它们的总体协方差。

具体实现步骤

1. 获取滞后数据

用shift(1)就能轻松拿到上一行的数据,让每一行的滞后数据和当前行一一对应:

import pandas as pd
import numpy as np

# 假设你的DataFrame名为df
lagged_df = df.shift(1)

2. 定义和Excel完全对齐的协方差函数

我们可以手动实现COVARIANCE.P的公式,确保和Excel的计算逻辑完全一致:

def cov_p(x, y):
    # 先检查两个序列长度是否一致(这里应该都是4)
    if len(x) != len(y):
        return np.nan
    # 计算两个序列的均值
    x_avg = x.mean()
    y_avg = y.mean()
    # 计算每个(xi - x̄)(yi - ȳ)的总和
    sum_cross = ((x - x_avg) * (y - y_avg)).sum()
    # 总体协方差除以数据点数量n
    return sum_cross / len(x)

也可以用numpy的cov函数简化实现,但要指定ddof=0(numpy默认是样本协方差,ddof=1),结果完全一致:

def cov_p(x, y):
    return np.cov(x, y, ddof=0)[0][1]

3. 逐行应用函数计算

用apply方法沿着行方向(axis=1),把当前行和对应的滞后行传入函数:

df['Covariance'] = df.apply(lambda row: cov_p(row, lagged_df.loc[row.name]), axis=1)

这样第一行因为没有滞后行,结果会是NaN,和你给出的示例格式完全匹配。

补充:处理缺失值的情况

如果你的DataFrame里存在缺失值,可以修改函数过滤掉成对的缺失值,和Excel的行为保持一致:

def cov_p_with_na(x, y):
    # 过滤掉x或y为空的配对数据
    combined = pd.DataFrame({'x': x, 'y': y}).dropna()
    if len(combined) < 2:
        return np.nan
    x_clean = combined['x']
    y_clean = combined['y']
    x_avg = x_clean.mean()
    y_avg = y_clean.mean()
    sum_cross = ((x_clean - x_avg) * (y_clean - y_avg)).sum()
    return sum_cross / len(x_clean)

内容的提问来源于stack exchange,提问作者Gautham Kanthasamy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:40:38