как вычислить коэффициент корреляции для многопеременного 1 столбца - PullRequest
0 голосов
/ 13 декабря 2018
Category  SubCategory  Month  Value
A         A1           Jan     1
A         A1           Feb     2
A         A1           Mar     3
A         A2           Jan     2
A         A2           Feb     3
A         A2           Mar     5
B         B1           Jan     1
B         B1           Feb     6
B         B1           Mar     7
B         B2           Jan     3
B         B2           Feb     6
B         B2           Mar     7

У меня есть образец панд df, как это.Я хотел бы вычислить коэффициент корреляции между категориями подгруппы A1 и A2, B1 и B2, но не A1 и B1 и т. Д. Моя конечная цель состоит в том, чтобы иметь такую ​​таблицу:

    A1        A2        B1     B2
A1  1.0000  0.9820      
A2  0.9820  1.0000      
B1                    1.0000    0.9963
B2                    0.9963    1.0000

Может кто-нибудь помочьмне с кодом Python?

Очевидно, что этот дает мне значение corr 1 для каждой подкатегории

df.groupby('SubCategory').corr()

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Данные

import pandas as pd
df = pd.DataFrame({"Category" :   ["A", "A", "A", "A", "A", "A", 
                                   "B", "B", "B", "B", "B", "B"], 
                   "SubCategory": ["A1", "A1", "A1", "A2", "A2", "A2", 
                                   "B1", "B1", "B1", "B2", "B2", "B2"],
                   "Value":       [1, 2, 3, 2, 3, 5, 
                                   1, 6, 7, 3, 6, 7]})

Решение

import scipy as sp
# this will contain a list of DataFrames storing the correlation matrices
correlations = []
for g in df.groupby("Category"):
    sub_df = g[1][["SubCategory", "Value"]]
    data = sub_df.pivot_table(columns="SubCategory", values="Value", aggfunc=list)
    correlation = pd.DataFrame(sp.corrcoef(data.values.tolist()[0]), 
                               columns=data.columns.values.tolist(), 
                               index=data.columns.values.tolist())
    correlations.append(correlation)
pd.concat(correlations, sort=False)

Выход

    A1          A2          B1          B2
________________________________________________
A1  1.000000    0.996271    NaN         NaN
A2  0.996271    1.000000    NaN         NaN
B1  NaN         NaN         1.000000    0.996271
B2  NaN         NaN         0.996271    1.000000

Обновление

Это решение было протестировано на версиях Python и Pandas, как показано ниже, более старые версии могут не работать:

from platform import python_version
print('python version:', python_version())
import pandas as pd
print('pandas version:', pd.__version__)

    python version: 3.7.0
    pandas version: 0.23.4
0 голосов
/ 13 декабря 2018

1-й это pivot проблема, затем просто используйте corr

pd.concat([x.pivot('Month','SubCategory','Value').corr() for _,x in df.groupby('Category')])
                   A1        A2        B1        B2
SubCategory                                        
A1           1.000000  0.981981       NaN       NaN
A2           0.981981  1.000000       NaN       NaN
B1                NaN       NaN  1.000000  0.996271
B2                NaN       NaN  0.996271  1.000000
...