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