摘要:收入的波動來自于不同部門或類目的收入漲跌。我們的目標是利用實現收入波動的分析模型。有了這個函數,我們只要給到數據源和細分項,就能得到影響最大的細分項。我們來認識下如何處理日期。
環境準備:sublime+ipython
打開代碼編輯器sublime——本質上,txt文本編輯器也可以寫代碼,并保存為以.py為后綴的python文件,但專業的代碼編輯器可以實現語法高亮、自動補全等功能,并支持項目管理,大大提高編寫代碼的效率和代碼的管理。因此,選擇一款合適的代碼編輯器便不可少
打開終端并進入ipython模式——ipython可以幫助我進行探索和試誤,利用魔術命令%paste(執行剪貼板中的python代碼)更是可以幫助我快速查看某段代碼的執行效果
如果說普通的代碼編輯器支持的是“編輯-編譯-運行”的工作模式,那么ipython鼓勵的則是“執行-探索”的工作模式。
開始寫代碼分析任務:一家電商公司的收入來自不同的部門,每個部門下又有不同的商品類目。收入的波動來自于不同部門或類目的收入漲跌。為了快速定位每天的收入波動來自哪個部門以及哪個類目,需要搭建模型進行自動化分析。
我們的目標是利用python實現收入波動的分析模型(Analysis Model for Income Fluctuation)。
首先,我們需要清晰定義實現最終目標的每個步驟。
計算各個部門的收入變化值(觀察日收入-對比日收入)以及整體的收入變化值;
計算各個部門收入變化值占比整體收入變化值的比例,取絕對值;其中,占比最大的就是對整體收入變化影響最大的部門,可以取經驗值10%,即占比大于10%的部門就是對整體收入變化影響最大的部門;
計算上述步驟得到的影響最大的部門下每個類目收入變化值和每個部門的收入變化值;
計算每個類目收入變化值占比部門整體收入變化值的比例,取絕對值,找出影響最大的類目。
現在我們用python來實現上述步驟:
導入所需模塊和數據:
import pandas as pd df=pd.read_excel("/Users/xiangzhendong/Downloads/income_data.xls")
利用數據框(dataframe)的透視表(pivot_table)方法按部門聚合昨日和前日的收入數據:
df_pivot=df.pivot_table("income",index="department",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())
此時,我們的df_pivot數據框多了change_amt和change_pct兩列。如果我們要選出change_pct大于10%的部門,可以這樣寫:
result=df_pivot[df_pivot["change_pct"]>=0.1]
對整體變化影響最大部門已經找出來了,接下來尋找每個部門下對部門整體變化影響最大的類目。不難發現,尋找的邏輯其實是一模一樣的。在編寫代碼的過程中,我們要注意識別做事的模式,創造工具簡化同類操作。
此時,我們可以創建一個尋找對整體變化影響最大的成分的函數:
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]
這里,我們創建了max_change函數,它有兩個參數,一個是待分析的數據源(df),一個是細分項(rows),例如部門或類目。函數內部的操作與之前的代碼完全一致。有了這個函數,我們只要給到數據源和細分項,就能得到影響最大的細分項。
細心的讀者一定發現這里還有一個問題沒有解決,那就是日期:這里日期是寫死的,并不能根據每天的日期來自動更新,顯然不符合自動化的原則。
datetime模塊可以解決這個問題。我們來認識下datetime如何處理日期。
In [1]: today=datetime.date.today() In [2]: print today 2016-11-23 In [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]: 736291 In [6]: today.year Out[6]: 2016 In [7]: today.month Out[7]: 11 In [8]: today.day Out[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") result_lm["department"]=result.index[i] #將部門名稱添加到數據框中 frames.append(result_lm) return pd.concat(frames)
調用上述函數得到每個部門下影響最大的類目:
final=max_lm(result,df)
如果我們想把結果導出到excel表中,可以這樣寫:
writer=pd.ExcelWriter("output_today.xlsx") result.to_excel(writer, sheet_name="max_departments") final.to_excel(writer, sheet_name="max_itemcats") writer.save()總結
準備好python開發環境,即 “代碼編輯器+ipython”;
寫代碼前清晰定義實現最終目標的每個步驟;
寫代碼的過程中識別做事的模式,創造工具簡化復用性操作;
利用for循環遍歷列表。
最終代碼import pandas as pd import datetime today="%s"%(datetime.date.today()) yesterday="%s"%(datetime.date.today()-datetime.timedelta(days=1)) qiantian="%s"%(datetime.date.today()-datetime.timedelta(days=2)) print("昨天和前天的日期分別是:") print(yesterday,qiantian) df=pd.read_excel("/Users/xiangzhendong/Downloads/income_data.xls") def max_change(df, rows): df_pivot=df.pivot_table("income",index=rows,columns="date",aggfunc="sum") df_pivot["change_amt"]=df_pivot[yesterday]-df_pivot[qiantian] 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") print(result) def max_lm(result,df): frames=[] for i in range(len(result)): result_lm=max_change(df[df["department"]==result.index[i]],"itemcats") result_lm["department"]=result.index[i] frames.append(result_lm) return pd.concat(frames) final=max_lm(result, df) print(final) writer=pd.ExcelWriter("output_today.xlsx") result.to_excel(writer, sheet_name="max_departments") final.to_excel(writer, sheet_name="max_itemcats") writer.save()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44291.html
摘要:基于大量的數據統計,網球是一種很好的預測類體育項目。數據科學家根據歷史數據和玩家信息來構建預測模型,并將結果與博彩公司的評估進行比較。目標是找出機器學習模型與博彩公司評估之間的差距,從而有機會獲勝。這是一個很好的實際數據科學項目。 作者:chen_h微信號 & QQ:862251340微信公眾號:coderpai簡書地址:https://www.jianshu.com/p/56c......
摘要:再平衡策略基本就是以固定收益為標準,圍繞其做波動,而波動的影響就是股市的漲跌。 賺錢是個俗氣的話題,但又是人人都繞不開的事情。我今天來 科學 地觸碰下這個話題。 談賺錢,就會談到理財、投資,談到炒股。有這樣一個笑話: 問:如何成為百萬富翁? 答:帶一千萬進入股市。 那么你有沒有炒過股?有沒有虧過錢? 股市雖然是個充滿造富神話的地方,但對于大部分參與者來說,風險都是極高的,所謂 七...
摘要:對于大數據而言,數據量沒有一定的要求,只要足夠得出可靠的結論即可。與大數據相關的職業隨著市場對大數據相關需求的增加,與之相關的職業需求數量也在上升。 摘要: 本文從基本概念、行業趨勢、學習途徑等幾個方面介紹了大數據的相關內容,適合對大數據感興趣的讀者作為入門材料閱讀。 隨著科技的發展,目前已經步入了大數據的時代,很多社交媒體和互聯網公司也非常關注大數據這一行業。那么對于大數據而言,這里...
摘要:問深度學習社區現在面臨的主要挑戰是什么答打擊炒作發展倫理意識獲得科學嚴謹性。深度學習簡直是科學的重災區。 Keras之父、谷歌大腦人工智能和深度學習研究員Fran?ois Chollet撰寫了一本深度學習Python教程實戰書籍《Python深度學習》,書中介紹了深度學習使用Python語言和強大Keras庫,詳實新穎。近日,Fran?ois Chollet接受了采訪,就深度學習到底是什么、...
閱讀 1142·2019-08-30 12:44
閱讀 647·2019-08-29 13:03
閱讀 2557·2019-08-28 18:15
閱讀 2423·2019-08-26 10:41
閱讀 3087·2019-08-26 10:28
閱讀 3035·2019-08-23 16:54
閱讀 1988·2019-08-23 15:16
閱讀 812·2019-08-23 14:55