緣起
Polars 是一個以 Rust 語言開發的 「DataFrame」 新興套件,它可以同時在 Rust 及 Python 中使用。Polars 憑藉著 Rust 的執行速度為基礎,讓它在資料處理的領域中, 逐漸流行起來。
但正由於它還在發展初期,目前網路上的參考文章相對較少,中文的內容更是稀有;所以整理了一下這週末的一些研究心得,一來避免自己忘記,二來也在網路上與大家分享,希望慢慢的能讓 Rust 的中文資源可以越來越完整,有朝一日可以在華人世界中流行起來。
本文開始
本週研究的主題是 Polars 裡,對「DataFrame」某個「str」欄位,進行資料型別轉換為「Date」或「Datetime」。資料的轉換可以有多種方式,應該不只限於接下來提到的方法。
建立第一個資料集
為了開始這個操作,我們需要先建立起一個「DataFrame」。
執行後, 可以看到以下的結果:
┌────────────┐
│ trans_date │
│ --- │
│ str │
╞════════════╡
│ 2023-05-01 │
│ 2023-05-02 │
│ 2023-05-03 │
│ 2023-05-04 │
│ 2023-05-05 │
└────────────┘
從執行的結果中,我們可以清楚的看到,目前所建立的「DataFrame」,在「trans_date」的欄位中,它的資料型態為「str」;也就是說,目前它是一個字串。如果我們只有操作到這裡,我想這樣的結果還不致於會有什麼太大的問題,反正只是把結果給顯示出來,頂多做個排序,大致上結果應該都會是正確的。
但如果我們想做的不只是這樣,需要對這個資料集進行一些更細緻的操作呢(例如,對這個資料進行過濾,找出早於/晚於某個日期的記錄)?這個時候,將原本的「str」型態轉換為「Date」型態,相信會是一個更好的選擇。
準備進行轉換
在開始進行轉換之前,我們要對上面的程式碼做一點小小的調整。Polars 的「DataFrame」操作模式有兩種,一為一般模式,二為「Lazy」模式。兩者最大的差別在於,一般模式在每一個功能呼叫時,當下就會對資料集進行操作;但「Lazy」模式則是在最終確認後,才一次執行所有的運算。「Lazy」模式讓我想到多年前學習 Big Data 時,使用 Apache Hadoop 及 Apache Spark,以及這幾年玩機器學習框架 TensorFlow 及 PyTorch 時,對資料集進行操作的方式,實在有異曲同工之妙。
在 Polars 官方的說明文件中,推薦我們使用「Lazy」模式,因此對程式做一些小小的調整:
在上面的程式碼裡,紅色的「 .lazy() 」幫我們把原本的「DataFrame」,轉換為「LazyFrame」。在轉換操作模式後,我們透過下面的操作,要開始對資料集的「trans_date」欄,進行型別轉換:
「.with_column()」 用來為一個「DataFrame」加入一個欄位;過程裡,我們可以透過 Polars 裡的 Expression 描述,來對某一個欄位進行運算操作,並將結果存入這個欄位中。有一點比較特別的是,如果沒有特別再定義別名(alias),則運算後的結果,將會回填到原本指定的欄位中(在我們的例子裡,會寫入 「trans_date」 欄位)。我們即利用這個行為, 來為資料集的特定欄位,進行資料型別的轉換。
執行後,印出資料集的內容如下:
到這裡,我們可以清楚看到欄位的資料型態,已經從原本的「str」變更為「date」。
以下附上完整的程式碼:
留言