在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
相关产品推荐
相关产品推荐

