Расчет средней суммы задолженности для клиентов, живущих в последовательные месяцы во временном ряду - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть фрейм данных, который суммирует сумму в долларах, которую клиент имеет на своем счете в течение определенного месяца.Если у клиента нет денег, сумма просто равна 0. Фрейм данных выглядит следующим образом:

Customer    A       B       C       D       E        F   
11/30/2015  0       1,000   0       0       5,000    0   
12/31/2015  2,133   1,000   0       3,000   5,000    2,000
1/31/2016   2,133   0       0       3,000   5,000    2,000
2/29/2016   2,133   2,000   4,000   3,000   5,000    2,000
3/31/2016   2,133   2,000   4,000   0       10,000   2,000
4/30/2016   0       2,000   4,000   0       10,000   0   
5/31/2016   0       2,000   4,000   0       10,000   0  

Когда клиент жив, у него есть номинальная сумма на его счете за определенный месяц.Точно так же, если они живут в следующем месяце (или любом месяце), у них также есть номинальная сумма за этот месяц.

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

Я пытаюсь провести некоторый анализ удержания клиентов, и поэтому мне нужна средняя сумма задолженности клиентов в этом месяце,для клиентов, которые жили в предыдущем месяце также.

Полученный кадр данных будет выглядеть так:

Customer    A       B       C       D       E        F       Avg Outstanding consecutive Months
11/30/2015  0       1,000   0       0       5,000    0       0
12/31/2015  2,000   1,000   0       3,000   5,000    2,000   3,000
1/31/2016   2,000   0       0       3,000   5,000    2,000   3,000
2/29/2016   2,000   2,000   4,000   3,000   5,000    2,000   3,000
3/31/2016   2,000   2,000   4,000   0       10,000   2,000   4,000
4/30/2016   0       2,000   4,000   0       10,000   0       5,333
5/31/2016   0       2,000   4,000   0       10,000   0       5,333

1 Ответ

0 голосов
/ 20 сентября 2018

сначала преобразуйте ваши данные в форму, читаемую на python, удалив ',' и преобразовав в целые числа

df.set_index(['Customer'],inplace=True)
df = pd.DataFrame(df.apply(' '.join,axis=1).str.replace(',', '').str.split(expand=False).tolist(),columns=df.columns,index=df.index).astype(int)

Теперь проверьте условие, равно ли значение 0, и сдвиньте фрейм данных, теперь вы можете взять отрицательныйлогического фрейма данных, который будет иметь только живые примеры

df  = df[~df.eq(0).shift().fillna(False)].fillna(0)

Out: маскированный фрейм данных

             A    B    C      D    E     F
Customer                        
11/30/2015  0.0 1000.0  0.0 0.0 5000    0.0
12/31/2015  0.0 1000.0  0.0 0.0 5000    0.0
1/31/2016   2133.0  0.0 0.0 3000.0  5000    2000.0
2/29/2016   2133.0  0.0 0.0 3000.0  5000    2000.0
3/31/2016   2133.0  2000.0  4000.0  0.0 10000   2000.0
4/30/2016   0.0 2000.0  4000.0  0.0 10000   0.0
5/31/2016   0.0 2000.0  4000.0  0.0 10000   0.0

Теперь вы можете вывести среднее значение из фрейма данных по оси 1 только с действительными значениями

df1['Avg Outstanding'] = df1.apply(lambda x: sum(x)/x.ne(0).sum(),1).astype(int)

Out:

              A       B       C     D        E      F   Avg Outstanding
Customer                            
11/30/2015  0.0     1000.0   0.0    0.0     5000    0.0     3000
12/31/2015  0.0     1000.0   0.0    0.0     5000    0.0     3000
1/31/2016   2133.0  0.0      0.0   3000.0   5000   2000.0   3033
2/29/2016   2133.0  0.0      0.0   3000.0   5000   2000.0   3033
3/31/2016   2133.0  2000.0  4000.0  0.0    10000   2000.0   4026
4/30/2016   0.0     2000.0  4000.0  0.0    10000    0.0     5333
5/31/2016   0.0     2000.0  4000.0  0.0    10000    0.0     5333
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...