pandas:计算 table 行之间的相关性
pandas: Compute correlation among rows of a table
我有一个 table 个值,其中包含两个类别字段和一个计数。我需要根据它们在另一类别中的计数来计算一个类别的行之间的相关性。
例如:
Category_A|Category_B|Count
Alan |Turkey |7
Alan |Ham |1
Alan |Spam |0
...
Bob |Turkey |2
Bob |Ham |9
Bob |Spam |12
...
我需要像这样在 table 中获得 Pearson 与 p 值的相关性:
Category_A_1|Category_A_2|Correlation|P Value
Alan |Bob |0.7 |0.07
我不知道如何在 Pandas 中执行此操作。请帮忙。谢谢!
corrs = df.pivot('Category_A','Category_B').T.corr().stack()
#Category_A Category_A
#Alan Alan 1.000000
# Bob -0.986552
#Bob Alan -0.986552
# Bob 1.000000
corrs.index.names = 'A','B'
corrs.reset_index()
# A B 0
#0 Alan Alan 1.000000
#1 Alan Bob -0.986552
#2 Bob Alan -0.986552
#3 Bob Bob 1.000000
遗憾的是,Pandas 没有计算 p 值的工具。
就使用 Pandas 而言,这可能不是 "perfect" 答案,但您可以考虑使用 statsmodels
模块,因为它有一个 OLS
对象既可以给出相关系数,也可以给出相应的 p 值。
只要你能让数组的顺序正确(使用groupby,排序等),你就可以得到值:
d1 = [['Alan', 'Turkey', 7],
['Alan', 'Ham', 1],
['Alan', 'Spam', 0]]
df1 = pd.DataFrame(d1, columns=["Category_A", 'Category_B', 'Count'])
d2 = [['Bob', 'Turkey', 2],
['Bob', 'Ham', 9],
['Bob', 'Spam', 12]]
df2 = pd.DataFrame(d2, columns=["Category_A", 'Category_B', 'Count'])
# package import
import statsmodels.api as sm
# regression model
model = sm.OLS(df2['Count'], df1['Count'])
# get results
results = model.fit()
# pearson coefficient, and p-value
r2, pvalue = results.rsquared, results.pvalues.values[0]
OUT: (0.046200873362445494, 0.78505611578264101)
可能有更好的方法来执行此操作,但可行。
如果 p_value
很重要:
import scipy.stats
df = df.pivot('Category_A','Category_B').T
n = len(df.volumns)
res = pd.DataFrame(columns=['Category_A','Category_B','Corr','P_value'])
for i in range(n):
for j in range(i+1,n):
pears = scipy.stats(df.iloc[:,i],df.iloc[:,j])
res.loc[-1] = [df.columns[i],df.columns[j],pears[0],pears[1]]
res.index += 1
我有一个 table 个值,其中包含两个类别字段和一个计数。我需要根据它们在另一类别中的计数来计算一个类别的行之间的相关性。
例如:
Category_A|Category_B|Count
Alan |Turkey |7
Alan |Ham |1
Alan |Spam |0
...
Bob |Turkey |2
Bob |Ham |9
Bob |Spam |12
...
我需要像这样在 table 中获得 Pearson 与 p 值的相关性:
Category_A_1|Category_A_2|Correlation|P Value
Alan |Bob |0.7 |0.07
我不知道如何在 Pandas 中执行此操作。请帮忙。谢谢!
corrs = df.pivot('Category_A','Category_B').T.corr().stack()
#Category_A Category_A
#Alan Alan 1.000000
# Bob -0.986552
#Bob Alan -0.986552
# Bob 1.000000
corrs.index.names = 'A','B'
corrs.reset_index()
# A B 0
#0 Alan Alan 1.000000
#1 Alan Bob -0.986552
#2 Bob Alan -0.986552
#3 Bob Bob 1.000000
遗憾的是,Pandas 没有计算 p 值的工具。
就使用 Pandas 而言,这可能不是 "perfect" 答案,但您可以考虑使用 statsmodels
模块,因为它有一个 OLS
对象既可以给出相关系数,也可以给出相应的 p 值。
只要你能让数组的顺序正确(使用groupby,排序等),你就可以得到值:
d1 = [['Alan', 'Turkey', 7],
['Alan', 'Ham', 1],
['Alan', 'Spam', 0]]
df1 = pd.DataFrame(d1, columns=["Category_A", 'Category_B', 'Count'])
d2 = [['Bob', 'Turkey', 2],
['Bob', 'Ham', 9],
['Bob', 'Spam', 12]]
df2 = pd.DataFrame(d2, columns=["Category_A", 'Category_B', 'Count'])
# package import
import statsmodels.api as sm
# regression model
model = sm.OLS(df2['Count'], df1['Count'])
# get results
results = model.fit()
# pearson coefficient, and p-value
r2, pvalue = results.rsquared, results.pvalues.values[0]
OUT: (0.046200873362445494, 0.78505611578264101)
可能有更好的方法来执行此操作,但可行。
如果 p_value
很重要:
import scipy.stats
df = df.pivot('Category_A','Category_B').T
n = len(df.volumns)
res = pd.DataFrame(columns=['Category_A','Category_B','Corr','P_value'])
for i in range(n):
for j in range(i+1,n):
pears = scipy.stats(df.iloc[:,i],df.iloc[:,j])
res.loc[-1] = [df.columns[i],df.columns[j],pears[0],pears[1]]
res.index += 1