Получение общей суммы между двумя датами для каждого пользовательского кода в фрейме данных Pandas

#python #pandas

#python #pandas

Вопрос:

Спасибо, что нашли время, чтобы прочитать это. В настоящее время я изучаю, как перемещаться по библиотеке Pandas на Python, и сегодня столкнулся с небольшой проблемой.

По сути, чтобы быть кратким, у меня есть фрейм данных для нескольких разных служб подписки, который содержит следующую информацию (извинения за форматирование):

Код пользователя / Событие / Дата события / Ежемесячная цена

Итак, пара примеров строк будет примерно такой:

 223 / Subscription Start / 2020-10-03 / 15.00

223 / Subscription End / 2021-12-02 / 15.00

224 / Subscription Start / 2020-10-03 / 12.00

225 / Subscription Start / 2020-10-04 / 13.00
 

И если нет конца подписки, то предполагается, что пользователь все еще подписан на услугу.

Мой вопрос в том, есть ли способ, используя Pandas, рассчитать общую сумму, потраченную на ежемесячные платежи для всех пользователей до определенного периода времени?

Так, например, если у нас три разных пользователя, все трое подписались на одну и ту же дату, в марте 2020 года. Один из них отменил подписку после двух циклов выставления счетов, в то время как два других все еще подписаны, и прошло пять циклов выставления счетов. Ожидаемый результат будет:

  5 * (Subscription price person 1)  

 5 * (Subscription price person 2)   

2 * (Subscription price person 3) 

= 
Total amount.
 

Я хочу знать, есть ли способ получения этой информации в Pandas.

Огромное спасибо, что дочитали до этого!

Ответ №1:

Предположим, у вас есть этот фрейм данных:

    User code               Event  Event Date  Monthly price
0        223  Subscription Start  2020-10-03           15.0
1        223    Subscription End  2021-12-02           15.0
2        224  Subscription Start  2020-10-03           12.0
3        225  Subscription Start  2020-10-04           13.0
 

Затем вы можете повернуть таблицу:

 df = (
    df.pivot(
        index=["User code", "Monthly price"],
        columns="Event",
        values="Event Date",
    )
    .fillna(pd.Timestamp.now())
    .reset_index()
)
print(df)
 

Это выводит:

 Event  User code  Monthly price           Subscription End Subscription Start
0            223           15.0 2021-12-02 00:00:00.000000         2020-10-03
1            224           12.0 2021-04-14 00:20:28.427278         2020-10-03
2            225           13.0 2021-04-14 00:20:28.427278         2020-10-04
 

Затем, чтобы вычислить плату, просто сделайте разницу между Subscription Start Subscription End столбцами и и умножьте на Monthly price :

 df["Total amount"] = (
    df["Subscription End"].dt.to_period("M")
    - df["Subscription Start"].dt.to_period("M")
).apply(lambda x: x.n) * df["Monthly price"]
print(df)
 

С принтами:

 Event  User code  Monthly price           Subscription End Subscription Start  Total amount
0            223           15.0 2021-12-02 00:00:00.000000         2020-10-03         210.0
1            224           12.0 2021-04-14 00:22:48.941899         2020-10-03          72.0
2            225           13.0 2021-04-14 00:22:48.941899         2020-10-04          78.0
 

Комментарии:

1. @Arthur Попробуйте преобразовать столбец даты события в DateTime перед запуском кода: df['Event Date'] = pd.to_datetime(df['Event Date'])

2. Огромное спасибо за потраченное время, Андрей. Последний вопрос, есть ли способ заменить . нужно ли использовать определенную дату вместо текущего времени?

3. @Arthur Да, вы можете использовать, например pd.Timestamp("2020-10-23") (измените строку даты по своему усмотрению)