我正在尝试在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])