#python #matplotlib
#python #matplotlib
Вопрос:
Я пытаюсь визуализировать свои данные, однако, когда я рисую точки, линии, кажется, проходят повсюду.
Вот фрагмент этих данных
Date time_began time_end activecalls date_start date_end
7/3/2020 14:08:47 14:09:30 2 7/3/2020 14:08 7/3/2020 14:09
7/3/2020 14:06:05 14:06:48 4 7/3/2020 14:06 7/3/2020 14:06
7/3/2020 15:11:36 15:12:19 6 7/3/2020 15:11 7/3/2020 15:12
7/3/2020 13:37:52 13:38:35 1 7/3/2020 13:37 7/3/2020 13:38
7/3/2020 14:19:31 14:20:14 3 7/3/2020 14:19 7/3/2020 14:20
7/3/2020 13:58:01 13:58:44 1 7/3/2020 13:58 7/3/2020 13:58
7/3/2020 16:56:32 16:57:15 3 7/3/2020 16:56 7/3/2020 16:57
7/3/2020 16:15:26 16:16:09 6 7/3/2020 16:15 7/3/2020 16:16
7/3/2020 14:35:16 14:35:59 3 7/3/2020 14:35 7/3/2020 14:35
7/3/2020 15:54:48 15:55:31 9 7/3/2020 15:54 7/3/2020 15:55
7/3/2020 16:01:39 16:02:22 3 7/3/2020 16:01 7/3/2020 16:02
7/3/2020 15:52:51 15:53:34 4 7/3/2020 15:52 7/3/2020 15:53
Когда я запускаю его, диаграмма выглядит следующим образом:
Вот как я хочу, чтобы это выглядело:
Комментарии:
1. Пожалуйста, покажите данные «time_began» и «time_end»
2. Сортировка данных по дате перед построением графика должна решить эту проблему
3. Я добавил другие данные. Я попытался добавить df.sort_values(by=»date_start») прямо перед построением графика, и я не думаю, что это имело значение.
Ответ №1:
В коде, который вы использовали для построения данных, нет ничего плохого, просто сами данные не соответствуют вашим ожиданиям. Я сделал здесь некоторые предположения, но, основываясь на предыдущей работе, я думаю, что есть две вещи, которые вы хотите сделать, чтобы исправить это
Диапазон дат в данных
Вы перезаписали свой фрейм данных, чтобы ограничить ваши данные включением только информации от '7/1/2020 16:08'
до '7/4/2020 15:10'
здесь:
mask = (df['date_start'] > day1) amp; (df['date_end'] <= day2)
df = df.loc[mask]
Я не уверен, что это сделано специально, чтобы проверить первые несколько дней, но ваш ожидаемый график соответствует 2009 году, поэтому я бы рекомендовал удалить эти строки.
Активные вызовы — Попробуйте использовать агрегацию для каждого дня
Глядя на цифры в вашем фрагменте данных и сравнивая с ожидаемым результатом, данные за период с 2002 по 2009 год довольно детализированы. Если вы хотите объединить сумму активных вызовов по дням, вы хотите включить groupby() с pd.Grouper(), чтобы указать частоту day:
df.groupby(pd.Grouper(key='date_start', freq='D'))['activecalls'].sum()
Отсюда вы можете просто отобразить добавление данных .plot(), который по умолчанию будет отображать линейный график, поскольку индекс теперь является вашим полем даты (агрегированным по дням):
df.groupby(pd.Grouper(key='date_start', freq='D'))['activecalls'].sum().plot()
Наконец, в вашем коде есть несколько несоответствий, которые было бы неплохо просмотреть и устранить:
- Вам не нужно дважды конвертировать
date_start
иdate_end
в даты и времени pd, чтобы вы могли удалить второй экземпляр этого. - Вы перезаписали столбец
activecalls
другим методом создания. Определите, какой из них правильный, и удалите другой.