#python #pandas #datetime
#python #панды #дата и время
Вопрос:
Я провожу когортный анализ, основанный на последнем квартале срока подписки (т. Е. Когорты организованы по кварталу истечения срока действия вашего первого контракта).
Я пытаюсь создать периоды для моего когортного анализа, вычитая квартал когорт клиентов из их последнего квартала истечения срока действия. Другими словами, я хочу знать, сколько кварталов прошло с момента их первого квартала истечения срока действия до последнего квартала истечения срока действия.
Я попробовал прямое вычитание
df_cohort = all_time.groupby(['Cohort', 'End Quarter']).agg({'Account Name':'nunique'})
.reset_index(drop=False)
df_cohort['period_number'] = (df_cohort['End Quarter'] - df_cohort.Cohort)
df_cohort
В результате получается значение QuarterEnd, содержащее ответ, который я ищу (целое число разности четвертей).
Cohort End Quarter Account Name period_number
0 2015Q1 2015Q1 13 <0 * QuarterEnds: startingMonth=12>
1 2015Q1 2015Q3 1 <2 * QuarterEnds: startingMonth=12>
2 2015Q1 2018Q4 1 <15 * QuarterEnds: startingMonth=12>
3 2015Q1 2019Q2 1 <17 * QuarterEnds: startingMonth=12>
4 2015Q1 2019Q3 1 <18 * QuarterEnds: startingMonth=12>
5 2015Q1 2020Q1 3 <20 * QuarterEnds: startingMonth=12>
В то время как я действительно хочу этого:
Cohort End Quarter Account Name period_number
0 2015Q1 2015Q1 13 0
1 2015Q1 2015Q3 1 2
2 2015Q1 2018Q4 1 15
3 2015Q1 2019Q2 1 17
4 2015Q1 2019Q3 1 18
5 2015Q1 2020Q1 3 20
Все попытки, которые я предпринял, чтобы получить простое целое число из этого вычисления, потерпели неудачу. Любая помощь будет с благодарностью!
Ответ №1:
Возможно, это не самый элегантный способ сделать это, но вы избавляетесь от необходимости определять даты и так далее. Я создал df только для этой проблемы:
dfq = pd.read_csv(r"C:/users/k_sego/quarter.csv",sep=";")
print(dfq)
который выглядит так
Cohort EndQuarter
0 2015Q1 2015Q1
1 2015Q1 2015Q3
2 2015Q1 2018Q4
3 2015Q1 2019Q2
4 2015Q1 2019Q3
5 2015Q1 2020Q1
Я извлекаю кварталы из каждого столбца даты в новый столбец и отслеживаю, откуда они берутся, а также год. Не забудьте преобразовать в числовое.
dfq['CohortQ'] = dfq.Cohort.str.slice(5,6)
dfq['EndQuarterQ'] = dfq.EndQuarter.str.slice(5,6)
dfq['CohortYear'] = dfq.Cohort.str.slice(0,4)
dfq['EndQuarterYear'] = dfq.EndQuarter.str.slice(0,4)
cols = dfq.columns.drop(['Cohort','EndQuarter'])
dfq[cols] = dfq[cols].apply(pd.to_numeric, errors='coerce')
Теперь разница между годами, умноженными на 4, равна номеру квартала, но к этому вам нужно добавить разницу между кварталами, в которых были годы.
dfq['CountQuarters'] = (dfq['EndQuarterYear']-dfq['CohortYear'])*4 (dfq['EndQuarterQ']-dfq['CohortQ'])
что дает
Cohort EndQuarter CohortQ EndQuarterQ CohortYear EndQuarterYear
0 2015Q1 2015Q1 1 1 2015 2015
1 2015Q1 2015Q3 1 3 2015 2015
2 2015Q1 2018Q4 1 4 2015 2018
3 2015Q1 2019Q2 1 2 2015 2019
4 2015Q1 2019Q3 1 3 2015 2019
5 2015Q1 2020Q1 1 1 2015 2020
CountQuarters
0 0
1 2
2 15
3 17
4 18
5 20
Комментарии:
1. Спасибо! Элегантный или неэлегантный, это сделало свое дело.
2. Рад, что вам это пригодилось.
3. Примите (проверьте) и отметьте ответ, чтобы он больше не отображался как открытый.