Подсчет количества первых двоичных индикаторов во временном ряду - PullRequest
0 голосов
/ 11 сентября 2018

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

Customer    A   B   C   D   E   F   G   H   I   J
11/30/2015  1   0   1   0   0   1   1   0   0   0
12/31/2015  0   1   0   1   0   1   1   0   0   1
1/31/2016   0   0   0   0   0   1   1   0   0   1
2/29/2016   1   1   1   1   1   1   0   1   1   1
3/31/2016   1   1   0   1   1   0   1   1   0   1
4/30/2016   0   1   1   1   0   1   1   1   0   1
5/31/2016   1   1   1   1   1   1   0   1   0   1

Когда клиент впервые становится активным, он получает 1 за конкретный месяц.Поэтому, когда у конкретного клиента есть его первая 1, это месяц, в котором они являются «новыми».

Я хочу добавить столбец в конце информационного кадра, который подсчитывает количество «новых» клиентов.

Я думаю, что наиболее эффективным способом сделать это было бы суммирование значений от строки 0 до строки i и подсчет количества раз, когда сумма равна 1. Когда эта сумма больше 1, тогда клиентбудет жить в течение 2 месяцев и не будет новым клиентом в данном месяце.

Я рассчитал это в Excel, используя этот метод, но мне не ясно, как это сделать в Python.

Результирующий кадр данных будет выглядеть так:

Customer    A   B   C   D   E   F   G   H   I   J   New_Customers
11/30/2015  1   0   1   0   0   1   1   0   0   0   4
12/31/2015  0   1   0   1   0   1   1   0   0   1   3
1/31/2016   0   0   0   0   0   1   1   0   0   1   0
2/29/2016   1   1   1   1   1   1   0   1   1   1   3
3/31/2016   1   1   0   1   1   0   1   1   0   1   0
4/30/2016   0   1   1   1   0   1   1   1   0   1   0
5/31/2016   1   1   1   1   1   1   0   1   0   1   0

Ответы [ 2 ]

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

Определяя пользовательскую функцию new и используя DataFrame.expanding. Я не уверен, почему результат expanding().apply(new) требует приведения от float к int, но эй, это работает:

def new(column):
    return column[-1] and not any(column[:-1])

result = df.expanding().apply(new).sum(axis=1).astype(int)

print(result)

Out:
11/30/2015    4
12/31/2015    3
1/31/2016     0
2/29/2016     3
3/31/2016     0
4/30/2016     0
5/31/2016     0
dtype: int32
0 голосов
/ 11 сентября 2018

Вы можете применить кумулятивный максимум, который может пересылать «1» каждого столбца и суммировать все столбцы на оси 1 и вычислять разницу.Первое значение задается нулем, которое можно заполнить суммированием первой строки

df1 = df[df.columns.difference(['Customer'])]
df['New_customers'] = df1.cummax().sum(1).diff().fillna(df1.loc[0].sum())

Out:

Customer    A   B   C   D   E   F   G   H   I   J   New_customers
0   11/30/2015  1   0   1   0   0   1   1   0   0   0   4.0
1   12/31/2015  0   1   0   1   0   1   1   0   0   1   3.0
2   1/31/2016   0   0   0   0   0   1   1   0   0   1   0.0
3   2/29/2016   1   1   1   1   1   1   0   1   1   1   3.0
4   3/31/2016   1   1   0   1   1   0   1   1   0   1   0.0
5   4/30/2016   0   1   1   1   0   1   1   1   0   1   0.0
6   5/31/2016   1   1   1   1   1   1   0   1   0   1   0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...