Есть ли способ вычесть два столбца, содержащих четверти, и вернуть целое число четвертей между ними?

#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. Примите (проверьте) и отметьте ответ, чтобы он больше не отображался как открытый.