Группировка Pandas и построение графика
В результате конкатенации нескольких датафреймов по дате и прилету-вылету получилась таблица ar_dp_concat вида:
| Date | Status | hours | Flights |
|---|---|---|---|
| 02.16 | Arriv | 00 | 25 |
| 02.16 | Arriv | 01 | 98 |
| 02.16 | Arriv | 02 | 45 |
| 02.16 | Depart | 01 | 26 |
| 02.16 | Depart | 02 | 99 |
| 02.17 | Arriv | 00 | 100 |
| 02.17 | Arriv | 04 | 101 |
| 02.17 | Depart | 01 | 55 |
| 02.17 | Depart | 03 | 30 |
| 02.17 | Depart | 04 | 99 |
По этой таблице надо построить диаграмму прилета-вылета по датам и часам
Мой код:
ar_dp_concat_grouped = ar_dp_concat.groupby([ 'Date','Status', 'hours']).agg({'Flights':'count'}).sort_values(by=[ 'Date', 'Status','hours'], ascending=[True, True, True])
ar_dp_concat_grouped.plot(kind='bar',
xlabel='Time',
ylabel='Quantity')
for i, val in enumerate(ar_dp_concat_grouped.values):
plt.text(i, val, int(val), horizontalalignment='center', verticalalignment='bottom', fontdict={'size':8})`
дает четыре разных графика на одной оси. И вообще, я сомневаюсь в верности своей группировки.
Сначала я работала с 2-мя разными таблицами - Arriv и Depart, но тогда графики вообще получаются на разных осях.
А мне надо наложение Arriv на Depart по датам и часам в одних осях, разным цветом.
Это возможно? и как это сделать?
Комментарий: вопрос
Большое спасибо, второй вариант как раз то, что мне нужно! … но на моей таблице почему-то не работает…
Date Status hours Flights
0 02.16.2024 Arrival 00 AA 1704
1 02.16.2024 Arrival 00 NK 1166
2 02.16.2024 Arrival 01 NK 3801
3 02.16.2024 Arrival 04 AA 2841
4 02.16.2024 Arrival 05 AA 2821
... ... ... ... ...
1397 02.17.2024 Departure 22 AA 5823
1398 02.17.2024 Departure 22 NK 980
1399 02.17.2024 Departure 22 AA 5281
1400 02.17.2024 Departure 22 AA 1644
1401 02.17.2024 Departure 23 AA 494
2802 rows × 4 columns
С датами на самом деле все в порядке, а вот с индексом не понятно - если я применяю ваш код к моим данным
ar_dp_concat[['Date','Status', 'Flights']].pivot_table(columns='Status',index='Date', values='Flights').plot(kind='bar',color=['b','r'])
plt.show()
TypeError: no numeric data to plot
В чем у меня ошибка?
Ответы (1 шт):
Переделал под новые данные, где в Flights - номера рейсов. Агрегирующая функция в pivot_table - количество.
import matplotlib.pyplot as plt
ar_dp_concat = pd.DataFrame({'Date': ['02.16.2024', '02.16.2024', '02.16.2024', '02.16.2024', '02.16.2024', '02.17.2024', '02.17.2024', '02.17.2024', '02.17.2024', '02.17.2024'],
'Status': ['Arrival', 'Arrival', 'Arrival', 'Arrival', 'Arrival', 'Departure', 'Departure', 'Departure', 'Departure', 'Departure'],
'hours': [0, 0, 1, 4, 5, 22, 22, 22, 22, 23],
'Flights': ['AA 1704', 'NK 1166', 'NK 3801', 'AA 2841', 'AA 2821', 'AA 5823', 'NK 980', 'AA 5281', 'AA 1644', 'AA 494']},
index=[0, 1, 2, 3, 4, 1397, 1398, 1399, 1400, 1401])
ar_dp_concat.Date = pd.to_datetime(ar_dp_concat.Date.add(' ').add(ar_dp_concat.hours.astype(str)), format='%m.%d.%Y %H')
ar_dp_concat[['Date', 'Status', 'Flights']].pivot_table(columns='Status', index='Date', values='Flights', aggfunc='count').plot(kind='bar', color=['b', 'r'])
plt.show()
