楊育晟(Peter Yang)

嗨, 我叫育晟, 部落格文章主題包含了程式設計、財務金融及投資...等等,內容多是記錄一些學習的過程和心得,任何想法都歡迎留言一起討論。



Email: ycy.tai@gmail.com
LinkedIn: Peter Yang
Github: ycytai

用 pandas 解決 10 個資料處理問題 - (1)

為何需要資料處理?

在進行研究工作時,會將資料套用到模型上,觀察要探討的議題,而通常拿到的資料都有些殘缺、或是資料類型的問題,此時就要做資料處理的工作。

在執行研究前進行資料預處理的過程往往是最麻煩的,資料處理久了後,其實會發現遇到的問題大同小異,今天就列舉出 10 個最常碰到的狀況,而這些狀況又如何迅速用 pandas 解決

  1. 如何將資料轉置? (例如:把 column 變成 index 、或者整理成 panel data)
  2. 如何合併資料? (類似 Excel 中的 VLOOKUP)
  3. 如何操作多重索引值? (multi-index)
  4. 如何多重排序資料? (例如:先依日期排序、再依編號)
  5. 如何多重條件過濾資料? (例如:找出今天上漲的金融類股)
  6. 如何尋找和處理缺失值? (NA)
  7. 如何去除重複的資料?
  8. 如何處理時間格式? (年、月、日、日內)
  9. 如何改變資料頻率? (例如:從 5 秒變成 1 分鐘的頻率)
  10. 如何將資料分類後計算? (例如:計算特定產業近一天的報酬率)

以上每個問題用的範例都是獨立的,不一定要從頭看,可以看有沒有遇到類似的問題,本篇介紹前五個常見問題的處理方式。

如何將資料轉置?

假設我們有下圖這樣的股價資料

情境1–1: 將 column 和 index 轉換怎麼做?

df.T

情境1–2: 要將資料變成 panel data 的形式怎麼做?(做迴歸分析時常用到)

先用 df.stack(),再用 pd.DataFrame() 包起來。

pd.DataFrame(df.stack())


如何合併資料?

第二題每個情境會有多個資料,首先假設我們有下圖這樣兩個表格,分別為兩檔股票的股價資料

情境2–1: 如何將資料左右合併呢?

使用 pd.concat() ,設定 axis 設定1代表左右合併(欄位合併, column bind),預設為0代表(列合併, row bind)

pd.concat([df1, df2], axis=1)

情境2–2: 如何完成查表、對照的功能呢?(Excel 中的 VLOOKUP)

假設現在我們有兩個表格資料,分別為股票的公司資訊,和價格資訊,本次要將公司資訊加到右邊價格資訊的表格

資料順序不同的情況下,就不能像情境2–1直接合併解決,要合併就需要有查找的功能,讓正確的資料相互對應。

透過 pd.merge() 來解決, on 表示兩個表格對應的欄位名稱,例子中兩個表格都有 symbol ,以這個欄位為準合併兩個表格

pd.merge(price_df, firm_info, on='symbol')


如何操作多重索引值?(multi-index)

假如現在有一資料如下,有多重的索引值,也就是有一層以上的index,此時開如何處理呢?

情境3-1: 我只想留下其中一欄作為索引(date 或 symbol),該怎麼做?

使用 df.reset_index(0) ,將第一個欄位(最外層),也就是date,推回到表格中成為一個欄位,用 1 則是推回第二個,以此類推

df.reset_index()

當然,如果沒給數字的話就是全部。

情境3–2: 那要如何選取索引的值呢?

普通我們都會透過 df.index 的值來選取索引的值,multi-index當然也適用,不過要選取multi-index的其中一個index的話,則可以這樣寫

df.index.get_level_values()

不管是用順序或索引欄位名稱都可以指定選取。而多重索引欄位名稱可以這樣更改

df.index.names = [‘name1’, ‘name2’]


如何多重排序資料?

假設現在有筆資料如下,欄位分別為日期、股票代號、股票價格,看的出來資料順序是被打亂的

情境4–1: 要如何先依日期,再依股票代號排序呢?

可以透過 df.sort_values(['col1', 'col2']) 來進行條件排序,而欄位名稱的順序也代表排序的優先順序,可以看下面的例子

第二張圖中先放 symbol ,就變成先以 symbol 優先排序。


如何多重條件過濾資料?

假設現在有筆資料如下,個別股票的基本資料,像產業、收盤價…等

情境5–1: 我想找出當天金融保險類股、漲幅超過 1% 的股票

簡易的透過多條件選取完成,但須注意的是在多條件篩選時,每個條件前後要用 () 包起來,中間用 & 做間隔

df[ (df[‘industry’] == ‘金融保險業’) & (df[‘ret’] > 0.01) ]

結語

以上就是 5 個常見的資料處理狀況及技巧,下一篇用 pandas 解決 10 個資料處理問題 - (2)介紹另外 5 個。

Tags:
# python
# pandas
# data
# 資料科學