Вопрос или проблема
Я работаю с dataframe, содержащим события подписки, разделенные по именам пользователей, статусам подписки и относительным временным меткам. Для каждой из дат есть изменения во времени, когда подписка становится просроченной и продлевается как таковая:
имя пользователя | название_событий_подписки | временная_метка_событий_подписки |
---|---|---|
A | подписка_неудалась | 2021-01-08 |
A | подписка_просрочена | 2021-01-08 |
A | подписка_просрочена | 2021-01-15 |
A | подписка_успешно_оплачена | 2021-01-16 |
A | подписка_продлена | 2021-01-16 |
Допустим, клиент переходит в статус просроченной подписки, а через 15 дней его подписка полностью оплачивается, и он переходит в активный статус. Я хочу сохранить это значение в новом столбце дни_просрочки
:
имя пользователя | название_событий_подписки | временная_метка_событий_подписки | дни_просрочки |
---|---|---|---|
A | подписка_неудалась | 2021-01-08 | 0 |
A | подписка_просрочена | 2021-01-08 | 0 |
A | подписка_просрочена | 2021-01-15 | 7 |
A | подписка_успешно_оплачена | 2021-01-16 | 0 |
A | подписка_продлена | 2021-01-16 | 0 |
Я создал расширяющееся окно для этого, но оно учитывает только значения название_событий_подписки
. Как я могу изменить этот код или создать новый код, чтобы достичь этого?
df['дни_просрочки'] = df.groupby([
'имя пользователя',
'название_событий_подписки')[['временная_метка_событий_подписки']].transform(lambda x: x.expanding().count())
df.sort_values(by=['временная_метка_событий_подписки'])
Я думаю, вы можете использовать другой подход, я предлагаю этот:
-
Преобразуйте в
datetime
столбецвременная_метка_событий_подписки
.df['временная_метка_событий_подписки'] = df['временная_метка_событий_подписки'].apply(lambda date: pd.to_datetime(date, format="%Y-%m-%d"))
-
Используя
.diff()
метод, вы можете получить разницу между текущей датой и датой непосредственно ниже, как только вы получите разницу, вы можете использоватьdt.days
, чтобы выразить это в днях.df['дни_просрочки'] = df.groupby(['имя пользователя', 'название_событий_подписки'])['временная_метка_событий_подписки'].diff().dt.days
-
Используя
fillna()
метод, вы можете заменить значения NaN, полученные на предыдущем шаге, на0
df['дни_просрочки'].fillna(0, inplace=True)
Результат:
имя пользователя | название_событий_подписки | временная_метка_событий_подписки | дни_просрочки | |
---|---|---|---|---|
0 | A | подписка_неудалась | 2021-01-08 | 0.0 |
1 | A | подписка_просрочена | 2021-01-08 | 0.0 |
2 | A | подписка_просрочена | 2021-01-15 | 7.0 |
3 | A | подписка_успешно_оплачена | 2021-01-16 | 0.0 |
4 | A | подписка_продлена | 2021-01-16 | 0.0 |
Ответ или решение
Как вычислить количество дней просрочки между событиями выставления счета
В этой статье мы обсудим, как вычислить общее количество дней просрочки между событиями выставления счета в Pandas DataFrame, который фиксирует события подписки пользователей. С помощью пошагового подхода вы сможете добавить новую колонку, показывающую дни просрочки в зависимости от событий подписки.
Шаг 1: Подготовка данных
Предположим, у вас есть DataFrame следующего вида:
username | subscription_events_name | subscription_events_timestamp |
---|---|---|
A | subscription_charged_unsuccess | 2021-01-08 |
A | subscription_past_due | 2021-01-08 |
A | subscription_past_due | 2021-01-15 |
A | subscription_charged_successfully | 2021-01-16 |
A | subscription_renew | 2021-01-16 |
Чтобы начать, убедитесь, что колонка subscription_events_timestamp
имеет формат datetime. Это можно сделать с помощью функции pd.to_datetime()
:
import pandas as pd
# Пример данных
data = {
'username': ['A', 'A', 'A', 'A', 'A'],
'subscription_events_name': [
'subscription_charged_unsuccess',
'subscription_past_due',
'subscription_past_due',
'subscription_charged_successfully',
'subscription_renew'
],
'subscription_events_timestamp': [
'2021-01-08',
'2021-01-08',
'2021-01-15',
'2021-01-16',
'2021-01-16'
]
}
df = pd.DataFrame(data)
df['subscription_events_timestamp'] = pd.to_datetime(df['subscription_events_timestamp'])
Шаг 2: Вычисление дней просрочки
Для вычисления дней просрочки мы будем использовать метод .diff()
для получения разности между текущей датой и предыдущей. Применим это к событиям, которые нас интересуют:
# Перебираем события и вычисляем дни просрочки
def calculate_days_past_due(group):
group['days_past_due'] = group['subscription_events_timestamp'].diff().dt.days
return group
# Применяем функцию
df = df.groupby('username').apply(calculate_days_past_due)
# Заменяем NaN на 0
df['days_past_due'] = df['days_past_due'].fillna(0)
Шаг 3: Обработка результата
В результате у вас будет новый DataFrame с добавленным столбцом days_past_due
, который покажет количество дней, прошедших с момента предыдущего события. Убедитесь, что вы обрабатываете данные правильно и в соответствии с вашей бизнес-логикой.
Вот как будет выглядеть итоговый DataFrame:
username | subscription_events_name | subscription_events_timestamp | days_past_due |
---|---|---|---|
A | subscription_charged_unsuccess | 2021-01-08 | 0.0 |
A | subscription_past_due | 2021-01-08 | 0.0 |
A | subscription_past_due | 2021-01-15 | 7.0 |
A | subscription_charged_successfully | 2021-01-16 | 0.0 |
A | subscription_renew | 2021-01-16 | 0.0 |
Заключение
Таким образом, используя Pandas, вы можете эффективно вычислить количество дней просрочки между событиями подписки. Данный метод позволяет динамически отслеживать изменения в статусе подписки и адаптировать ваши бизнес-процессы в зависимости от данных, которые вы собираете. Это пригодится вам для анализа ключевых показателей, таких как уровень удержания клиентов и эффективность процесса выставления счетов.