Как я могу рассчитать общее количество дней просрочки между событиями выставления счетов?

Вопрос или проблема

Я работаю с 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=['временная_метка_событий_подписки'])

Я думаю, вы можете использовать другой подход, я предлагаю этот:

  1. Преобразуйте в datetime столбец временная_метка_событий_подписки.

    df['временная_метка_событий_подписки'] = df['временная_метка_событий_подписки'].apply(lambda date: pd.to_datetime(date, format="%Y-%m-%d"))
    
  2. Используя .diff() метод, вы можете получить разницу между текущей датой и датой непосредственно ниже, как только вы получите разницу, вы можете использовать dt.days, чтобы выразить это в днях.

    df['дни_просрочки'] = df.groupby(['имя пользователя', 'название_событий_подписки'])['временная_метка_событий_подписки'].diff().dt.days
    
  3. Используя 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, вы можете эффективно вычислить количество дней просрочки между событиями подписки. Данный метод позволяет динамически отслеживать изменения в статусе подписки и адаптировать ваши бизнес-процессы в зависимости от данных, которые вы собираете. Это пригодится вам для анализа ключевых показателей, таких как уровень удержания клиентов и эффективность процесса выставления счетов.

Оцените материал
Добавить комментарий

Капча загружается...