Как сделать линейный график Seaborn из мультииндекса Pandas? - PullRequest
1 голос
/ 29 мая 2020

Noobi sh Seaborn / Pandas вопрос: У меня есть таблица с данными публикаций на странице Facebook, которая выглядит следующим образом (первые 20 строк):

| Name                   | ID              | Type      | Date             | Shares | Comments | Reactions | Engagement |
|------------------------|-----------------|-----------|------------------|--------|----------|-----------|------------|
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:00 | 61     | 39       | 610       | 710        |
| Guybrush's Page        | 167959249906191 | link      | 13/05/2020 09:04 | 4      | 27       | 481       | 512        |
| Elaine's Page          | 187202271820522 | album     | 13/05/2020 09:12 | 0      | 3        | 96        | 99         |
| Elaine's Page          | 187202271820522 | album     | 13/05/2020 09:14 | 1      | 14       | 426       | 441        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:20 | 3      | 8        | 158       | 169        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:20 | 26     | 101      | 508       | 635        |
| Elaine's Page          | 187202271820522 | undefined | 13/05/2020 09:23 | 1      | 11       | 109       | 121        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:28 | 2      | 257      | 987       | 1246       |
| Herman Toothrot's Page | 201295459914847 | photo     | 13/05/2020 09:30 | 1      | 0        | 178       | 179        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:31 | 3      | 6        | 162       | 171        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:38 | 44     | 143      | 4294      | 4481       |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:39 | 7      | 79       | 631       | 795        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 09:40 | 3      | 0        | 104       | 107        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:45 | 0      | 3        | 76        | 79         |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:45 | 20     | 78       | 1455      | 1553       |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:46 | 7      | 321      | 1847      | 2175       |
| Guybrush's Page        | 167959249906191 | link      | 13/05/2020 09:46 | 4      | 2        | 311       | 317        |
| Elaine's Page          | 187202271820522 | photo     | 13/05/2020 09:50 | 2      | 29       | 777       | 808        |
| Elaine's Page          | 187202271820522 | link      | 13/05/2020 09:53 | 0      | 0        | 115       | 115        |
| Herman Toothrot's Page | 201295459914847 | link      | 13/05/2020 10:00 | 143    | 255      | 10211     | 10609      |

Фактический набор данных распространяется на несколько дней.

Я хочу построить линейный график Seaborn со временем в качестве оси X («Дата»), а затем COUNT сообщений (по дням) в качестве оси Y.

Затем я хочу установить одну из числовых c переменных в аргумент SIZE и разбить страницы («Name») по HUE.

Таким образом, конечный результат будет выглядеть примерно так, как в этом учебном примере Seaborn:

enter image description here

Концептуально я знаю, что для этого требуется повторная выборка (или какой-то groupby?) по дням, чтобы создавать группы суммированных данных для каждой страницы по дням, как в этой сводной таблице Excel:

enter image description here

Я подозреваю для этого также может потребоваться MultiIndex?

Я думал, что где-то добираюсь с,

facebook_dataframe.groupby(["Name", "Date", "Reactions"], as_index=False)["Engagement"].sum()

... но я не хочу, чтобы суммировать только по вовлечению (или просто любую из переменных), и я хотел бы иметь возможность строить график днем.

Я пробовал передискретизировать фрейм данных по дням, но в итоге получаю серию, показывающую либо подсчеты, либо суммы, тогда как мне бы хотелось, чтобы периоды дней со всеми числовыми c переменными были неповрежденными (согласно сводная таблица, выше).

Надеюсь, это понятно. Я ценю, что все 20 представленных строк относятся к одному дню, но вместо этого любое предлагаемое решение может быть пересчитано по минутам, подход будет таким же? Очень благодарен за любую помощь ?

1 Ответ

1 голос
/ 29 мая 2020

IIU C, вы хотите сделать groupby, используя pd.Grouper, чтобы задать нужную частоту и имя, а затем используйте agg со всеми столбцами и функциями, которые вы хотите получить как:

data = (df.groupby([pd.Grouper(key='Date', freq='5T'), #replace 5T by D to get daily agggregation
                    'Name'])
          .agg(count=('Name','count'), 
               sum_shares=('Shares','sum'), 
               sum_comments=('Comments','sum'), 
               sum_engagement=('Engagement','sum'), )
          .reset_index()
       )

print (data.head())
                 Date                      Name  count  sum_shares  \
0 2020-05-13 09:00:00   Guybrush's Page              1           4   
1 2020-05-13 09:00:00   Herman Toothrot's Page       1          61   
2 2020-05-13 09:10:00   Elaine's Page                2           1   
3 2020-05-13 09:20:00   Elaine's Page                2           4   
4 2020-05-13 09:20:00   Herman Toothrot's Page       1          26   

   sum_comments  sum_engagement  
0            27             512  
1            39             710  
2            17             540  
3            19             290  
4           101             635  

, тогда вы можете использовать seaborn как:

import seaborn as sns
sns.lineplot(x='Date', y='count', data=data,
             hue='Name', 
             size='sum_shares') #here for the size use what summed column you want

Я не публикую изображение, так как на самом деле нет ничего, что можно было бы увидеть с указанными 20 строками данных .

...