Python滚动窗口排名与相关系数计算报错:Series转float失败求解
问题解决方法
你的错误根源是rolling.apply要求处理每个窗口的函数返回单个标量值,但你的代码里只返回了排名后的Series,没完成相关系数计算,而且后续链式调用corr的方式也不对——这相当于对整个rolling结果(是一个Series)去和目标序列算相关,完全不符合你要的逐窗口计算逻辑。
修正步骤
- 提前定义好目标序列(即你说的
[1,2,…,X]),避免重复计算 - 在
rolling.apply的lambda函数里,完成窗口排名+和目标序列算相关系数的完整逻辑,确保返回单个浮点数
修正后的代码
window_size = int(time) # 定义目标序列 target_series = pd.Series(range(1, window_size + 1)) # 计算滚动窗口的相关系数 col_name = f"{currency}_{type}_ranked_correlation_{time}" df[col_name] = df[f"{currency}_{type}_cum_price_difference_1_before"].rolling( window=window_size, min_periods=window_size ).apply(lambda x: x.rank(ascending=True).corr(target_series))
关键说明
- 窗口传入的
x本身就是窗口内的Series,不需要再用pd.Series(x)转换 x.rank(ascending=True)得到窗口内的排名序列,直接调用.corr(target_series)就能得到单个相关系数,满足rolling.apply的要求- 用f-string拼接列名,比你原来的字符串拼接更清晰易读
验证你的示例
拿你给的测试序列[1,2,3,4,5,6,7,8,9,-8],窗口设为2:
- 第1行(索引0):窗口不足2,返回NaN
- 第2行(索引1):窗口数据
[1,2],排名是[1,2],和[1,2]的相关系数是1 - ...直到第9行(索引8):窗口数据
[8,9],排名[1,2],相关系数1 - 第10行(索引9):窗口数据
[9,-8],排名[2,1],和[1,2]的相关系数是-1
完全符合你期望的结果。
内容的提问来源于stack exchange,提问作者saltedalmond
相关产品推荐
相关产品推荐

