use std::fmt::Debug;
use std::sync::Arc;
use crate::core::error::Result;
#[deprecated(
since = "0.1.0",
note = "Use new Series implementation in crate::series::base"
)]
pub use crate::series::Series as LegacySeries;
#[derive(Debug, Clone)]
pub struct Series<T>
where
T: Debug + Clone,
{
values: Vec<T>,
name: Option<String>,
}
impl<T> Series<T>
where
T: Debug + Clone,
{
pub fn new(data: Vec<T>, name: Option<String>) -> Result<Self> {
Ok(Self { values: data, name })
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
pub fn get(&self, index: usize) -> Option<&T> {
self.values.get(index)
}
pub fn values(&self) -> &[T] {
&self.values
}
pub fn to_vec(&self) -> Vec<T> {
self.values.clone()
}
pub fn name(&self) -> Option<&String> {
self.name.as_ref()
}
pub fn set_name(&mut self, name: String) {
self.name = Some(name);
}
pub fn with_name(mut self, name: String) -> Self {
self.name = Some(name);
self
}
pub fn as_f64(&self) -> Result<Vec<f64>>
where
T: Into<f64> + Copy,
{
let mut result = Vec::with_capacity(self.values.len());
for value in &self.values {
result.push((*value).into());
}
Ok(result)
}
pub fn to_string_series(&self) -> Result<Series<String>>
where
T: std::fmt::Display,
{
let string_values: Vec<String> = self.values.iter().map(|v| v.to_string()).collect();
Series::new(string_values, self.name.clone())
}
}
impl Series<i32> {
pub fn sum(&self) -> i32 {
self.values.iter().sum()
}
pub fn mean(&self) -> Result<f64> {
if self.is_empty() {
return Err(crate::core::error::Error::EmptySeries);
}
let sum: i32 = self.sum();
Ok(sum as f64 / self.len() as f64)
}
pub fn min(&self) -> Result<i32> {
self.values
.iter()
.min()
.cloned()
.ok_or_else(|| crate::core::error::Error::EmptySeries)
}
pub fn max(&self) -> Result<i32> {
self.values
.iter()
.max()
.cloned()
.ok_or_else(|| crate::core::error::Error::EmptySeries)
}
}
impl Series<String> {
pub fn str(&self) -> Result<crate::series::string_accessor::StringAccessor> {
crate::series::string_accessor::StringAccessor::new(self.clone()).map_err(|e| {
crate::core::error::Error::Type(format!("Failed to create string accessor: {:?}", e))
})
}
}
impl Series<chrono::NaiveDateTime> {
pub fn dt(&self) -> Result<crate::series::datetime_accessor::DateTimeAccessor> {
crate::series::datetime_accessor::DateTimeAccessor::new(self.clone()).map_err(|e| {
crate::core::error::Error::Type(format!("Failed to create datetime accessor: {:?}", e))
})
}
}
impl Series<chrono::DateTime<chrono::Utc>> {
pub fn dt_tz(&self) -> Result<crate::series::datetime_accessor::DateTimeAccessorTz> {
crate::series::datetime_accessor::DateTimeAccessorTz::new(self.clone()).map_err(|e| {
crate::core::error::Error::Type(format!("Failed to create datetime accessor: {:?}", e))
})
}
}