如何用numpy在df.Series和df.Series.shift(1)之间计算corrcoef?

问题描述 投票:1回答:2

我正在处理TSA,需要了解df.Seriesdf.Series.shift(1)之间的相关系数。 df.corr()很有帮助,如下所示:

((1)df.DataFrame.corr()

df = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv',
                 index_col=0, parse_dates=True)
values = pd.DataFrame(df.values)
dataframe = pd.concat([values.shift(1), values], axis=1)
dataframe.columns = ['col1', 'col2']

print(dataframe.corr())
"""
         col1     col2
col1  1.00000  0.77487
col2  0.77487  1.00000
"""

问题是我不知道如何使用numpy.corrcoefscipy.stats.stats.pearsonr,请提前寻求帮助!

((2)numpyscipy.stats.stats.pearsonr以这种方式应用

a = dataframe['col1']
b = dataframe['col2']
print(np.corrcoef(a, b))
"""
[[nan nan]
 [nan  1.]]
"""

print(scipy.stats.stats.pearsonr(a, b))
"""
ValueError: array must not contain infs or NaNs
"""
python pandas numpy correlation pearson-correlation
2个回答
0
投票

问题的要点是DataFrame.corr会自动为您排除N / A值,而numpy和scipy则无法提供这种奢侈。 col2中的第一个值,不适用,因为它是由shift创建的。

排除第一个值,您就很好了:

>>> a = df.iloc[1:, 0]
>>> b = df.iloc[1:, 1]

>>> np.corrcoef(a,b)
array([[1.        , 0.77487022],
       [0.77487022, 1.        ]])

>> scipy.stats.stats.pearsonr(a,b)
(0.7748702165384456, 0.0)

0
投票

df.shift(1)的第一行将为NaN,因为它前面没有任何元素。计算它们时,您需要删除该行

>>> scipy.stats.stats.pearsonr(df.values.flatten()[1:],
                               df.shift(1).values.flatten()[1:])
(0.7748702165384456, 0.0)

>>> np.corrcoef(df.values.flatten()[1:],
                df.shift(1).values.flatten()[1:])
array([[1.        , 0.77487022],
       [0.77487022, 1.        ]])

0
投票

您无法计算出来,因为shift取一个值nan。您可以回填此缺失的值。它将引入少量偏差。

print(np.corrcoef(a.bfill(), b))

或者,从第二个值开始计算系数,以避免此缺点:

print(np.corrcoef(a[1:], b[1:]))
© www.soinside.com 2019 - 2024. All rights reserved.