from scipy.stats import pearsonr
import pandas as pd
def calculate_pvalues(df):
dfcols = pd.DataFrame(columns=df.columns)
pvalues = dfcols.transpose().join(dfcols, how='outer')
for r in df.columns:
for c in df.columns:
tmp = df[df[r].notnull() & df[c].notnull()]
pvalues[r][c] = round(pearsonr(tmp[r], tmp[c])[1], 4)
return pvalues
from scipy.stats import pearsonr
import numpy as np
rho = df.corr()
pval = df.corr(method=lambda x, y: pearsonr(x, y)[1]) - np.eye(*rho.shape)
p = pval.applymap(lambda x: ''.join(['*' for t in [.05, .01, .001] if x<=t]))
rho.round(2).astype(str) + p
import pandas as pd
from pandas.io.data import DataReader
from datetime import datetime
import scipy.stats as stats
gdp = pd.DataFrame(DataReader("GDP", "fred", start=datetime(1990, 1, 1)))
vix = pd.DataFrame(DataReader("VIXCLS", "fred", start=datetime(1990, 1, 1)))
#Do it with a pandas regression to get the p value from the F-test
df = gdp.merge(vix,left_index=True, right_index=True, how='left')
vix_on_gdp = pd.ols(y=df['VIXCLS'], x=df['GDP'], intercept=True)
print(df['VIXCLS'].corr(df['GDP']), vix_on_gdp.f_stat['p-value'])
中 的 每 一 个 结果 :
-0.0422917932738 0.851762475093
格式 与 stats 函数 的 结果 相同 :
#Do it with stats functions.
df_clean = df.dropna()
stats.pearsonr(df_clean['VIXCLS'], df_clean['GDP'])
格式 结果 :
(-0.042291793273791969, 0.85176247509284908)
格式 为了 扩展 到 更多 的 变量 , 我 给 你 一 个 丑陋 的 基于 循环 的 方法 :
#Add a third field
oil = pd.DataFrame(DataReader("DCOILWTICO", "fred", start=datetime(1990, 1, 1)))
df = df.merge(oil,left_index=True, right_index=True, how='left')
#construct two arrays, one of the correlation and the other of the p-vals
rho = df.corr()
pval = np.zeros([df.shape[1],df.shape[1]])
for i in range(df.shape[1]): # rows are the number of rows in the matrix.
for j in range(df.shape[1]):
JonI = pd.ols(y=df.icol(i), x=df.icol(j), intercept=True)
pval[i,j] = JonI.f_stat['p-value']
格式 结果 ρ :
GDP VIXCLS DCOILWTICO
GDP 1.000000 -0.042292 0.870251
VIXCLS -0.042292 1.000000 -0.004612
DCOILWTICO 0.870251 -0.004612 1.000000
def calculate_pvalues(df):
df = df._get_numeric_data()
dfcols = pd.DataFrame(columns=df.columns)
pvalues = dfcols.transpose().join(dfcols, how='outer')
for r in df.columns:
for c in df.columns:
if c == r:
df_corr = df[[r]].dropna()
else:
df_corr = df[[r,c]].dropna()
pvalues[r][c] = pearsonr(df_corr[r], df_corr[c])[1]
return pvalues
9条答案
按热度按时间pxy2qtax1#
要一次计算所有p值,可以使用**
calculate_pvalues
函数**(代码如下):输出类似于
corr()
(但具有p值):详细数据:
*列D自动被忽略,因为它包含文本。
calculate_pvalues(df[['A','B','C']]
以下是***函数的***代码:
qybjjes12#
统计学显著性以星号表示:
ubby3x7f3#
您可以使用scipy.stats相关函数来获取p值。
例如,如果您要寻找像Pearson相关性这样的相关性,则可以使用Pearsonr函数。
提供输出
其中,元组中的第一个值是相关值,第二个值是p值。
在您的示例中,可以使用panda的
dropna
函数先删除NaN
值。f8rj6qna4#
@Shashank 提供 的 答案 很 不错 。 但是 , 如果 你 想 要 一 个 纯
pandas
的 解决 方案 , 你 可能 会 喜欢 这个 :中 的 每 一 个
结果 :
格式
与 stats 函数 的 结果 相同 :
格式
结果 :
格式
为了 扩展 到 更多 的 变量 , 我 给 你 一 个 丑陋 的 基于 循环 的 方法 :
格式
结果 ρ :
格式
pval 结果 :
格式
bvjveswy5#
在panda v0.24.0中,
method
参数被添加到corr
中。现在,您可以执行以下操作:第一个
请注意所需的
np.eye(len(df.columns))
解决方案,因为自相关始终设置为1.0
(参见https://github.com/pandas-dev/pandas/issues/25726)。dgenwo3n6#
我试过用一个函数来总结逻辑,这可能不是最有效的方法,但会提供类似于Pandasdf.corr()的输出。要使用这个方法,只需在代码中放入以下函数,并调用它提供 Dataframe 对象ie. corr_pvalue(your_dataframe)。
我已经将数值四舍五入到小数点后4位,如果你想要不同的输出,请在四舍五入功能中更改数值。
我用Pandasv0.18.1测试过
a0zr77ik7#
这是oztalha编写的非常有用的代码。我只是在r不重要的地方更改了格式(四舍五入为2位数)。
neekobn88#
@toto_tico和@Somendra-joshi给出了很好的答案。但是,它会丢弃不必要的NAs值。在这个代码片段中,我只是丢弃了属于当前正在计算的相关性的NAs。在实际的corr实现中,它们也是这样做的。
8yparm6h9#
在使用列表解析的单行代码中: