Матрица корреляции панд с колонкой value_counts строк - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу создать корреляционную матрицу из числа значений столбцов строк.Так что здесь у меня есть серьезность аварии и время.Я пытаюсь показать корреляцию между временем суток и серьезностью аварии

Часть кадра данных Панд (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
  • Серьезный NaN
  • Небольшой 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))

Вывод:

  • nan

1 Ответ

0 голосов
/ 29 ноября 2018

Я не совсем понимаю ожидаемый результат здесь.Но учитывая некоторые данные:

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
...