我需要使用numpy函数来替换所有Pandas函数,但是Pandas包没有很好地解释pd.autocorr()
是如何实现的。
import numpy as np
import pandas as pd
df = pd.DataFrame.from_dict({'A': np.random.random(20)})
x = df.rolling(5).apply(lambda x: x.autocorr(), raw=True).dropna()
y = []
for i in range(15):
y.append( np.corrcoeff(df['A'][i:i+5],df['A'][i+1:i+6])[0,1] )
# np.correlate(df['A'][i:i+5]-df['A'][i:i+5].mean(),df['A'][(1+i):(6+i)]-df['A'][(1+i):(6+i)].mean(),'valid')[0]
# np.correlate(df['A'][i:i+5]-df['A'][i:i+5].mean(),np.flip(df['A'][(1+i):(6+i)])-df['A'][(1+i):(6+i)].mean(),'valid')[0]
pd.autocorr()
结果与 np.corrcoef()
的结果有很大不同(我试过 np.correlate()
以及)。
有什么方法可以使用仅 numpy 函数来实现与 pd.autocorr() 相同的结果吗?
----------------- 添加示例结果 ----------------
df['A'] = [0.5314742325906894, 0.7424912257400176, 0.2895649008872213, 0.16967710120380175, 0.5157732179121193, 0.8733423106397956, 0.585705172096987, 0.1387299202733231, 0.18540514459343538, 0.13913104211564564, 0.736937228263526, 0.20944078980434988, 0.2826810751427198, 0.15055686873748197, 0.4159491505728884, 0.07600226975854041, 0.15279939462562298, 0.1405723553409276, 0.8372449734938123, 0.3314986851097367]
x = [0.010637545587524432, 0.03594106077726333, 0.40104877005219836, -0.009106549297130558, 0.4008385963492408, 0.7794761931857483, -0.4182779136016351, -0.2962696925038811, -0.4083361773384266, -0.5244693987698964, -0.5063605533618415, -0.9496936641021706, -0.5303040575891907, -0.42881675192105184, -0.3371366910961831, -0.036231529863559424]
y = [0.11823200733266746, 0.16166841984627847, 0.2033980627120384, 0.2861039403548347, 0.5239653859040245, 0.1602079943122044, -0.3920837265006942, -0.28176746883177917, -0.3604612671108854, -0.5347077109231272, -0.4702461092101919, -0.5287673078857449, -0.4501452367448014, -0.3538574959825232, -0.10013342594129321]
最佳答案
如果我们检查 pandas.Series.autocorr 的文档,如果使用默认参数调用该函数,lag
为 1,这意味着您需要移动一个元素来计算相关性。
例如:
a = np.array([0.25, 0.5, 0.2, -0.05])
s = pd.Series(a)
给你:
0.1035526330902407
使用np.corrcoef
,您需要将数组切片为两个移位的数组:
np.corrcoef(a[:-1], a[1:])[0, 1]
这会给你相同的结果:
0.1035526330902407
所以在你的情况下,代码应该是这样的:
W = 5 # Window size
nrows = len(df) - W + 1 # number of elemnets after rolling
lag=1
y = []
for i in range(nrows):
y.append(np.corrcoef(df['A'][i:i+W-lag],df['A'][i+lag:i+W])[0,1])
您将得到与x
相同的结果。
关于python - 如何通过 numpy 获得与 pandas.autocorr() 相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76668685/