mirror of
https://github.com/nushell/nushell.git
synced 2025-08-17 13:11:13 +02:00
Complete Dataframe MVP (#3373)
* Dataframe MVP * Removed test csv file * Dataframe MVP * Removed test csv file * New revision polars * New revision polars * csv file reader * argument parser for file reader * Parser from Row primitive * Column conversion * Added as f32 and f64 * Parsing row to dataframe * Removed repeated push to vector * Accept table values to create dataframe * Removed default serde * Dataframe to rows to show data * Save name of file with dataframe * Usage example * Upgrade polars version * Clippy changes * Added print function with head and tail * Move dataframe struct to folder * Lock file after running tests and merge * Optional feature for dataframe * Removed dataframe from plugins * Update primitive.rs Co-authored-by: JT <jonathandturner@users.noreply.github.com>
This commit is contained in:
@ -24,6 +24,8 @@ impl PrettyDebug for Value {
|
||||
.nest(),
|
||||
UntaggedValue::Error(_) => DbgDocBldr::error("error"),
|
||||
UntaggedValue::Block(_) => DbgDocBldr::opaque("block"),
|
||||
#[cfg(feature = "dataframe")]
|
||||
UntaggedValue::Dataframe(_) => DbgDocBldr::opaque("dataframe_prettydebug_for_Value"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -247,6 +247,29 @@ impl Primitive {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn as_f32(&self, span: Span) -> Result<f32, ShellError> {
|
||||
match self {
|
||||
Primitive::Int(int) => int.to_f32().ok_or_else(|| {
|
||||
ShellError::range_error(
|
||||
ExpectedRange::F32,
|
||||
&format!("{}", int).spanned(span),
|
||||
"converting an integer into a signed 32-bit float",
|
||||
)
|
||||
}),
|
||||
Primitive::Decimal(decimal) => decimal.to_f32().ok_or_else(|| {
|
||||
ShellError::range_error(
|
||||
ExpectedRange::F32,
|
||||
&format!("{}", decimal).spanned(span),
|
||||
"converting a decimal into a signed 32-bit float",
|
||||
)
|
||||
}),
|
||||
other => Err(ShellError::type_error(
|
||||
"number",
|
||||
other.type_name().spanned(span),
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: This is a bad name, but no other way to differentiate with our own Duration.
|
||||
pub fn into_chrono_duration(self, span: Span) -> Result<chrono::Duration, ShellError> {
|
||||
match self {
|
||||
@ -332,17 +355,35 @@ impl From<BigInt> for Primitive {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<f64> for Primitive {
|
||||
/// Helper to convert from 64-bit float to a Primitive value
|
||||
fn from(float: f64) -> Primitive {
|
||||
if let Some(f) = BigDecimal::from_f64(float) {
|
||||
Primitive::Decimal(f)
|
||||
} else {
|
||||
unreachable!("Internal error: protocol did not use f64-compatible decimal")
|
||||
// Macro to define the From trait for native types to primitives
|
||||
// The from trait requires a converter that will be applied to the
|
||||
// native type.
|
||||
macro_rules! from_native_to_primitive {
|
||||
($native_type:ty, $primitive_type:expr, $converter: expr) => {
|
||||
// e.g. from u32 -> Primitive
|
||||
impl From<$native_type> for Primitive {
|
||||
fn from(int: $native_type) -> Primitive {
|
||||
if let Some(i) = $converter(int) {
|
||||
$primitive_type(i)
|
||||
} else {
|
||||
unreachable!("Internal error: protocol did not use compatible decimal")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
from_native_to_primitive!(i8, Primitive::Int, BigInt::from_i8);
|
||||
from_native_to_primitive!(i16, Primitive::Int, BigInt::from_i16);
|
||||
from_native_to_primitive!(i32, Primitive::Int, BigInt::from_i32);
|
||||
from_native_to_primitive!(i64, Primitive::Int, BigInt::from_i64);
|
||||
from_native_to_primitive!(u8, Primitive::Int, BigInt::from_u8);
|
||||
from_native_to_primitive!(u16, Primitive::Int, BigInt::from_u16);
|
||||
from_native_to_primitive!(u32, Primitive::Int, BigInt::from_u32);
|
||||
from_native_to_primitive!(u64, Primitive::Int, BigInt::from_u64);
|
||||
from_native_to_primitive!(f32, Primitive::Decimal, BigDecimal::from_f32);
|
||||
from_native_to_primitive!(f64, Primitive::Decimal, BigDecimal::from_f64);
|
||||
|
||||
impl From<chrono::Duration> for Primitive {
|
||||
fn from(duration: chrono::Duration) -> Primitive {
|
||||
// FIXME: This is a hack since chrono::Duration does not give access to its 'nanos' field.
|
||||
|
Reference in New Issue
Block a user