如何用numpy计算df.Series和df.Series.shift(1)之间的corrcoef?
How to culculate the corrcoef between df.Series and df.Series.shift(1) with numpy?
我正在处理 TSA,需要知道 df.Series
和 df.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.corrcoef
或 scipy.stats.stats.pearsonr
,提前感谢您的帮助!
(2) numpy
和 scipy.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
"""
问题的要点是 DataFrame.corr
自动为您排除 N/A 值,而 numpy 和 scipy 不提供这种奢侈。 N/A 中 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)
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. ]]
或者,从第2个值开始计算系数,避免这个缺点:
print(np.corrcoef(a[1:], b[1:]))
[[1. 0.77487022]
[0.77487022 1. ]]
bfill
和 ffill
(后向填充和前向填充)是将附近值传播到缺失值(None
或 NaN
)的方法。换句话说,取下一个值或前一个值。
pd.DataFrame([list('ab'), list('def')])
0 1 2
0 a b None
1 d e f
现在我们将 "back fill" 这个值与下一个值:
pd.DataFrame([list('ab'), list('def')]).bfill()
0 1 2
0 a b f
1 d e f
你可以向后填充,向前填充,从左到右或从上到下。
我正在处理 TSA,需要知道 df.Series
和 df.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.corrcoef
或 scipy.stats.stats.pearsonr
,提前感谢您的帮助!
(2) numpy
和 scipy.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
"""
问题的要点是 DataFrame.corr
自动为您排除 N/A 值,而 numpy 和 scipy 不提供这种奢侈。 N/A 中 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)
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. ]]
或者,从第2个值开始计算系数,避免这个缺点:
print(np.corrcoef(a[1:], b[1:]))
[[1. 0.77487022]
[0.77487022 1. ]]
bfill
和 ffill
(后向填充和前向填充)是将附近值传播到缺失值(None
或 NaN
)的方法。换句话说,取下一个值或前一个值。
pd.DataFrame([list('ab'), list('def')])
0 1 2
0 a b None
1 d e f
现在我们将 "back fill" 这个值与下一个值:
pd.DataFrame([list('ab'), list('def')]).bfill()
0 1 2
0 a b f
1 d e f
你可以向后填充,向前填充,从左到右或从上到下。