環(huán)境準(zhǔn)備:sublime+ipython
打開(kāi)代碼編輯器sublime——本質(zhì)上,txt文本編輯器也可以寫(xiě)代碼,并保存為以.py為后綴的python文件,但專業(yè)的代碼編輯器可以實(shí)現(xiàn)語(yǔ)法高亮、自動(dòng)補(bǔ)全等功能,并支持項(xiàng)目管理,大大提高編寫(xiě)代碼的效率和代碼的管理。因此,選擇一款合適的代碼編輯器便不可少
打開(kāi)終端并進(jìn)入ipython模式——ipython可以幫助我進(jìn)行探索和試誤,利用魔術(shù)命令%paste(執(zhí)行剪貼板中的python代碼)更是可以幫助我快速查看某段代碼的執(zhí)行效果
如果說(shuō)普通的代碼編輯器支持的是“編輯-編譯-運(yùn)行”的工作模式,那么ipython鼓勵(lì)的則是“執(zhí)行-探索”的工作模式。
開(kāi)始寫(xiě)代碼
分析任務(wù):一家電商公司的收入來(lái)自不同的部門(mén),每個(gè)部門(mén)下又有不同的商品類目。收入的波動(dòng)來(lái)自于不同部門(mén)或類目的收入漲跌。為了快速定位每天的收入波動(dòng)來(lái)自哪個(gè)部門(mén)以及哪個(gè)類目,需要搭建模型進(jìn)行自動(dòng)化分析。
我們的目標(biāo)是利用python實(shí)現(xiàn)收入波動(dòng)的分析模型(Analysis Model for Income Fluctuation)。
首先,我們需要清晰定義實(shí)現(xiàn)最終目標(biāo)的每個(gè)步驟。
計(jì)算各個(gè)部門(mén)的收入變化值(觀察日收入-對(duì)比日收入)以及整體的收入變化值;
計(jì)算各個(gè)部門(mén)收入變化值占比整體收入變化值的比例,取絕對(duì)值;其中,占比最大的就是對(duì)整體收入變化影響最大的部門(mén),可以取經(jīng)驗(yàn)值10%,即占比大于10%的部門(mén)就是對(duì)整體收入變化影響最大的部門(mén);
計(jì)算上述步驟得到的影響最大的部門(mén)下每個(gè)類目收入變化值和每個(gè)部門(mén)的收入變化值;
計(jì)算每個(gè)類目收入變化值占比部門(mén)整體收入變化值的比例,取絕對(duì)值,找出影響最大的類目。
現(xiàn)在我們用python來(lái)實(shí)現(xiàn)上述步驟:
導(dǎo)入所需模塊和數(shù)據(jù):
import pandas as pddf=pd.read_excel('/Users/xiangzhendong/Downloads/income_data.xls')
利用數(shù)據(jù)框(dataframe)的透視表(pivot_table)方法按部門(mén)聚合昨日和前日的收入數(shù)據(jù):
df_pivot=df.pivot_table('income',index='department',columns='date',aggfunc='sum')
計(jì)算每個(gè)部門(mén)的收入變化值以及每個(gè)部門(mén)的變化值占比整體變化值的比例:
df_pivot['change_amt']=df_pivot['2016-11-16']-df_pivot['2016-11-15']df_pivot['change_pct']=abs(df_pivot['change_amt']/df_pivot['change_amt'].sum())
此時(shí),我們的df_pivot數(shù)據(jù)框多了change_amt和change_pct兩列。如果我們要選出change_pct大于10%的部門(mén),可以這樣寫(xiě):
result=df_pivot[df_pivot['change_pct']>=0.1]
對(duì)整體變化影響最大部門(mén)已經(jīng)找出來(lái)了,接下來(lái)尋找每個(gè)部門(mén)下對(duì)部門(mén)整體變化影響最大的類目。不難發(fā)現(xiàn),尋找的邏輯其實(shí)是一模一樣的。在編寫(xiě)代碼的過(guò)程中,我們要注意識(shí)別做事的模式,創(chuàng)造工具簡(jiǎn)化同類操作。
此時(shí),我們可以創(chuàng)建一個(gè)尋找對(duì)整體變化影響最大的成分的函數(shù):
def max_change(df, rows): df_pivot=df.pivot_table('income',index=rows,columns='date',aggfunc='sum') df_pivot['change_amt']=df_pivot['2016-11-16']-df_pivot['2016-11-15'] df_pivot['change_pct']=abs(df_pivot['change_amt']/df_pivot['change_amt'].sum()) return df_pivot[df_pivot['change_pct']>=0.1