记一个 pandas rolling corr 窗口大小不固定 计算问题。

2020-03-20 00:59:58 +08:00
 wuwukai007
# 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]

2263 次点击
所在节点    Python
2 条回复
billgreen1
2020-03-20 08:55:55 +08:00
rolling 需要一个固定的长度,所以 1M 这样的,有时候 30 天,有时候 31 天,是不行的。

你上面的例子,可以使用 resample

~~~python
df.resample('1D').asfreq().rolling('366d').corr(...)
~~~
wuwukai007
2020-03-20 09:25:34 +08:00
@billgreen1 可以,asfreq 自动填充日期,比手工的优雅多了,感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654427

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX