我需要使用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 Only函数来实现与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相关问答推荐

学习率未更新

将每个关键字值对转换为pyspark中的Intramame列

Inquirer库不适用于Pyterfly

无法获得指数曲线_fit来处理日期

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

定义同侪组并计算同侪组分析

无法导入已安装的模块

Python主进程和分支进程如何共享gc信息?

如何使用上下文管理器创建类的实例?

Python在tuple上操作不会通过整个单词匹配

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

点到面的Y距离

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

用Python解密Java加密文件

使用groupby Pandas的一些操作

如何在solve()之后获得症状上的等式的值

如何创建一个缓冲区周围的一行与manim?

无法连接到Keycloat服务器

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

如何在BeautifulSoup/CSS Select 器中处理regex?