这里,我们创建了max_change函数,它有两个参数,一个是待分析的数据源(df),一个是细分项(rows),例如部门或类目。函数内部的操作与之前的代码完全一致。有了这个函数,我们只要给到数据源和细分项,就能得到影响最大的细分项。
细心的读者一定发现这里还有一个问题没有解决,那就是日期:这里日期是写死的,并不能根据每天的日期来自动更新,显然不符合自动化的原则。
datetime模块可以解决这个问题。我们来认识下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函数也相应地写成:
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]
如果我们想要知道对整体影响最大的部门是什么,可以这样来调用函数:
result=max_change(df, 'department')
如果我们要知道影响最大的部门下哪个类目影响最大,可以这样来调用函数:
result_lm=max_change(df[df['department']==result.index[0]],'item_cats')
result.index会返回影响最大的部门的名称的列表,通过列表索引来引用它们。由于有多个部门,这里我们需要用for循环来遍历列表,最后将每次遍历返回的数据框合并:
def max_lm(result,df): frames=[] for i in range(len(result)): result_lm=max_change(df[df['department']==result.index[i]],'item_cats'