From a7042c3e3e7dd753b711365084372a5166507144 Mon Sep 17 00:00:00 2001 From: humphreylee <66808535+humphreylee@users.noreply.github.com> Date: Sun, 4 Aug 2024 20:47:38 +0800 Subject: [PATCH] Update dataframe.rs to create dataframe from vector of mixed data type vectors --- charming/src/datatype/dataframe.rs | 66 ++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/charming/src/datatype/dataframe.rs b/charming/src/datatype/dataframe.rs index 640f2e4..52ecac3 100644 --- a/charming/src/datatype/dataframe.rs +++ b/charming/src/datatype/dataframe.rs @@ -69,3 +69,69 @@ macro_rules! df { ] }; } + +/// Code below is modified from ChatGPT generated code. +/// The main objective of macro dz! is to transpose mixed data type vectors, +/// aka columns or dimensions into ECharts dataframe format. + +#[macro_export] +macro_rules! dz { + /* + Handle named vectors + let d1 = vec![44056, 13334]; + let d2 = vec![81.8, 76.9]; + let d3 = vec![23968973, 1376048943]; + let d4 = vec!["Australia", "China"]; + let d5 = vec![2015, 2015]; + let df = dz!(d1, d2, d3, d4, d5); + >>df = [Value(Array([Number(Integer(44056)), Number(Float(81.8)), + Number(Integer(23968973)), String("Australia"), Number(Integer(2015))])), + Value(Array([Number(Integer(13334)), Number(Float(76.9)), + Number(Integer(1376048943)), String("China"), Number(Integer(2015))]))] + */ + ($($v:expr),* $(,)?) => {{ + let mut df = Vec::new(); + let mut iterators: Vec>> = vec![ + $(Box::new($v.into_iter().map(|x| $crate::datatype::CompositeValue::from(x))),)* + ]; + + let len = iterators.first().map(|v| v.size_hint().0).unwrap_or(0); + + for _ in 0..len { + let mut row = Vec::new(); + for iter in iterators.iter_mut() { + if let Some(value) = iter.next() { + row.push(value); + } + } + let z = $crate::datatype::DataPoint::from(row); + df.push(z); + } + df + }}; + + /* + Handle direct input of vectors + let df = dz!([44056, 13334], [81.8, 76.9], [23968973, 1376048943], ["Australia", "China"], [2015, 2015]); + >>df = [Value(Array([Number(Integer(44056)), Number(Float(81.8)), + Number(Integer(23968973)), String("Australia"), Number(Integer(2015))])), + Value(Array([Number(Integer(13334)), Number(Float(76.9)), + Number(Integer(1376048943)), String("China"), Number(Integer(2015))]))] + */ + ($([$($v:expr),*]),* $(,)?) => {{ + let mut df = Vec::new(); + let mut iterators: Vec<_> = vec![$(vec![$($v.into()),*].into_iter()),*]; + + let len = iterators.first().map(|v| v.len()).unwrap_or(0); + for _ in 0..len { + let mut row = Vec::new(); + for iter in &mut iterators { + if let Some($crate::datatype::CompositeValue) = iter.next() { + row.push($crate::datatype::CompositeValue); + } + } + df.push(row); + } + df + }}; +}