Rust: polars行遍歷,從dataframe到struct及Bar設計比較

pandas提供了iterrows()、itertuples()、apply等行遍歷的方式,還是比較方便的。
polars的列操作功能非常強大,這個在其官網上有詳細的介紹。由于polars底層的arrow是列存儲模式,行操作效率低下,官方也不推薦以行方式進行數據操作。但是還是有部分場景可能會用到行遍歷的情況。

polars如何進行行遍歷,今天嘗試一下非apply的方式。

場景:polars讀取相應的關于歷史股價的csv文件,其中有基本的行情信息,那么,如何對讀取到的文件進行快速的行遍歷?這種場景在行情驅動的策略回測中比較常見。

在這里插入圖片描述一、初步方案:

1、總體方案

1、csv => dataframe 
2、dataframe =>into_struct ,得到structchunked
3、struchchunked =>在bars進行行遍歷。

2、Bar類型
至于Bar類型的設計,存在兩種方案:

(1)值類型的Bar

#[warn(dead_code)]
struct Bar{code:String,date:String,open:f32,high:f32,close:f32,low:f32,volume:f32,amount:f32,is_fq:bool,
}

(2)有引用類型的Bar

#[warn(dead_code)]
struct Bar2<'a>{code:&'a str,date:&'a str,open:f32,high:f32,close:f32,low:f32,volume:f32,amount:f32,is_fq:bool,
}

二、toml

注意,polars對features的設置要求高,有些用到的特性需要準確打開,否則代碼編譯會通不過。這一點在polars文檔中經常沒有寫清楚,也算是一個坑。

[package]
name = "my_duckdb"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
polars = { version = "*", features = ["lazy","dtype-struct"] }

注意,features中,一定要加上"dtype-struct"。

三、main.rs

根據上面的設計,全部代碼如下:

use polars::prelude::*;
use std::time::Instant;#[warn(dead_code)]
struct Bar{code:String,date:String,open:f32,high:f32,close:f32,low:f32,volume:f32,amount:f32,is_fq:bool,
}
#[warn(dead_code)]
struct Bar2<'a>{code:&'a str,date:&'a str,open:f32,high:f32,close:f32,low:f32,volume:f32,amount:f32,is_fq:bool,
}
fn main() {let time0 = Instant::now();// test2.csv:64w行let csv = "test2.csv"; let df = polars_lazy_read_csv(csv);println!("read raw csv cost time : {:?} seconds",time0.elapsed().as_secs_f32());let time1 = Instant::now();let rows = df.into_struct("bars");println!("dataframe => structs cost time : {:?} seconds",time1.elapsed().as_secs_f32());let time2 = Instant::now();let bars = get_vec_bars(&rows);println!("dataframe => bars cost time : {:?} seconds",time2.elapsed().as_secs_f32());let time3 = Instant::now();let bar2s = get_vec_bar2s(&rows);println!("dataframe => bar2s cost time : {:?} seconds",time3.elapsed().as_secs_f32());println!("bars length :{:?}",bars.len());println!("bar2s length:{:?}",bar2s.len());
}fn get_bar(row:&[AnyValue])->Bar{let code = row.get(0).unwrap();let mut new_code = "";if let &AnyValue::Utf8(value) = code{new_code = value;}let mut new_date = ""; let date = row.get(1).unwrap();if let &AnyValue::Utf8(v) = date {new_date = v;}let open =row[2].extract::<f32>().unwrap();let high:f32 = row[3].extract::<f32>().unwrap();let close =row[4].extract::<f32>().unwrap();let low:f32 = row[5].extract::<f32>().unwrap();let volume =row[6].extract::<f32>().unwrap();let amount:f32 = row[7].extract::<f32>().unwrap();let mut is_fq = false;if let &AnyValue::Boolean(b) = row.get(8).unwrap(){is_fq = b;}let bar = Bar{code: String::from(new_code),date: String::from(new_date),open:open,high:high,close:close,low:low,volume:volume,amount,is_fq:is_fq,};bar
}fn get_bar2<'a>(row:&'a [AnyValue])->Bar2<'a>{let code = row.get(0).unwrap();let mut new_code = "";if let &AnyValue::Utf8(value) = code{new_code = value;}let mut new_date = ""; let date = row.get(1).unwrap();if let &AnyValue::Utf8(v) = date {new_date = v;}let open =row[2].extract::<f32>().unwrap();let high:f32 = row[3].extract::<f32>().unwrap();let close =row[4].extract::<f32>().unwrap();let low:f32 = row[5].extract::<f32>().unwrap();let volume =row[6].extract::<f32>().unwrap();let amount:f32 = row[7].extract::<f32>().unwrap();let mut is_fq = false;if let &AnyValue::Boolean(b) = row.get(8).unwrap(){is_fq = b;}let bar = Bar2{code: new_code,date: new_date,open:open,high:high,close:close,low:low,volume:volume,amount,is_fq:is_fq,};bar
}
fn get_vec_bars(data: &StructChunked)-> Vec<Bar>{let mut bars = Vec::new();for row in data{let bar = get_bar(row);bars.push(bar);}bars
}fn get_vec_bar2s(data: &StructChunked)-> Vec<Bar2>{let mut bars = Vec::new();for row in data{let bar = get_bar2(row);bars.push(bar);}bars
}
fn polars_lazy_read_csv(filepath:&str) ->DataFrame{let polars_lazy_csv_time  = Instant::now();let p = LazyCsvReader::new(filepath).has_header(true).finish().unwrap();let mut df = p.collect().expect("error to dataframe!");println!("polars lazy 讀出csv的行和列數:{:?}",df.shape());println!("polars lazy 讀csv 花時: {:?} 秒!", polars_lazy_csv_time.elapsed().as_secs_f32());df
}

四、輸出與比較
對于一個64萬行,9列的csv文件,需要遍歷轉換Vec< Bar >類型,
1、輸出如下:

polars lazy 讀出csv的行和列數:(640710, 9)
polars lazy 讀csv 花時: 0.058484446 秒!
read raw csv cost time : 0.058487203 seconds
dataframe => structs cost time : 2.8842e-5 seconds
dataframe => bars cost time : 0.131985 seconds
dataframe => bar2s cost time : 0.10357016 seconds
bars length :640710
bar2s length:640710

總體上看,從dataframe到struct這層,效率比較高,主要的時間花在了structchunked至bars這部分上面。

2、值類型Bar和引用類型Bar

從輸出結果,可以看出,引用類型的Bar的效率要高一些,提效了20%。因為減少了堆分配所需要的時間。

五、其它

polars目前還沒有發現有類似pandas的行遍歷的方式,后面將持續跟蹤。
此外,dataframe轉bars的效率并不高,期待找到更高效的方式替代。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39581.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react_后臺管理_項目

目錄 1.運行項目 2. 項目結構 ①項目頂部導航欄 ②項目左側導航欄 ③主頁面-路由切換區 本項目使用的是 reacttsscss 技術棧。 1.運行項目 在當前頁面頂部下載本項目&#xff0c;解壓后使用編輯器打開&#xff0c;然后再終端輸入命令&#xff1a; npm i 下載依賴后&am…

【應急響應】Windows應急響應 - 基礎命令篇

前言 在如今的數字化時代&#xff0c;Windows系統面對著越來越復雜的網絡威脅和安全挑戰。本文將深入探討在Windows環境下的實戰應急響應策略。我們將重點關注實際應急響應流程、關鍵工具的應用&#xff0c;以及如何快速準確地識別和應對安全事件。通過分享實際案例分析&#…

FIO壓測磁盤性能以及需要注意的問題

一、壓測類型 1、順序讀&#xff08;IO&#xff09;&#xff1a;read&#xff0c;bs1M&#xff0c;job數從1開始往上加&#xff1a;2、3、4... 2、順序寫&#xff08;IO&#xff09;&#xff1a;write&#xff0c;bs1M&#xff0c;job數從1開始往上加&#xff1a;2、3、4... …

如何通過 1688 商品詳情的 API 接口獲取商品的詳細信息

在當今數字化商業的大背景下&#xff0c;能夠從 1688 這樣規模龐大且商品種類豐富的電商平臺中準確、高效地獲取商品的詳細信息&#xff0c;對于眾多企業和開發者而言&#xff0c;具有舉足輕重的意義。而通過 1688 商品詳情的 API 接口來實現這一目標&#xff0c;無疑是一種強大…

【ACM出版,馬來西亞-吉隆坡舉行】第四屆互聯網技術與教育信息化國際會議 (ITEI 2024)

作為全球科技創新大趨勢的引領者&#xff0c;中國不斷營造更加開放的科技創新環境&#xff0c;不斷提升學術合作的深度和廣度&#xff0c;構建惠及各方的創新共同體。這是對全球化的新貢獻&#xff0c;是構建人類命運共同體的新貢獻。 第四屆互聯網技術與教育信息化國際學術會議…

【 木蘭寬松許可證】

木蘭寬松許可證&#xff0c; 第1版 2019年8月 http://license.coscl.org.cn/MulanPSL 您對“軟件”的復制、使用、修改及分發受木蘭寬松許可證&#xff0c;第1版&#xff08;“本許可證”&#xff09;的如下條款的約束&#xff1a; 定義 “軟件”是指由“貢獻”構成的許可在“本…

【C++知識點總結全系列 (07)】:模板與泛型編程詳細總結與分析

模板與泛型編程 1、概述(1)What&#xff08;什么是模板、泛型編程&#xff09;(2)Why(3)Which(4)模板參數A.WhatB.HowC.模板參數的類型成員D.默認模板參數 2、模板函數3、模板類(1)How&#xff08;如何定義和使用模板類&#xff09;(2)成員模板 4、模板實參推斷(1)What&#xf…

入侵檢測模型

入侵檢測模型&#xff08;Intrusion Detection Model&#xff09;在網絡安全中起著至關重要的作用。它們用于識別和響應未經授權的訪問和攻擊行為。以下是常見的入侵檢測模型的詳細介紹&#xff1a; 一、入侵檢測模型分類 基于簽名的入侵檢測模型&#xff08;Signature-Based …

昇思25天學習打卡營第7天|Pix2Pix實現圖像轉換

文章目錄 昇思MindSpore應用實踐基于MindSpore的Pix2Pix圖像轉換1、Pix2Pix 概述2、U-Net架構定義UNet Skip Connection Block 2、生成器部分3、基于PatchGAN的判別器4、Pix2Pix的生成器和判別器初始化5、模型訓練6、模型推理 Reference 昇思MindSpore應用實踐 本系列文章主要…

大數據面試題之Flink(3)

如何確定Flink任務的合理并行度? Flink任務如何實現端到端一致? Flink如何處理背(反)壓? Flink解決數據延遲的問題 Flink消費kafka分區的數據時flink件務并行度之間的關系 使用flink-client消費kafka數據還是使用flink-connector消費 如何動態修改Flink的配置&a…

實戰:基于Java的大數據處理與分析平臺

實戰&#xff1a;基于Java的大數據處理與分析平臺 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何利用Java構建高效的大數據處理與分析平臺。…

Python基礎003

Python流程控制基礎 1.條件語句 內置函數input a input("請輸入一段內容&#xff1a;") print(a) print(type(a))代碼執行的時候遇到input函數&#xff0c;就會等鍵盤輸入結果&#xff0c;已回車為結束標志&#xff0c;也就時說輸入回車后代碼才會執行 2.順序執行…

pandas數據分析(5)

pandas使用Numpy的np.nan代表缺失數據&#xff0c;顯示為NaN。NaN是浮點數標準中地Not-a-Number。對于時間戳&#xff0c;則使用pd.NaT&#xff0c;而文本使用的是None。 首先構造一組數據&#xff1a; 使用None或者np.nan來表示缺失的值&#xff1a; 清理DataFrame時&#xf…

深度學習之交叉驗證

交叉驗證&#xff08;Cross-Validation&#xff09;是一種用于評估和驗證機器學習模型性能的技術&#xff0c;尤其是在數據量有限的情況下。它通過將數據集分成多個子集&#xff0c;反復訓練和測試模型&#xff0c;以更穩定和可靠地估計模型的泛化能力。常見的交叉驗證方法有以…

java設計模式(四)——抽象工廠模式

一、模式介紹 改善在工廠方法模式中&#xff0c;擴展時新增產品類、工廠類&#xff0c;導致項目中類巨多的場面&#xff0c;減少系統的維護成本&#xff0c;且一個工廠可以生成多種產品&#xff0c;而不是同一種的產品&#xff0c;比如一個工廠既可以生產鞋子又可以衣服&#…

解決數據庫PGSQL,在Mybatis中創建臨時表報錯TODO IDENTIFIER,連接池用的Druid。更換最新版本Druid仍然報錯解決

Druid版本1.1.9報錯Caused by: java.sql.SQLException: sql injection violation, syntax error: TODO IDENTIFIER : CREATE TEMPORARY TABLE temp_ball_classify (id int8 NOT NULL,create_time TIMESTAMP,create_by VARCHAR,classify_name VARCHAR) 代碼如下&#xff1a; 測…

四川蔚瀾時代電子商務有限公司打造抖音電商服務新高地

在數字化浪潮洶涌澎湃的今天&#xff0c;電商行業以其獨特的魅力和強大的市場潛力&#xff0c;成為了推動經濟增長的新引擎。四川蔚瀾時代電子商務有限公司&#xff0c;作為這個領域的佼佼者&#xff0c;正以其專業的服務、創新的理念和卓越的實力&#xff0c;引領抖音電商服務…

用AI,每天創作200+優質內容,2分鐘教會你操作!

前段時間發布了這篇“尋找爆款文案及標題的9大渠道&#xff0c;直接搬運都能搞流量&#xff01;”&#xff0c;里面我講到如何尋找爆款標題。最近不少朋友問我&#xff0c;如何創作這個標題相關的內容。 多數平臺都有風控規則&#xff0c;有些平臺內容也會有字數要求。為了讓大…

SpringBoot 項目整合 MyBatis 框架,附帶測試示例

文章目錄 一、創建 SpringBoot 項目二、添加 MyBatis 依賴三、項目結構和數據庫表結構四、項目代碼1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、瀏覽器測試結果六、…

JavaScript實現時鐘計時

會動的時鐘 1.目標 2.分析 1.最開始頁面不顯示時間&#xff0c;有兩個按鈕 開始 暫停。開始按鈕是可以點擊的&#xff0c;暫停按鈕不能點擊 2.當點擊開始按鈕后&#xff0c;設置開始按鈕不可用&#xff0c;暫停按鈕可用。然后將當前系統時間放到按鈕上面。每隔1秒中更新一下…