Pandas: Суммирование по диапазону дат с начальной и конечной датой - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь создать DataFrame, чтобы я мог проанализировать, как часто uID был активен в определенный период времени.

У меня есть вход DataFrame следующим образом:

uID   startdate     stopdate      active_sub
1    01-01-2019     31-01-2019    1
2    01-02-2019     31-12-2019    1
1    15-01-2019     31-12-2019    1
3    01-06-2019     31-11-2019    1

Я пытаюсь получить DataFrame для каждого Date и uID, в котором суммируются активные подписки для каждого пользователя.

Date        uID:1  uID:2  uID:3 
01-01-2019  1      0      0
02-01-2019  1      0      0
03-01-2019  1      0      0 
...
15-01-2019  2      0      0   #uID:1  has 2 active subcriptions on this day
...
31-12-2019  1      1      1

У меня есть следующий код, который работает, но не для дубликатов uID. Входной набор данных большой и имеет много дублированных идентификаторов пользователя.

#Create date dataframe
df = pd.DataFrame(
    index = pd.date_range('01-01-2019', '31-12-2019').normalize(),
    columns = input_df['uID']
)

for row in input_df.iterrows():
    df[row[1][0]].loc[row[1][1]] = 1 #StartDate
    df[row[1][0]].loc[row[1][2]] = 0 #EndDate
    df[row[1][0]] = df[row[1][0]].fillna(method= 'ffill')

df = df.fillna(0)

Возможно ли быстрое исправление или есть другой способ быстро достичь этого желаемого кадра данных?

1 Ответ

0 голосов
/ 19 февраля 2020

Во-первых, обратите внимание, что дата "31-11-2019" просто не существует :-) Однако после исправления этой ошибки, возможно, это то, что требуется сделать:

from io import StringIO
import pandas as pd
data = (
'uID   startdate     stopdate      active_sub\n'
'1    01-01-2019     31-01-2019    1\n'
'2    01-02-2019     31-12-2019    1\n'
'1    15-01-2019     31-12-2019    1\n'
'3    01-06-2019     30-11-2019    1\n')

df = pd.read_fwf(StringIO(data))

df['startdate'] = pd.to_datetime(df['startdate'], format='%d-%m-%Y')
df['stopdate'] = pd.to_datetime(df['stopdate'], format='%d-%m-%Y')
df['uID'] = df['uID'].astype(str)


df_result = df.apply(lambda x: pd.Series(x['uID'], 
                             index=pd.date_range(x['startdate'].floor('D'), 
                                                 x['stopdate'].ceil('D'), 
                                                 freq='D')), axis=1)\
  .stack().str.get_dummies().reset_index(level=0, drop=True)

df_result2 = df_result.groupby(df_result.index).agg(sum)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...