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

Я получил данные с накопленными номерами.Есть ли умный способ обратить накопление данных в обратном порядке, чтобы он у меня был месяц за месяцем и не накладывался друг на друга?

Пример ввода:

 Date    SalesRep    itemA   
 01-12-2017  X        1      
 01-12-2017  Y        0     
 01-12-2017  Z        0   
 01-01-2018  X        1     
 01-01-2018  Y        1     
 01-01-2018  Z        0    
 01-02-2018  X        1    
 01-02-2018  Y        1    
 01-02-2018  Z        1   

Желаемый вывод:

 Date    SalesRep    itemA   
 01-12-2017  X       1      
 01-12-2017  Y       0     
 01-12-2017  Z       0   
 01-01-2018  X       0     
 01-01-2018  Y       1     
 01-01-2018  Z       0    
 01-02-2018  X       0   
 01-02-2018  Y       0    
 01-02-2018  Z       1  

Я использую тот скрипт, который я повторно использовал на форуме.

import pandas as pd
df = pd.read_excel('File.xlsx')

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

df = df.sort_values('Date', ascending=False) # This now sorts in date order

cum_columns = ['itemA']

result = df.merge(
df.groupby('SalesRep')[cum_columns].diff(),
left_index=True, right_index=True, suffixes=['', '_uncum']
).fillna({'{}_uncum'.format(cum_column): df[cum_column] for cum_column in cum_columns})

print(result)

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

РЕДАКТИРОВАТЬ

Используя ответ JohnE, я получаю ошибку, пожалуйста, посмотрите:

    Date              SalesRep  ItemA   itemA_diff
    2018-08-01 00:00:00 John    1        1
    2018-07-01 00:00:00 John    1        0
    2018-06-01 00:00:00 John    0        -1
    2018-05-01 00:00:00 John    0        0
    2018-04-01 00:00:00 John    0        0
    2018-03-01 00:00:00 John    0        0
    2018-02-01 00:00:00 John    0        0
    2018-01-01 00:00:00 John    0        0
    2017-12-01 00:00:00 John    0        0
    2017-11-01 00:00:00 John    0        0
    2017-10-01 00:00:00 John    0        0

Я должен получить

    Date              SalesRep  ItemA   itemA_diff
    2018-08-01 00:00:00 John    1        0
    2018-07-01 00:00:00 John    1        1
    2018-06-01 00:00:00 John    0        0
    2018-05-01 00:00:00 John    0        0
    2018-04-01 00:00:00 John    0        0
    2018-03-01 00:00:00 John    0        0
    2018-02-01 00:00:00 John    0        0
    2018-01-01 00:00:00 John    0        0
    2017-12-01 00:00:00 John    0        0
    2017-11-01 00:00:00 John    0        0
    2017-10-01 00:00:00 John    0        0

Что следует изменить?

1 Ответ

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

Это довольно стандартный вариант использования для объединения groupby и diff, хотя синтаксис может быть довольно хитрым (см. Примечания ниже):

df = df.sort_values('Date')
df['itemA_diff'] = df.groupby('SalesRep')['itemA'].diff()
df['itemA_diff'] = df['itemA_diff'].fillna(df['itemA'])

Результаты:

        Date SalesRep  itemA  itemA_diff
0 2017-01-12        X      1         1.0
1 2017-01-12        Y      0         0.0
2 2017-01-12        Z      0         0.0
3 2018-01-01        X      1         0.0
4 2018-01-01        Y      1         1.0
5 2018-01-01        Z      0         0.0
6 2018-01-02        X      1         0.0
7 2018-01-02        Y      1         0.0
8 2018-01-02        Z      1         1.0

Примечания:

  1. Важно сначала отсортировать по «Дате», а также, чтобы вы преобразовали в правильное время панды с pd.to_datetime по мере необходимости.

  2. Я не уверен, почему, но и «Date», и «itemA» должны быть столбцами, а не индексами. (Я получил странные ошибки при моей первой попытке с «Дата» в индексе)

Альтернативный подход : Вот оригинальный ответ, включенный в запрос @ jezrael, так как он может быть быстрее:

df = df.sort_values(['SalesRep','Date'])
df['itemA_diff'] = df['itemA'].diff()
df['itemA_diff'] = np.where( df.SalesRep == df.shift().SalesRep, 
                             df.itemA_diff, 
                             df.itemA )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...