?作者主頁:小小明-代碼實(shí)體
?簡介:Python領(lǐng)域優(yōu)質(zhì)創(chuàng)作者?、數(shù)據(jù)處理專家?
?歡迎點(diǎn)贊 ? 收藏 ?留言 ?
昨晚有位童鞋一道Pandas面試題完全沒有思路不會做,通過黃同學(xué)找到我時(shí),這道題目離提交答案僅剩20分鐘,不過我最終還是在15分鐘之內(nèi)解決了問題,這整個(gè)過程簡直是刺激~???
原題題目如下:
最終要求輸出:
要在20分鐘內(nèi)解決這個(gè)問題,對于我來說最困難的第一步就是理解題意,作為一名英文渣渣,硬看這個(gè)還是理解的太慢。ε=ε=ε=(#>д<)?啊啊啊,簡直是生死競速啊,怎么辦?
最終我使用了騰訊翻譯官進(jìn)行輔助,翻譯結(jié)果如下:
有了圖片翻譯工具,這個(gè)題目總算理解了。
我總結(jié)一下四個(gè)規(guī)則要求:對于每一天的每一支股票,會有N個(gè)來源的價(jià)格,去掉空值后優(yōu)先選擇最頻繁出現(xiàn)的價(jià)格,出現(xiàn)次數(shù)全部一樣時(shí)選擇來源id最小的價(jià)格,當(dāng)天該股票全部都是空值時(shí),選擇前一個(gè)交易日的價(jià)格。
搞清楚了規(guī)則就可以開始整理數(shù)據(jù)了,這里我手敲編輯了數(shù)據(jù)為:
date | ticker | price | source_id |
---|---|---|---|
2013/1/2 | AAPL | 515.61 | 0 |
2013/1/2 | AAPL | 515.62 | 1 |
2013/1/2 | AAPL | 515.62 | 2 |
2013/1/3 | AAPL | 515.16 | 0 |
2013/1/3 | AAPL | 515.17 | 1 |
2013/1/3 | AAPL | 515.18 | 2 |
2013/1/4 | AAPL | 0 | |
2013/1/4 | AAPL | 515.45 | 1 |
2013/1/4 | AAPL | 515.47 | 2 |
2013/1/7 | AAPL | 0 | |
2013/1/7 | AAPL | 1 | |
2013/1/7 | AAPL | 2 | |
2013/1/8 | AAPL | 527.28 | 0 |
2013/1/8 | AAPL | 528.29 | 1 |
保存Excel文件。
已經(jīng)耗時(shí)10分鐘了?怎么辦?怎么辦??
不過也已經(jīng)到了我最擅長的編碼階段,開干吧???
首先使用pandas讀取數(shù)據(jù):
import?pandas?as?pddf?=?pd.read_excel("股票數(shù)據(jù).xlsx")df
這四個(gè)規(guī)則,直接使用pandas本身的方法會導(dǎo)致代碼較為臃腫。由于時(shí)間緊迫,這里我直接使用萬能的循環(huán)來解決這個(gè)問題,最終完整代碼如下:
result?=?[]for?(date,?ticker),?split?in?df.groupby(["date",?"ticker"]):????prices?=?split.price.mode()????if?prices.shape[0]?>?0:????????price?=?split.price.mode().iat[0]????else:????????price?=?last????result.append((date,?ticker,?price))????last?=?priceresult?=?pd.DataFrame(result,?columns=["date",?"ticker",?"price"])result
結(jié)果:
可以看到結(jié)果滿足題目的四點(diǎn)規(guī)則要求,歷時(shí)5分鐘編碼終于搞定了。?長舒一口氣壓壓驚~
做完后我立馬將代碼和截圖發(fā)給了對方,對方也在提交答案后立馬回了我一個(gè)紅包。
但是表達(dá)看不懂,希望我寫篇文章:
既然如此,那么我就寫下這篇文章來詳解這其中的幾個(gè)小知識點(diǎn)。雖然其實(shí)這其中涉及的內(nèi)容比我以前的老文章要簡單20倍以上,不太屑于寫,但黃同學(xué)都這樣邀請了,我就逼自己寫一把吧?
首先呢,我們將整個(gè)datafream按照每天每支股票拆分成一個(gè)個(gè)的Datafream:
for?(date,?ticker),?df_split?in?df.groupby(["date",?"ticker"]):????print(date,?ticker)????display(df_split)
結(jié)果如下:
可以看到這支股票的每一天的數(shù)據(jù)都被拆分了出來。
取最頻繁的價(jià)格,我們可以使用眾數(shù):
df_split.price.mode()
0????527.281????528.29dtype:?float64
這種形式表示眾數(shù)不止一個(gè),表示出現(xiàn)次數(shù)一致,此時(shí)規(guī)則2要求選擇來源id最小的價(jià)格,由于數(shù)據(jù)本身是按照來源id從小到大排序的,那么我們直接取第一個(gè)眾數(shù)即可:
df_split.price.mode().iat[0]
527.28
但是問題是,某個(gè)分組可能出現(xiàn)價(jià)格全部為空值的情況,此時(shí)規(guī)則要求取前一個(gè)分組的價(jià)格,這也是我直接使用循環(huán)來解決這個(gè)問題的原因,因?yàn)榭梢酝ㄟ^一個(gè)變量記錄前一次遍歷分組的結(jié)果。
當(dāng)然為了避免數(shù)據(jù)源可能出現(xiàn)無序的情況的情況,我們需要事先對數(shù)據(jù)進(jìn)行排序:
df.sort_values(["ticker",?"date",?"source_id"],?inplace=True)
最后我將所有的結(jié)果數(shù)據(jù)都保存到了一個(gè)列表中,通過DataFrame的構(gòu)造函數(shù)則可以直接根據(jù)一個(gè)列表生成一個(gè)DataFrame,columns參數(shù)指定了列名。
額,感覺實(shí)在太過于基礎(chǔ)已經(jīng)沒啥可寫的了,推薦幾篇老文章吧:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119820.html
??蘇州程序大白一文從基礎(chǔ)手把手教你Python數(shù)據(jù)可視化大佬??《??記得收藏??》 目錄 ????開講啦?。。?!????蘇州程序大白?????博主介紹前言數(shù)據(jù)關(guān)系可視化散點(diǎn)圖 Scatter plots折線圖強(qiáng)調(diào)連續(xù)性 Emphasizing continuity with line plots同時(shí)顯示多了圖表 數(shù)據(jù)種類的可視化 Plotting with categorical da...
此專欄文章是對力扣上算法題目各種方法的總結(jié)和歸納, 整理出最重要的思路和知識重點(diǎn)并以思維導(dǎo)圖形式呈現(xiàn), 當(dāng)然也會加上我對導(dǎo)圖的詳解. 目的是為了更方便快捷的記憶和回憶算法重點(diǎn)(不用每次都重復(fù)看題解), 畢竟算法不是做了一遍就能完全記住的. 所以本文適合已經(jīng)知道解題思路和方法, 想進(jìn)一步加強(qiáng)理解和記憶的朋友, 并不適合第一次接觸此題的朋友(可以根據(jù)題號先去力扣看看官方題解, 然后再看本文內(nèi)容). 關(guān)...
在使用openpyxl時(shí),出現(xiàn)ValueError: Unknown engine: openpyxl 問題定位解決思路拓展 問題定位 在使用鏈接: https://blog.csdn.net/SuperAlanSun/article/details/120042466 博客中的方法讀取excel數(shù)據(jù)時(shí): import pandas as pddf=pd.rea...
上次給大家分享了一個(gè)springboot+vue的校園招聘系統(tǒng),視頻教程加項(xiàng)目源碼,都是開源的,應(yīng)該說很香了,今天再給大家分享一個(gè)不錯(cuò)的springboot的項(xiàng)目。 老規(guī)矩,開源,開源,開源?。。? 金九銀十來了,小伙伴們,沖??!前面已經(jīng)整理了很多的面試題,拿去學(xué)習(xí)吧! 1,??爆肝!整理了一周的Spring面試大全【含答案】,吊打Java面試官【建議收藏】!?? 2,??肝完了,一天掌握數(shù)據(jù)...
閱讀 2610·2021-11-23 09:51
閱讀 2523·2021-09-30 09:48
閱讀 1119·2021-09-10 10:51
閱讀 2248·2021-08-12 13:22
閱讀 3606·2021-08-11 10:24
閱讀 2204·2019-08-30 15:55
閱讀 667·2019-08-30 14:05
閱讀 3239·2019-08-30 13:03