Как передискретизировать фрейм данных pandas для моделирования средней недели?

У меня есть фрейм данных с количеством сообщений и периодом времени, в который они были отправлены (с шагом 10 минут). Вот фрагмент:

+---------------------+--------------+
|      UnixTime       | Num messages |
+---------------------+--------------+
| 2019-02-01 00:00:00 |           54 |
| 2019-02-01 00:10:00 |           23 |
| 2019-02-01 00:20:00 |           36 |
+---------------------+--------------+

Этот фрейм данных имеет метки времени приращения за год и количество сообщений за этот период. Как я могу смоделировать среднюю/медианную неделю, используя весь фрейм данных и день недели в качестве эталона.

+-----------------+-------------------------+
| UnixTime (Mean) | Mean number of messages |
+-----------------+-------------------------+
| Friday 00:00:00 | 56.3                    |
| Friday 00:10:00 | 25.5                    |
| Friday 00:20:00 | 30.4                    |
+-----------------+-------------------------+

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

Я знаю, что могу получить день недели по df["Day Of Week"] = df['UnixTime'].dt.day_name(), но как я могу смоделировать среднее значение, чтобы каждый понедельник года между 09:00 - 09:10 рассматривался, например, как одна и та же группа.

Посмотрите на grouby. Вы должны быть в состоянии сделать что-то вроде: df.groupby('Day Of Week').mean().

Collin Phillips 29.05.2019 17:32

Не уверен, правильно ли я вас понял, но если вы хотите получить среднее значение для каждого дня недели. Разве столбец Mean number of messages в вашем фрейме данных не должен иметь одинаковое значение?

Erfan 29.05.2019 17:35

@Erfan Так что это будет среднее количество сообщений, отправленных с 00:00 до 00:10 в пятницу и так далее.

Lobstw 29.05.2019 17:38

То есть каждая пятница года между 00:00 - 00:10 считается одной и той же группой?

Erfan 29.05.2019 17:39

@Erfan Вот именно, да

Lobstw 29.05.2019 17:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У нас может быть новый столбец «weekNum», чтобы пометить каждую строку как часть N-й недели года. Мы можем сделать это делением пола на числовые значения дней.

df["weekNum"] = int(df["UnixTime"].dt.day//7)

Затем мы можем сгруппировать:

df.groupby("weekNum").mean()
df.groupby("Day of week").mean()

Обновлено:

Чтобы получить каждый 10-секундный интервал, теперь, когда я лучше понимаю ваш вопрос... мы можем использовать .strftime и отформатировать наше время в дневное имя %A час, минуту, секунду %H%M%S и сгруппировать по этому.

df["dayTime"] = df.UnixTime.dt.strftime("%A%H%M%S")
df.groupby("dayTime").mean()

Здравствуйте, этот метод разбивает его на 52 недели, я после одной недели, которая будет представлять типичное использование обмена сообщениями в течение всего года с включенными периодами времени. Это даст мне среднее количество сообщений за понедельник, где я хочу получить среднее количество сообщений за каждый период времени в понедельник.

Lobstw 29.05.2019 17:53

Спасибо, это сработало. Я думал разбить дату на часы, но форматирование даты - гораздо более чистое решение.

Lobstw 29.05.2019 18:57

Другие вопросы по теме