Расчет подвижного квартала с использованием панд в питоне (Альтернатива?) - PullRequest
0 голосов
/ 30 мая 2018

Дата, Марка, Индикация, Geo, Тип и значения являются именами столбцов В настоящее время вычисляется скользящий квартал с использованием функции и метки даты и времени, использованного ниже кода, является следующим, выполнение кода занимает некоторое времяесть ли способ изменить или изменить код RQ столбец добавлен столбец скользящей четверти ..

 import pandas as pd
 from pandas import ExcelWriter
 from pandas import ExcelFile
 import datetime

#***Date parsing using datetime.stptime function***
dateparse = lambda x: pd.datetime.strptime(x, '%m/%d/%Y')
df = pd.read_csv('Demo for MAt.csv', index_col=0,
             parse_dates=['Date'], date_parser=dateparse)
## importing data from csv file as dataframe
#Function to calculate the rolling sum for each record by date and other 
  levels

def RQ(x):
    ##Function checks whether the date is falling in the previous 3 months range 
    ##and sums up if it is in the range**
    RQS = df['Value'][
          (df.index >= x.name - datetime.timedelta(days = 62)) 
        & (df.index <= x.name) 
        & (df['Brand'] == x[0]) 
        & (df['Indication'] == x[1])
        & (df['Geo'] == x[2]) 
        & (df['Type'] == x[3])
    ]
    return RQS.sum()

##For each row the calculation is done using the apply function**
df['RQ'] = df.apply(RQ, axis=1)


#the below data frames has the input and expected output for a sample
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
inputdf = pd.DataFrame([['04/01/2016', 1,'A','National','Value',10], 
['05/01/2016', 1,'A','National','Value',20], ['06/01/2016', 
1,'A','National','Value',30]], columns=['Date', 
'Brand','Indication','Geo','Type','Value'])
print inputdf
outputdf = pd.DataFrame([['04/01/2016', 1,'A','National','Value',10,10], 
['05/01/2016', 1,'A','National','Value',20,30], ['06/01/2016', 
1,'A','National','Value',30,60]], columns=['Date', 
'Brand','Indication','Geo','Type','Value','RQ'])
print outputdf
#Input**Below input**
       Date  Brand Indication       Geo   Type  Value
0  04/01/2016      1          A  National  Value     10
1  05/01/2016      1          A  National  Value     20
2  06/01/2016      1          A  National  Value     30
## Expected output
       Date  Brand Indication       Geo   Type  Value  RQ
0  04/01/2016      1          A  National  Value     10  10
1  05/01/2016      1          A  National  Value     20  30
2  06/01/2016      1          A  National  Value     30  60

1 Ответ

0 голосов
/ 30 мая 2018

преобразовать столбец Date в тип отметки времени, если это еще не сделано, и установить его в качестве индекса

df.Date = pd.to_datetime(df.Date)
df = df.set_index('Date')

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

DataFrame.rolling может создавать временные окна и по умолчанию использует индекс для управления окнами.укажите 62D для размера окна, как вы сделали в своей попытке.

df['RQ'] = df.groupby(list(df.columns[:-1].values)).Value.apply(lambda x: x.rolling('62D').sum())

Это выводит (с примерами данных):

            Brand Indication       Geo   Type  Value    RQ
Date
2016-04-01      1          A  National  Value     10  10.0
2016-05-01      1          A  National  Value     20  30.0
2016-06-01      1          A  National  Value     30  60.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...