# pandas rolling.corr 可以按窗口周期计算 相似性(斜方差)
# 但是 rolling(window= )窗口只能是 d(天) s(秒) 或 固定 int
# 如果窗口 是年(A),或者月(M),或者季度(Q),就不行了,
# 可以将所有月或年 内的日期填平,值补 NAN,这样计算结果一样的,之后在删掉补齐的日期。
# 或者有没有更好的方法,被这个折磨了
df = pd.DataFrame(np.random.randn(1000, 4),
index=pd.date_range('1/1/2000',freq='7D',periods=1000),
columns=['A', 'B', 'C', 'D'])
df.head()
'''
A B C D
2000-01-01 -0.747009 0.404950 -0.154117 0.585156
2000-01-08 -0.895967 -0.325115 -0.272460 -0.919274
2000-01-15 -1.288576 0.662856 0.914934 -1.135986
2000-01-22 0.160453 -0.660789 0.912832 -1.244605
2000-01-29 1.936950 -0.510921 -1.882941 1.788139
'''
d = pd.date_range(start='2000-01-01',end='2019-02-23')
date = pd.DataFrame(np.zeros(len(d)),index=d)
df3 = date.join(df)[df.columns]
df3.head()
'''
A B C D
2000-01-01 -0.747009 0.40495 -0.154117 0.585156
2000-01-02 NaN NaN NaN NaN
2000-01-03 NaN NaN NaN NaN
2000-01-04 NaN NaN NaN NaN
2000-01-05 NaN NaN NaN NaN
'''
A = df3['2014-09-26':'2015-09-26']
A['A'].corr(A['B']) # 0.3241573893873542
B = df['2014-09-26':'2015-09-26']
B['A'].corr(B['B']) # 0.3241573893873542
res = df3['A'].rolling('366d').corr(df3['B'])
res['2015-09-26'] #0.3241573893873542
result = res[df.index]
1
billgreen1 2020-03-20 08:55:55 +08:00
rolling 需要一个固定的长度,所以 1M 这样的,有时候 30 天,有时候 31 天,是不行的。
你上面的例子,可以使用 resample ~~~python df.resample('1D').asfreq().rolling('366d').corr(...) ~~~ |
2
wuwukai007 OP @billgreen1 可以,asfreq 自动填充日期,比手工的优雅多了,感谢
|