Как получить средние значения за неделю для значений столбцов и номера недели для соответствующего года на основе ежедневных записей данных с pandas - PullRequest
3 голосов
/ 31 марта 2020

Я все еще учусь python и хотел бы попросить вашей помощи по следующей проблеме:

У меня есть CSV-файл с ежедневными данными, и я ищу решение для суммирования его по календарю недель. Поэтому для приведенных ниже данных макета у меня есть строки, растянутые на 2 недели (14 неделя (текущая неделя) и 13 неделя (прошедшая неделя)). Теперь мне нужно найти способ группировать строки по календарной неделе, определить, к какому году они относятся, и рассчитать сумму и среднее значение за неделю. В примере ввода файла есть только два разных идентификатора. Однако в реальном файле данных я ожидаю гораздо большего.

input.csv

id   date      activeMembers
1  2020-03-30       10
2  2020-03-30       1
1  2020-03-29       5
2  2020-03-29       6
1  2020-03-28       0
2  2020-03-28       15
1  2020-03-27       32
2  2020-03-27       10
1  2020-03-26       9
2  2020-03-26       3
1  2020-03-25       0
2  2020-03-25       0
1  2020-03-24       0
2  2020-03-24       65
1  2020-03-23       22
2  2020-03-23       12
...

требуемый output.csv

id   week      WeeklyActiveMembersSum   WeeklyAverageActiveMembers
1   202014              10                        1.4
2   202014              1                         0.1
1   202013              68                        9.7
2   202013              111                      15.9

моя цель:

import pandas as pd

df = pd.read_csv('path/to/my/input.csv')

Здесь мне нужно сгруппировать по столбцу «id» + «date» (за календарную неделю - не уверен, если это возможно) и создать столбец «week» с номером недели, а затем суммировать значения «activeMembers» для конкретной недели, сохраняя как «WeeklyActiveMembersSum» столбец в моем выходном файле и, наконец, рассчитать WeeklyAverageActiveMembers для конкретной недели. Я экспериментировал с параметрами groupby и isin, но пока не повезло ... мне бы пришлось go с чем-то похожим на это:

df.groupby('id', as_index=False).agg({'date':'max',
                                  'activeMembers':'sum'}  

и, наконец, сохранить все как output.csv:

df.to_csv('path/to/my/output.csv', index=False)

Заранее спасибо!

1 Ответ

2 голосов
/ 01 апреля 2020

Кажется, я получаю настройку недели, отличную от вашей:

# should convert datetime column to datetime type
df['date'] = pd.to_datetime(df['date'])

(df.groupby(['id',df.date.dt.strftime('%Y%W')], sort=False)
   .activeMembers.agg([('Sum','sum'),('Average','mean')])
   .add_prefix('activeMembers')
   .reset_index()
)

Вывод:

   id    date  activeMembersSum  activeMembersAverage
0   1  202013                10             10.000000
1   2  202013                 1              1.000000
2   1  202012                68              9.714286
3   2  202012               111             15.857143
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...