如何计算 df 之间的 corrcoef.系列和 df.Series.shift(1) with numpy?



我正在处理TSA,需要知道df.Seriesdf.Series.shift(1)之间的corrcoef。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
"""

>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.        ]])

您无法计算它,因为shift会使一个值nan。您可以回填此缺失值。它会引入少量的偏见。

print(np.corrcoef(a.bfill(), b))
[[1.        0.7752074]
[0.7752074 1.       ]]

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

print(np.corrcoef(a[1:], b[1:]))
[[1.         0.77487022]
[0.77487022 1.        ]]

bfillffill(反向填充和前向填充(是将邻近值传播到缺失值(NoneNaN(的方法。换句话说,取下一个值或前一个值。

pd.DataFrame([list('ab'), list('def')])
0  1     2
0  a  b  None
1  d  e     f

现在我们将用下一个值"回填"这个值:

pd.DataFrame([list('ab'), list('def')]).bfill()
0  1  2
0  a  b  f
1  d  e  f

您可以回填、向前填充以及从左和右或向上和向下填充。

问题的要点是DataFrame.corr自动为您排除了N/A值,而numpy和scipy则没有提供这种奢侈。col2中的第一个值为 N/A,因为它是从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)

相关内容

  • 没有找到相关文章

最新更新