摘要:收入的波動(dòng)來(lái)自于不同部門(mén)或類(lèi)目的收入漲跌。我們的目標(biāo)是利用實(shí)現(xiàn)收入波動(dòng)的分析模型。有了這個(gè)函數(shù),我們只要給到數(shù)據(jù)源和細(xì)分項(xiàng),就能得到影響最大的細(xì)分項(xiàng)。我們來(lái)認(rèn)識(shí)下如何處理日期。
環(huán)境準(zhǔn)備:sublime+ipython
打開(kāi)代碼編輯器sublime——本質(zhì)上,txt文本編輯器也可以寫(xiě)代碼,并保存為以.py為后綴的python文件,但專(zhuān)業(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)下又有不同的商品類(lèi)目。收入的波動(dòng)來(lái)自于不同部門(mén)或類(lèi)目的收入漲跌。為了快速定位每天的收入波動(dòng)來(lái)自哪個(gè)部門(mén)以及哪個(gè)類(lèi)目,需要搭建模型進(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)的收入變化值(觀(guā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è)類(lèi)目收入變化值和每個(gè)部門(mén)的收入變化值;
計(jì)算每個(gè)類(lèi)目收入變化值占比部門(mén)整體收入變化值的比例,取絕對(duì)值,找出影響最大的類(lèi)目。
現(xiàn)在我們用python來(lái)實(shí)現(xiàn)上述步驟:
導(dǎo)入所需模塊和數(shù)據(jù):
import pandas as pd df=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)整體變化影響最大的類(lèi)目。不難發(fā)現(xiàn),尋找的邏輯其實(shí)是一模一樣的。在編寫(xiě)代碼的過(guò)程中,我們要注意識(shí)別做事的模式,創(chuàng)造工具簡(jiǎn)化同類(lèi)操作。
此時(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]
這里,我們創(chuàng)建了max_change函數(shù),它有兩個(gè)參數(shù),一個(gè)是待分析的數(shù)據(jù)源(df),一個(gè)是細(xì)分項(xiàng)(rows),例如部門(mén)或類(lèi)目。函數(shù)內(nèi)部的操作與之前的代碼完全一致。有了這個(gè)函數(shù),我們只要給到數(shù)據(jù)源和細(xì)分項(xiàng),就能得到影響最大的細(xì)分項(xiàng)。
細(xì)心的讀者一定發(fā)現(xiàn)這里還有一個(gè)問(wèn)題沒(méi)有解決,那就是日期:這里日期是寫(xiě)死的,并不能根據(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 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
因此,今天、昨天和前天的寫(xiě)法如下:
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)地寫(xiě)成:
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ì)整體影響最大的部門(mén)是什么,可以這樣來(lái)調(diào)用函數(shù):
result=max_change(df, "department")
如果我們要知道影響最大的部門(mén)下哪個(gè)類(lèi)目影響最大,可以這樣來(lái)調(diào)用函數(shù):
result_lm=max_change(df[df["department"]==result.index[0]],"item_cats")
result.index會(huì)返回影響最大的部門(mén)的名稱(chēng)的列表,通過(guò)列表索引來(lái)引用它們。由于有多個(gè)部門(mén),這里我們需要用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") result_lm["department"]=result.index[i] #將部門(mén)名稱(chēng)添加到數(shù)據(jù)框中 frames.append(result_lm) return pd.concat(frames)
調(diào)用上述函數(shù)得到每個(gè)部門(mén)下影響最大的類(lèi)目:
final=max_lm(result,df)
如果我們想把結(jié)果導(dǎo)出到excel表中,可以這樣寫(xiě):
writer=pd.ExcelWriter("output_today.xlsx") result.to_excel(writer, sheet_name="max_departments") final.to_excel(writer, sheet_name="max_itemcats") writer.save()總結(jié)
準(zhǔn)備好python開(kāi)發(fā)環(huán)境,即 “代碼編輯器+ipython”;
寫(xiě)代碼前清晰定義實(shí)現(xiàn)最終目標(biāo)的每個(gè)步驟;
寫(xiě)代碼的過(guò)程中識(shí)別做事的模式,創(chuàng)造工具簡(jiǎn)化復(fù)用性操作;
利用for循環(huán)遍歷列表。
最終代碼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()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44291.html
摘要:基于大量的數(shù)據(jù)統(tǒng)計(jì),網(wǎng)球是一種很好的預(yù)測(cè)類(lèi)體育項(xiàng)目。數(shù)據(jù)科學(xué)家根據(jù)歷史數(shù)據(jù)和玩家信息來(lái)構(gòu)建預(yù)測(cè)模型,并將結(jié)果與博彩公司的評(píng)估進(jìn)行比較。目標(biāo)是找出機(jī)器學(xué)習(xí)模型與博彩公司評(píng)估之間的差距,從而有機(jī)會(huì)獲勝。這是一個(gè)很好的實(shí)際數(shù)據(jù)科學(xué)項(xiàng)目。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/56c......
摘要:再平衡策略基本就是以固定收益為標(biāo)準(zhǔn),圍繞其做波動(dòng),而波動(dòng)的影響就是股市的漲跌。 賺錢(qián)是個(gè)俗氣的話(huà)題,但又是人人都繞不開(kāi)的事情。我今天來(lái) 科學(xué) 地觸碰下這個(gè)話(huà)題。 談賺錢(qián),就會(huì)談到理財(cái)、投資,談到炒股。有這樣一個(gè)笑話(huà): 問(wèn):如何成為百萬(wàn)富翁? 答:帶一千萬(wàn)進(jìn)入股市。 那么你有沒(méi)有炒過(guò)股?有沒(méi)有虧過(guò)錢(qián)? 股市雖然是個(gè)充滿(mǎn)造富神話(huà)的地方,但對(duì)于大部分參與者來(lái)說(shuō),風(fēng)險(xiǎn)都是極高的,所謂 七...
摘要:對(duì)于大數(shù)據(jù)而言,數(shù)據(jù)量沒(méi)有一定的要求,只要足夠得出可靠的結(jié)論即可。與大數(shù)據(jù)相關(guān)的職業(yè)隨著市場(chǎng)對(duì)大數(shù)據(jù)相關(guān)需求的增加,與之相關(guān)的職業(yè)需求數(shù)量也在上升。 摘要: 本文從基本概念、行業(yè)趨勢(shì)、學(xué)習(xí)途徑等幾個(gè)方面介紹了大數(shù)據(jù)的相關(guān)內(nèi)容,適合對(duì)大數(shù)據(jù)感興趣的讀者作為入門(mén)材料閱讀。 隨著科技的發(fā)展,目前已經(jīng)步入了大數(shù)據(jù)的時(shí)代,很多社交媒體和互聯(lián)網(wǎng)公司也非常關(guān)注大數(shù)據(jù)這一行業(yè)。那么對(duì)于大數(shù)據(jù)而言,這里...
摘要:?jiǎn)柹疃葘W(xué)習(xí)社區(qū)現(xiàn)在面臨的主要挑戰(zhàn)是什么答打擊炒作發(fā)展倫理意識(shí)獲得科學(xué)嚴(yán)謹(jǐn)性。深度學(xué)習(xí)簡(jiǎn)直是科學(xué)的重災(zāi)區(qū)。 Keras之父、谷歌大腦人工智能和深度學(xué)習(xí)研究員Fran?ois Chollet撰寫(xiě)了一本深度學(xué)習(xí)Python教程實(shí)戰(zhàn)書(shū)籍《Python深度學(xué)習(xí)》,書(shū)中介紹了深度學(xué)習(xí)使用Python語(yǔ)言和強(qiáng)大Keras庫(kù),詳實(shí)新穎。近日,F(xiàn)ran?ois Chollet接受了采訪(fǎng),就深度學(xué)習(xí)到底是什么、...
閱讀 1146·2019-08-30 12:44
閱讀 653·2019-08-29 13:03
閱讀 2562·2019-08-28 18:15
閱讀 2431·2019-08-26 10:41
閱讀 3092·2019-08-26 10:28
閱讀 3040·2019-08-23 16:54
閱讀 1992·2019-08-23 15:16
閱讀 817·2019-08-23 14:55