python - 如何通过 numpy 获得与 pandas.autocorr() 相同的结果?

标签 python pandas numpy correlation autocorrelation

我需要使用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/

相关文章:

python - 更好的方法来统一打乱两个 numpy 数组

python - Python Numpy计算的协方差矩阵每次都变化

python - Pandas 将两列值添加到新数据框

python - spark-submit 和 pyspark 有什么区别?

python - 按字符串值对数据框进行排序

python - 从列表中提取标题并创建一个带有并排标题的 DataFrame 以列出元素

python - 在特定时间间隔内找到列表最大值的最快方法

python - 在gekko中一起建模微分方程和线性方程?

python - Pandas :用另一个数据框替换一行

python - 如何避免稀疏矩阵的循环?