熊猫数据框中的滚动方式

时间:2018-11-28 10:36:51

标签: pandas dataframe for-loop numpy-broadcasting

我正在尝试在DataFrames上运行一些计算。我想计算两组滚动平均值之间的平均差。更具体地说,是长期平均值(lst)和较小平均值(lst_2)之间的差的平均值。我正尝试将计算与double 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);我以差异为标志,我希望在每个时间点平均这些差异。理想情况下,结果将是一个数据帧result

当运行double for循环时,出现错误:cannot copy sequence with size 3951 to array axis with dimension 1056。显然,我了解到,由于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()

我需要计算以下2组均值:

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 / 我重做步骤1,结合差异3-10; 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])

0 个答案:

没有答案