是否可以 运行 与 Python 中的一个固定序列相关?
Is it possible to do running correlation with one fixed series in Python?
我想知道是否有一种快速的方法可以在 Python 中与一个固定序列进行 运行 相关?我尝试使用 Pandas,例如:df1.rolling(4).corr(df2)。但是,它需要两个 DataFrame 具有相同的长度。
有没有一种方法可以实现与上述 Pandas 示例类似的方法,但固定了一个 DataFrame?
为了澄清,我想计算下面的 df2 和 df1 中的值之间的相关系数。
示例:
df2 和 df1.loc[0:3] 之间的第一个相关性
df2 和 df1.loc[1:4]
之间的二次相关
等等
我已经通过创建一个循环设法做到了这一点。但是,我发现它在处理较大的 DataFrame 时效率低下。
df1 = pd.DataFrame([1,3,2,4,5,6,3,4])
df2 = pd.DataFrame([1,2,3,2])
您可以使用 pandas.DataFrame.rolling
其中 returns
pandas.core.window.Rolling
有 apply 方法。然后你可以传递给 apply()
任何计算你想要的校正的函数。
例子
- 假设您对 Pearson correlation coefficient. That can be calculated using scipy.stats.pearsonr.
感兴趣
import pandas as pd
from scipy.stats import pearsonr
import numpy as np
df1 = pd.DataFrame([1,3,2,4,5,6,3,4,1,2,3,2,2,3,2,5,1,2,1,2,8,8,8,8,8,8,8])
df2 = pd.DataFrame([1,2,3,2])
CORR_VALS = df2[0].values
def get_correlation(vals):
return pearsonr(vals, CORR_VALS)[0]
df1['correlation'] = df1.rolling(window=len(CORR_VALS)).apply(get_correlation)
- 请注意
df1.rolling()
中的 window
参数的长度应与您计算相关性所依据的数组的长度相同。
这个输出
In [5]: df1['correlation'].values
Out[5]:
array([ nan, nan, nan, 0.31622777, 0.31622777,
0.71713717, 0.63245553, -0.63245553, -0.39223227, -0.63245553,
-0.63245553, 1. , 0. , -0.70710678, 0.81649658,
0. , 0.47809144, -0.23570226, -0.64699664, 0. ,
0. , 0.7570333 , 0.76509206, 0.11043153, -0.77302068,
-0.11043153, 0.86164044])
看起来像这样:
我想知道是否有一种快速的方法可以在 Python 中与一个固定序列进行 运行 相关?我尝试使用 Pandas,例如:df1.rolling(4).corr(df2)。但是,它需要两个 DataFrame 具有相同的长度。 有没有一种方法可以实现与上述 Pandas 示例类似的方法,但固定了一个 DataFrame?
为了澄清,我想计算下面的 df2 和 df1 中的值之间的相关系数。
示例: df2 和 df1.loc[0:3] 之间的第一个相关性 df2 和 df1.loc[1:4]
之间的二次相关等等
我已经通过创建一个循环设法做到了这一点。但是,我发现它在处理较大的 DataFrame 时效率低下。
df1 = pd.DataFrame([1,3,2,4,5,6,3,4])
df2 = pd.DataFrame([1,2,3,2])
您可以使用 pandas.DataFrame.rolling
其中 returns
pandas.core.window.Rolling
有 apply 方法。然后你可以传递给 apply()
任何计算你想要的校正的函数。
例子
- 假设您对 Pearson correlation coefficient. That can be calculated using scipy.stats.pearsonr. 感兴趣
import pandas as pd
from scipy.stats import pearsonr
import numpy as np
df1 = pd.DataFrame([1,3,2,4,5,6,3,4,1,2,3,2,2,3,2,5,1,2,1,2,8,8,8,8,8,8,8])
df2 = pd.DataFrame([1,2,3,2])
CORR_VALS = df2[0].values
def get_correlation(vals):
return pearsonr(vals, CORR_VALS)[0]
df1['correlation'] = df1.rolling(window=len(CORR_VALS)).apply(get_correlation)
- 请注意
df1.rolling()
中的window
参数的长度应与您计算相关性所依据的数组的长度相同。
这个输出
In [5]: df1['correlation'].values
Out[5]:
array([ nan, nan, nan, 0.31622777, 0.31622777,
0.71713717, 0.63245553, -0.63245553, -0.39223227, -0.63245553,
-0.63245553, 1. , 0. , -0.70710678, 0.81649658,
0. , 0.47809144, -0.23570226, -0.64699664, 0. ,
0. , 0.7570333 , 0.76509206, 0.11043153, -0.77302068,
-0.11043153, 0.86164044])
看起来像这样: