Матрица корреляции панд с колонкой value_counts строк
Я хочу создать матрицу корреляции из числа значений столбцов строки. Так что здесь у меня есть серьезность аварии и время. Я пытаюсь показать корреляцию между временем суток и серьезностью аварии
Часть кадра данных Pandas (df):
+-----------------------+-------------------+------------------+
| Accident_Index | Time | Accident_Severity|
+-----------------------+-------------------+------------------+
| 200501BS00001 | Morning | Serious |
| 200501BS00002 | Night | Slight |
| 200501BS00003 | Evening | Slight |
| 200501BS00004 | Afternoon | Fatal |
+-----------------------+-------------------+------------------+
Мой ожидаемый результат выглядит примерно так:
+---------+-----------+-------+---------+-----------+
| | Morning | Night | Evening | Afternoon |
+---------+-----------+-------+---------+-----------+
| Serious | 0.9 | 0.3 | 0.3 | 0.3 |
| Slight | 0.8 | 1 | 0.2 | 0.5 |
| Fatal | 0.4 | 0.3 | 1 | 0.3 |
+---------+-----------+-------+---------+-----------+
Я пробовал такого рода вещи:
s_corr = df.Accident_Severity.str.get_dummies(' ').corrwith(df.Time.value_counts() / df.Time.value_counts().max())
print(s_corr)
Выход:
- Фатальный НАН
- Серьезный НАН
- Небольшой NaN
и это:
corrs = df.pivot('Time','Accident_Severity').T.corr().stack()
corrs.index.names = 'Time', 'Accident_Severity'
corrs.reset_index()
print(corrs)
Выход:
- ValueError: Индекс содержит повторяющиеся записи, не может изменить форму
и это:
corrs = df.reset_index().pivot_table('Time','Accident_Severity').T.corr().stack()
print(corrs)
Выход:
- pandas.core.base.DataError: Нет числовых типов для агрегирования
и это:
acc = df['Accident_Severity'].value_counts()
ti = df['Time'].value_counts()
print(acc.corr(ti))
Выход:
- бабушка
1 ответ
Решение
Я не очень понимаю ожидаемый результат здесь. Но учитывая некоторые данные:
import random
severity_choices = ['Slight', 'Serious', 'Fatal']
time_choices = ['Morning', 'Afternoon', 'Evening', 'Night']
df = pd.DataFrame({
'Severity': [random.choice(severity_choices) for i in range(0, 1000)],
'Time': [random.choice(time_choices) for i in range(0, 1000)]
})
Мы можем рассчитать долю каждого Severity
с помощью pd.crosstab
а также normalize
установлен в index
,
>> pd.crosstab(df['Severity'], df['Time'], normalize='index')
Time Afternoon Evening Morning Night
Severity
Fatal 0.246106 0.249221 0.224299 0.280374
Serious 0.253125 0.234375 0.253125 0.259375
Slight 0.233983 0.233983 0.267409 0.264624