Подсчет количества последовательных двоичных индикаторов во временном ряду - 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 за этот месяц.

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

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

COUNTIFS(B1:TE1,1,B2:TE2,1)

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

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

Ответы [ 2 ]

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

С rolling:

>>> (df.rolling(2).sum() == 2).sum(1)
0    0
1    2
2    3
3    2
4    6
5    5
6    6
dtype: int64

# df['Customers_live_consecutive_months'] = (df.rolling(2).sum() == 2).sum(1)
0 голосов
/ 11 сентября 2018

Вы можете сделать с shift

((df.shift()==1)&(df.shift()==df)).sum(1)
Out[80]: 
0    0
1    2
2    3
3    2
4    6
5    5
6    6
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...