首页 > 解决方案 > Pandas 数据框中的滚动方式

问题描述

我正在尝试在 DataFrames 上运行一些计算。我想计算两组滚动平均值之间的平均差异。更具体地说,长期平均值 ( lst) 和较小的平均值 ( ) 之间差异的平均值lst_2。我正在尝试将计算与双 for 循环结合起来,如下所示:

import pandas as pd
import numpy as pd

def main(df):

    df=df.pct_change()
    lst=[100,150,200,250,300]
    lst_2=[5,10,15,20]

    result=pd.DataFrame(np.sum([calc(df,T,t) for T in lst for t in lst_2]))/(len(lst)+len(lst_2))

    return result

def calc(df,T,t):

     roll=pd.DataFrame(np.sign(df.rolling(t).mean()-df.rolling(T).mean()))

     return roll 

总的来说,我应该有 20 个差异(5 和 100、10 和 100、15 和 100 ... 20 和 300);我采用差异的符号,我想要每个时间点的这些差异的平均值。理想情况下,结果将是一个 dataframe result

我得到了错误:cannot copy sequence with size 3951 to array axis with dimension 1056当它运行双 for 循环时。显然我明白,由于不同的 T 和 t 的滚动,当涉及到数组转换(使用 )时,数据帧的维度是不相等的np.sum,但我认为它会使用“NaN”来对齐维度。希望我已经足够清楚了。谢谢你。

根据评论中的要求,这是一个示例。让我们假设以下数据框:

df = pd.DataFrame({'A': [100,101.4636,104.9477,106.7089,109.2701,111.522,113.3832,113.8672,115.0718,114.6945,111.7446,108.8154]},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
df=df.pct_change()

我需要计算以下两组平均值:

lst=[8,10]
lst_1=[3,4]

然后我按照以下步骤操作:

1/ 我想计算滚动平均值(3) - 滚动平均值(8),并得到它的符号:

roll=np.sign(df.rolling(3).mean()-df.rolling(8).mean())

这应该返回以下内容:

roll = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])

2/ 我用差异 3-10 的组合重做第 1 步;4-8; 4-10。所以我得到了总共 4 个滚动数据框。

roll_3_8 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_3_10 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_4_8 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_4_10 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])

3/ 现在我有了所有的差异,我只想要它们的平均值,所以我将所有 4 个滚动数据帧相加,然后除以 4(计算的差异数)。结果应该是(在删除所有 N/A 值之前):

result = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])

标签: pandasdataframefor-looparray-broadcasting

解决方案


推荐阅读