标签: rust-polars

在 Polars 中,我可以自己创建带有级别的分类类型吗?

在 Pandas 中,我可以自己指定分类类型的级别:

MyCat = pd.CategoricalDtype(categories=['A','B','C'], ordered=True)
my_data = pd.Series(['A','A','B'], dtype=MyCat)
Run Code Online (Sandbox Code Playgroud)

这意味着

  1. 我可以确保不同的列和集使用相同的数据类型
  2. 我可以指定级别的顺序。

有没有办法用 Polar 来做到这一点?我知道您可以使用字符串缓存功能以不同的方式实现 1),但是我很感兴趣是否可以直接指定我的 dtype/levels。我不知道有什么方法可以实现 2),但是我认为 Arrow 中的分类数据类型确实允许可选的排序,所以也许这是可能的?

rust-polars python-polars

4
推荐指数
1
解决办法
4932
查看次数

在 Polars Rust 中使用 groupby 时如何避免深度复制?

我有一个数据集,需要对不同列进行分组操作。这是使用极地版本“0.21.1”的最小工作代码

use polars::prelude::*;
use polars_lazy::prelude::*;
use polars::df;

fn main(){
  let df = df![
    "x1" => ["a", "b", "c", "a"],
    "x2" => ["A", "A", "B", "B"],
    "y" => [1, 2, 3, 4],
    ].unwrap();

  let lf: LazyFrame = df.lazy();

  let out1 = groupby_x1(&lf);
  println!("{:?}", out1.collect());
  let out2 = groupby_x2(&lf);
  println!("{:?}", out2.collect());

}

fn  groupby_x1(lf: &LazyFrame) -> LazyFrame {
  let lf1: LazyFrame = lf.clone().groupby([col("x1")]).agg([
    col("y").sum().alias("y_sum"),
  ]);
  lf1
}

fn  groupby_x2(lf: &LazyFrame) -> LazyFrame {
  let lf1: LazyFrame = lf.clone().groupby([col("x2")]).agg([
    col("y").sum().alias("y_sum"),
  ]);
  lf1
} …
Run Code Online (Sandbox Code Playgroud)

rust rust-polars

4
推荐指数
1
解决办法
712
查看次数

如何向 Polars.DataFrame 添加一列空数组?

我正在尝试将一列空列表添加到 python 中的极坐标数据框中。

我的代码

import polars as pl
a = pl.DataFrame({'a': [1, 2, 3]})
a.with_columns([pl.lit([]).alias('b')])
Run Code Online (Sandbox Code Playgroud)

投掷

Traceback (most recent call last):
  File "<input>", line 1, in <module>
    a.with_columns([pl.lit([]).alias('b')])
  File "/usr/local/lib/python3.10/site-packages/polars/internals/lazy_functions.py", line 767, in lit
    return pli.wrap_expr(pylit(item, allow_object))
ValueError: could not convert value '[]' as a Literal
Run Code Online (Sandbox Code Playgroud)

我怎样才能创建这个专栏?

python dataframe python-3.x rust-polars python-polars

4
推荐指数
1
解决办法
6201
查看次数

Rust:使用结构向量的极坐标中的数据帧

问题

我想将数据polarsmysql数据库读入数据帧。我在用sqlx

sqlx生成结构向量,例如:Vec<Country>如下:

来自sqlx 文档

// no traits are needed
struct Country { country: String, count: i64 }

let countries = sqlx::query_as!(Country,
        "
SELECT country, COUNT(*) as count
FROM users
GROUP BY country
WHERE organization = ?
        ",
        organization
    )
    .fetch_all(&pool) // -> Vec<Country>
    .await?;

// countries[0].country
// countries[0].count
Run Code Online (Sandbox Code Playgroud)

我如何使用它Vec<Country>来生成极坐标数据框

来自polars 文档


 use polars_core::prelude::*;
 let s0 = Series::new("a", &[1i64, 2, 3]);
 let s1 = Series::new("b", …
Run Code Online (Sandbox Code Playgroud)

sql dataframe rust rust-sqlx rust-polars

3
推荐指数
1
解决办法
3026
查看次数

如何在 Rust 中将条件计算的列添加到极坐标数据框中?

df1 有['a', 'b', 'c']3 列,我想要一个 df2 有 4 列['a', 'b', 'c', 'd']。d 的计算如下:

if a>5 {
  d = b + c 
} else if a<-5 {
  d = c - b + a
}  else {
  d = 3.0 * a
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能用生锈的极地做到这一点?也许对于渴望和懒惰的人来说。

rust rust-polars

3
推荐指数
1
解决办法
2129
查看次数

如何从 Polars Series 或 ChunkedArray 获取 Vec?

在 Rust Polars 中,如何将 aSeries或转换ChunkedArray为 a Vec

rust rust-polars

3
推荐指数
1
解决办法
3309
查看次数

谓词中的 &amp; 运算符(过滤器) - 如何使过滤器基于多个列值?

我正在尝试根据两列值过滤 Polars 数据框。在Rust 用户指南中,我只能找到基于一列值的基于谓词的过滤器。

如何在谓词中添加其他列并返回布尔值?

我试图保留 job=“社会工作者”和“性别”=“M”的行(如果需要,可能是附加列)

    use polars::{prelude::*, lazy::dsl::col};
    // use the predicate to filter
    let predicate = (col("job").eq(lit("Social worker")) & (col("sex").eq(lit("M")))); 
   
    let filtered_df = df
        .clone()
        .lazy()
        .filter(predicate )
        .collect()
        .unwrap();
Run Code Online (Sandbox Code Playgroud)

我得到的错误是它说 & 运算符不能在这里使用,并且它不检查这两个条件。

错误信息图片

error[E0369]: no implementation for \Expr & Expr``
|
23 | let predicate = col("job").eq(lit("Social worker")) & col("sex").eq(lit("M"));
| ----------------------------------- ^ ----------------------- Expr
| |
| Expr
Run Code Online (Sandbox Code Playgroud)

如果我只使用一种条件,过滤器将按要求工作。以下代码返回正确的输出。

// use the predicate to filter
    let predicate = col("job").eq(lit("Social worker"));
   
    let filtered_df = …
Run Code Online (Sandbox Code Playgroud)

rust-polars

3
推荐指数
1
解决办法
655
查看次数

如何在使用 CsvReader 时在 Polars DataFrame 中添加列名称

我可以读取文件中没有列标题的 csv 文件。通过以下代码在 Rust 中使用极坐标:

use polars::prelude::*;

fn read_wine_data() -> Result<DataFrame> {
    let file = "datastore/wine.data";
    CsvReader::from_path(file)?
        .has_header(false)
        .finish()
}


fn main() {
    let df = read_wine_data();
    match df {
        Ok(content) => println!("{:?}", content.head(Some(10))),
        Err(error) => panic!("Problem reading file: {:?}", error)
    }
}

Run Code Online (Sandbox Code Playgroud)

但现在我想在读取时或读取后将列名添加到数据框中,如何添加列名。这是一个列名称向量:

let COLUMN_NAMES = vec![
    "Class label", "Alcohol",
    "Malic acid", "Ash",
    "Alcalinity of ash", "Magnesium",
    "Total phenols", "Flavanoids",
    "Nonflavanoid phenols",
    "Proanthocyanins",
    "Color intensity", "Hue",
    "OD280/OD315 of diluted wines",
    "Proline"
];
Run Code Online (Sandbox Code Playgroud)

如何将这些名称添加到数据框中。可以通过以下代码下载数据:

wget https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data
Run Code Online (Sandbox Code Playgroud)

rust rust-polars

2
推荐指数
1
解决办法
2208
查看次数

在Python中,极性将json字符串列转换为字典以进行过滤

你好,有一个数据框,其中有一个名为标签的列,它是一个 json 字符串。

我想在标签列上过滤此数据框,以便它仅包含存在特定标签键或标签具有特定值的行。

我想我可以做一个字符串包含匹配,但认为首先将 json 转换为字典并使用 has_key 等可能会更强大?

在 python Polars 中推荐的方法是什么?

谢谢

rust-polars python-polars

2
推荐指数
1
解决办法
4539
查看次数

使用索引进行选择是 Polars 中的反模式:如何解析和转换(选择/过滤?)似乎需要这样的 CSV?

我想使用 Pola-rs 阅读来自 Rigol MSO5000 示波器的以下(在我看来相当糟糕的)CSV:

D7-D0,D15-D8,t0 = -25.01s, tInc = 2e-06,
+2.470000E+02,2.000000E+00,,
+1.590000E+02,1.600000E+01,,
+2.400000E+02,2.000000E+00,,
+2.470000E+02,+1.300000E+02,,
+1.590000E+02,1.800000E+01,,
+2.470000E+02,+1.300000E+02,,
9.500000E+01,1.800000E+01,,
9.500000E+01,1.800000E+01,,
+2.400000E+02,0.000000E+00,,
(...)
Run Code Online (Sandbox Code Playgroud)

这是我当前的 Jupyter Notebook 迭代/尝试,然后发现Pola-rs 不鼓励使用索引进行选择

D7-D0,D15-D8,t0 = -25.01s, tInc = 2e-06,
+2.470000E+02,2.000000E+00,,
+1.590000E+02,1.600000E+01,,
+2.400000E+02,2.000000E+00,,
+2.470000E+02,+1.300000E+02,,
+1.590000E+02,1.800000E+01,,
+2.470000E+02,+1.300000E+02,,
9.500000E+01,1.800000E+01,,
9.500000E+01,1.800000E+01,,
+2.400000E+02,0.000000E+00,,
(...)
Run Code Online (Sandbox Code Playgroud)

当我在 Polars Discord 上被告知这个问题可能无法通过数据帧库得到最佳解决时,这是我的低级 CSV 解析 Rust 伪代码方法:

import polars as pl

df = pl.read_csv("normal0.csv")

# Grab initial condition and increments
t0 = df.columns[2]; assert "t0" in t0; t0 = float(t0.split('=')[1].replace('s', '').strip())
tinc = …
Run Code Online (Sandbox Code Playgroud)

csv oscilloscope rust rust-polars python-polars

2
推荐指数
1
解决办法
421
查看次数