【问题标题】:Using ndarray to create a time series in rust使用 ndarray 在 rust 中创建时间序列
【发布时间】:2022-08-13 20:49:35
【问题描述】:

我想知道如何使用 ndarray 从 CSV 创建时间序列数组?

我有这个 CSV:

date,value
1959-07-02,0.2930
1959-07-06,0.2910
1959-07-07,0.2820
1959-07-08,0.2846
1959-07-09,0.2760
1959-07-10,0.2757

我想使用带有 ndarray 支持的 plotly-rs 进行绘图。我成功反序列化了 CSV,但我想知道如何创建两个 Array 对象:一个日期为 NaiveDate (或字符串,因为我不确定 plotly-rs 是否原生支持 NaiveData),另一个值为 f64 ?下面是我的反序列化代码:

#[derive(Deserialize)]
struct Record {
    #[serde(deserialize_with = \"naive_date_time_from_str\")]
    date: NaiveDate,
    value: f64
}

fn naive_date_time_from_str<\'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
    D: Deserializer<\'de>,
{
    let s: String = Deserialize::deserialize(deserializer)?;
    NaiveDate::parse_from_str(&s, \"%Y-%m-%d\").map_err(de::Error::custom)
}

我可以像这样遍历 CSV:

fn main() -> Result<(), Box<dyn Error>> {
    let mut reader = ReaderBuilder::new()
        .has_headers(true)
        .delimiter(b\',\')
        .from_path(\"./data/timeseries.csv\")?;
    
    for record in reader.deserialize::<Record>() {
        let record: Record = record?;
        println!(
            \"date {}, value = {}\",
            record.date.format(\"%Y-%m-%d\").to_string(),
            record.value
        );
    }

    Ok(())
}

但知道我坚持创建两个 ndarray Array 对象。有什么提示吗?

编辑:在本主题中将采用某种类似的方法(但不使用 ndarray):How to push data from a csv::StringRecord to each column vector in a struct?

    标签: rust deserialization


    【解决方案1】:

    您可以直接读取 csv 数据并绘制图表,无需额外的ndarray 步骤。

    use csv::Error;
    use plotly::{Plot, Scatter};
    
    fn main() -> Result<(), Error> {
        let csv = "date,value
    1959-07-02,0.2930
    1959-07-06,0.2910
    1959-07-07,0.2820
    1959-07-08,0.2846
    1959-07-09,0.2760
    1959-07-10,0.2757";
    
        let mut reader = csv::Reader::from_reader(csv.as_bytes());
        let mut date = vec![];
        let mut data = vec![];
        for record in reader.records() {
            let record = record?;
            date.push(record[0].to_string());
            data.push(record[1].to_string());
        }
        let trace = Scatter::new(date, data);
    
        let mut plot = Plot::new();
        plot.add_trace(trace);
    
        plot.show();
    
        Ok(())
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 2019-02-05
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      相关资源
      最近更新 更多