Pandas временных рядов: сохраняйте только одно значение равной недели и идентификатора - PullRequest
3 голосов
/ 10 февраля 2020

Проблема

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

Ограничения:

  • Чаще всего во вторник каждой недели будут значения
  • Иногда вторник может не иметь значения, принять следующее возможное значение на этой неделе, тогда
+-------------+------------+---------+
| customer_id |    date    | balance |
+-------------+------------+---------+
|          01 | 01.01.2020 | 50$     |
|          02 | 01.01.2020 | 40$     |
|          01 | 02.01.2020 | 40$     |
|          01 | 08.01.2020 | 60$     |
+-------------+------------+---------+

Решение

Решение содержит:

  • одно значение для каждого клиента каждую неделю (нет повторяющихся значений равных неделя / день)
  • значение - самое раннее возможное значение

Из приведенного примера это:

+-------------+------------+---------+
| customer_id |    date    | balance |
+-------------+------------+---------+
|          01 | 01.01.2020 | 50$     |  
|          02 | 01.01.2020 | 40$     |
|          01 | 08.01.2020 | 60$     | 
+-------------+------------+---------+

Как это можно решить / Вопрос

Я мог бы перебрать кадр данных и для каждого идентификатора и недели выбрать первое значение в течение недели и сохранить это к новому дф / удалить все остальные записи. Это кажется довольно неэффективным. Есть ли решение, которое более приспособлено для pandas или, возможно, я бы даже улучшил запрос mysql, чтобы отфильтровать данные по мере необходимости?

1 Ответ

3 голосов
/ 10 февраля 2020

Вы можете изменить date на период и в группе:

df.groupby([df.date.dt.to_period('W-TUE'), 
            df['customer_id']]).head(1)

Вывод:

  customer_id       date  balance
0          01 2020-01-01       50
1          02 2020-01-01       40
3          01 2020-01-08       60
...