2016-07-15 85 views
2

我有一個包含歷史記錄的數據框,例如銷售額。有效計算曆史總計

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') 

我想計算每個銷售人員的歷史統計數據:在其他方面,對於每個業務員的每一天,我想知道他們的意思,STD,最大值,最小值,等等。看起來像直到那一天。

因此,關注於推銷員1,只有平均水平,它會是[1,1.5,2]。

我當然可以建立for-loop,但我有相當多的推銷員和日期,這看起來不是最有效率的事情。我正在尋找的是一種有效的方式來計算這一點。

回答

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(),所以你可以使用任何彙總你想。