這里,我們創(chuàng)建了max_change函數(shù),它有兩個(gè)參數(shù),一個(gè)是待分析的數(shù)據(jù)源(df),一個(gè)是細(xì)分項(xiàng)(rows),例如部門或類目。函數(shù)內(nèi)部的操作與之前的代碼完全一致。有了這個(gè)函數(shù),我們只要給到數(shù)據(jù)源和細(xì)分項(xiàng),就能得到影響最大的細(xì)分項(xiàng)。
細(xì)心的讀者一定發(fā)現(xiàn)這里還有一個(gè)問(wèn)題沒(méi)有解決,那就是日期:這里日期是寫死的,并不能根據(jù)每天的日期來(lái)自動(dòng)更新,顯然不符合自動(dòng)化的原則。
datetime模塊可以解決這個(gè)問(wèn)題。我們來(lái)認(rèn)識(shí)下datetime如何處理日期。
In [1]: today=datetime.date.today()In [2]: print today2016-11-23In [3]: today.ctime()Out[3]: 'Wed Nov 23 00:00:00 2016'In [4]: today.timetuple()Out[4]: time.struct_time(tm_year=2016, tm_mon=11, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=328, tm_isdst=-1)In [5]: today.toordinal()Out[5]: 736291In [6]: today.yearOut[6]: 2016In [7]: today.monthOut[7]: 11In [8]: today.dayOut[8]: 23
因此,今天、昨天和前天的寫法如下:
today="%s"%(datetime.date.today())yesterday="%s"%(datetime.date.today()-datetime.timedelta(days=1))qiantian="%s"%(datetime.date.today()-datetime.timedelta(days=2))
max_change函數(shù)也相應(yīng)地寫成:
def max_change(df, rows): df_pivot=df.pivot_table('income',index=rows,columns='date',aggfunc='sum') df_pivot['change_amt']=df_pivot[qiantian]-df_pivot[yesterday] df_pivot['change_pct']=abs(df_pivot['change_amt']/df_pivot['change_amt'].sum()) return df_pivot[df_pivot['change_pct']>=0.1]
如果我們想要知道對(duì)整體影響最大的部門是什么,可以這樣來(lái)調(diào)用函數(shù):
result=max_change(df, 'department')
如果我們要知道影響最大的部門下哪個(gè)類目影響最大,可以這樣來(lái)調(diào)用函數(shù):
result_lm=max_change(df[df['department']==result.index[0]],'item_cats')
result.index會(huì)返回影響最大的部門的名稱的列表,通過(guò)列表索引來(lái)引用它們。由于有多個(gè)部門,這里我們需要用for循環(huán)來(lái)遍歷列表,最后將每次遍歷返回的數(shù)據(jù)框合并:
def max_lm(result,df): frames=[] for i in range(len(result)): result_lm=max_change(df[df['department']==result.index[i]],'item_cats'