2016-07-15 4 views
2

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

import pandas as pd 

first_salesman = pd.Series([1, 2, 3], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')]) 
second_salesman = pd.Series([2, 0, 5], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')]) 
third_salesman = pd.Series([6, 7, 1], index=[pd.to_datetime('2015-01-01'), pd.to_datetime('2015-01-02'), pd.to_datetime('2015-01-03')]) 

df = pd.concat([first_salesman, second_salesman, third_salesman], axis=1).reset_index() 
df = pd.melt(df, id_vars=['index'], value_vars=[0, 1, 2]) 
df.columns = ['Date', 'Salesman_id', 'Sales'] 
df = df.set_index('Date') 

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

Так что сосредоточиться на продавце 1 и только в среднем, это будет [1, 1.5, 2].

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

ответ

0

После некоторых мастерингов я нашел решение. В Pandas> = 0.18 вы можете использовать df.expanding(). См. documentation.

Чистое решение этого сценария это один вкладыш:

df.set_index(['Salesman_id', 'Date']).expanding(min_periods=1).agg([np.mean, np.std, np.min, np.max]) 

Обратите внимание, что .expanding() полностью поддерживает .agg(), так что вы можете использовать любые агрегаты вы хотите.

Смежные вопросы