trs_dataframe/dataframe/column_store/
from.rsuse data_value::DataValue;
use halfbrown::HashMap;
use ndarray::Array2;
use crate::{Key, MLChefMap};
use super::{ColumnFrame, KeyIndex};
impl From<Vec<std::collections::HashMap<Key, DataValue>>> for ColumnFrame {
fn from(dataframe: Vec<std::collections::HashMap<Key, DataValue>>) -> Self {
let mut keys = dataframe
.iter()
.flat_map(|x| x.keys())
.cloned()
.collect::<Vec<_>>();
keys.sort();
let index = KeyIndex::new(keys);
let mut data_frame = Array2::default((dataframe.len(), index.len()));
for (idx, row) in dataframe.iter().enumerate() {
for (key, value) in row.iter() {
if let Some(column) = index.get_column_index(key) {
if let Some(x) = data_frame.get_mut((idx, column)) {
*x = value.clone();
}
}
}
}
Self::new(index, data_frame)
}
}
impl From<Vec<HashMap<Key, DataValue>>> for ColumnFrame {
fn from(dataframe: Vec<HashMap<Key, DataValue>>) -> Self {
let mut keys = dataframe
.iter()
.flat_map(|x| x.keys())
.cloned()
.collect::<Vec<_>>();
keys.sort();
let index = KeyIndex::new(keys);
let mut data_frame = Array2::default((dataframe.len(), index.len()));
for (idx, row) in dataframe.iter().enumerate() {
for (key, value) in row.iter() {
if let Some(column) = index.get_column_index(key) {
if let Some(x) = data_frame.get_mut((idx, column)) {
*x = value.clone();
}
}
}
}
Self::new(index, data_frame)
}
}
impl From<std::collections::HashMap<String, Vec<DataValue>>> for ColumnFrame {
fn from(dataframe: std::collections::HashMap<String, Vec<DataValue>>) -> Self {
let mut keys = dataframe
.keys()
.map(|x| x.as_str().into())
.collect::<Vec<_>>();
keys.sort();
let index = KeyIndex::new(keys);
let size = dataframe
.values()
.map(|x| x.len())
.max()
.unwrap_or_default();
let mut data_frame = Array2::default((size, index.len()));
for (key, value) in dataframe.into_iter() {
let key = key.as_str().into();
for (idx, value) in value.into_iter().enumerate() {
if let Some(column) = index.get_column_index(&key) {
if let Some(x) = data_frame.get_mut((idx, column)) {
*x = value.clone();
}
}
}
}
Self::new(index, data_frame)
}
}
impl From<MLChefMap> for ColumnFrame {
fn from(dataframe: MLChefMap) -> Self {
let mut keys = dataframe
.keys()
.map(|x| x.as_str().into())
.collect::<Vec<_>>();
keys.sort();
let index = KeyIndex::new(keys);
let size = dataframe
.values()
.map(|x| x.len())
.max()
.unwrap_or_default();
let mut data_frame = Array2::default((size, index.len()));
for (key, value) in dataframe.into_iter() {
let key = key.as_str().into();
for (idx, value) in value.into_iter().enumerate() {
if let Some(column) = index.get_column_index(&key) {
if let Some(x) = data_frame.get_mut((idx, column)) {
*x = value.clone();
}
}
}
}
Self::new(index, data_frame)
}
}
impl From<Vec<(Key, Vec<DataValue>)>> for ColumnFrame {
fn from(dataframe: Vec<(Key, Vec<DataValue>)>) -> Self {
let keys = dataframe
.iter()
.map(|(key, _)| key.clone())
.collect::<Vec<_>>();
let index = KeyIndex::new(keys);
let mut data_frame = Array2::default((dataframe.len(), index.len()));
for (key, value) in dataframe.into_iter() {
for (idx, value) in value.into_iter().enumerate() {
if let Some(column) = index.get_column_index(&key) {
if let Some(x) = data_frame.get_mut((idx, column)) {
*x = value.clone();
}
}
}
}
Self::new(index, data_frame)
}
}