2026/1/17 プロトタイプ VTとJPU=Xの終値のデータをマージしたpolarsのDatafame表示まで ------------------------------ use polars::{ df, frame::DataFrame, prelude::{DataType, IntoLazy, JoinArgs, col, lit}, }; use std::time::Instant; use time::{OffsetDateTime, macros::datetime}; use yahoo_finance_api::{self, YResponse}; async fn load_vt_price() -> Result> { let provider = yahoo_finance_api::YahooConnector::new()?; let ticker = "VT"; let start = datetime!(2008-6-26 0:00:00.00 UTC); let end = OffsetDateTime::now_utc(); let resp: YResponse = provider.get_quote_history(ticker, start, end).await?; let quotes = resp.quotes()?; let mut ts_vec = Vec::with_capacity(quotes.len()); let mut close_vec = Vec::with_capacity(quotes.len()); for q in quotes { ts_vec.push(q.timestamp); close_vec.push(q.close); } let price = df![ "ts" => ts_vec, "vt_close_usd" => close_vec ]?; let price = price .lazy() .with_column( (col("ts") * lit(1000)) .cast(DataType::Datetime( polars::prelude::TimeUnit::Milliseconds, None, )) .cast(DataType::Date) .alias("date"), ) .select([col("date"), col("vt_close_usd")]) .collect()?; Ok(price) } async fn load_jpyx_price() -> Result> { let provider = yahoo_finance_api::YahooConnector::new()?; let ticker = "JPY=X"; let start = datetime!(1996-10-30 0:00:00.00 UTC); let end = OffsetDateTime::now_utc(); let resp: YResponse = provider.get_quote_history(ticker, start, end).await?; let quotes = resp.quotes()?; let mut ts_vec = Vec::with_capacity(quotes.len()); let mut close_vec = Vec::with_capacity(quotes.len()); for q in quotes { ts_vec.push(q.timestamp); close_vec.push(q.close); } let price = df![ "ts" => ts_vec, "jpyx_close_usd" => close_vec ]?; let price = price .lazy() .with_column( ((col("ts") + lit(52200)) * lit(1000)) .cast(DataType::Datetime( polars::prelude::TimeUnit::Milliseconds, None, )) .cast(DataType::Date) .alias("date"), ) .select([col("date"), col("jpyx_close_usd")]) .collect()?; Ok(price) } async fn load_price() -> Result> { let vt_price = load_vt_price().await?; let jpyx_price = load_jpyx_price().await?; let price = vt_price.lazy().join( jpyx_price.lazy(), [col("date")], [col("date")], JoinArgs::new(polars::prelude::JoinType::Inner), ); let price = price .with_column((col("vt_close_usd") * col("jpyx_close_usd")).alias("vt_close_yen")) .collect()?; Ok(price) } #[tokio::main] async fn main() -> Result<(), Box> { let start = Instant::now(); let price = load_price().await?; println!("{:?}", price); let elapsed = start.elapsed(); println!("処理時間(sec) = {:.3}", elapsed.as_secs_f64()); Ok(()) } ------------------------------