标签: python-polars

在极坐标中使用数据框名称和 pl.col() 选择列之间的区别

我对 Polar 还比较陌生。我对其运作有一些疑问。我可以在 Polars 中执行这样的操作,

df = df.with_columns(((pl.col("netsales")/pl.col("sold_quantity")).alias("net_div"))
Run Code Online (Sandbox Code Playgroud)

同样可以使用以下方法实现,

df = df.with_columns((df["netsales"]/df["sold_quantity"]).alias("net_div"))
Run Code Online (Sandbox Code Playgroud)

就性能而言,它们之间有什么区别吗?

还,

df = df.with_columns((df["netsales"]/df["sold_quantity"]).alias("net_mul"),
(df["netsales"]+df["sold_quantity"]).alias("net_add")
)
Run Code Online (Sandbox Code Playgroud)

上述操作可以像这样单独完成,

df = df.with_columns((df["netsales"]/df["sold_quantity"]).alias("net_mul"))
df = df.with_columns((df["netsales"]+df["sold_quantity"]).alias("net_add"))
Run Code Online (Sandbox Code Playgroud)

上述两种方式执行相同的操作在性能上有什么区别吗?我在网上找不到与此相关的任何答案或文档。如果您能分享一些这方面的知识,我将感谢您的支持。

dataframe python-polars

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

将每一行映射到一个列表中并收集所有

我有一个数据框:

df = pl.DataFrame(
    {
        "t_left": [0.0, 1.0, 2.0, 3.0],
        "t_right": [1.0, 2.0, 3.0, 4.0],
        "counts": [1, 2, 3, 4],
    }
)
Run Code Online (Sandbox Code Playgroud)

我想将每一行映射到一个列表中,然后收集所有值(要传递到 例如matplotlib.hist

我可以手动完成,如下所示:

times = []
for t_left, t_right, counts in df.rows():
    times.extend(np.linspace(t_left, t_right, counts + 1)[1:])
Run Code Online (Sandbox Code Playgroud)

但这对于我的数据集来说太慢了。

我对 python 和 Polars 都是全新的,所以我想知道是否有更好的方法来实现这一点。

编辑

完整的复制粘贴示例以重现。

import polars as pl
import numpy as np

size = 1000000
df = pl.DataFrame(
    {
        "t_left": np.random.rand(size),
        "t_right": np.random.rand(size) + 1,
        "counts": [1] * size,
    }
)

times = []
for …
Run Code Online (Sandbox Code Playgroud)

python python-polars

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

如何(更快)找到使涉及多个 LazyFrame 列的函数的结果最小化的 x 值?

我有一个 LazyFrame,其中包含几个时期内的多列每小时数据。对于每个周期,我想找到涉及多列数学运算的函数的 x 值,以最小化结果。

\n

我使用 scipy.optimize.minimize 来完成此操作,并且实际上获得了所需的结果。问题是这个过程运行得非常慢,所以我只是在寻找任何能完成相同但更快的事情。

\n
    def minimization_target(x, period_start):\n        return hourly_data.filter(pl.col('period_start') == period_start).select((((pl.col('price').median() * pl.col('quantity').median() - (pl.col('estimated_quantity') * (pl.col('estimated_price') + x)).sum()) / (pl.col('key_product') * (pl.col('estimated_price') + x)).sum())).abs() - 1).abs()).collect().item()\n\n    results = hourly_data.group_by('period_start', maintain_order=True).map_groups(lambda group: pl.DataFrame({'x_values': scipy.optimize.minimize(minimization_target, group.get_column('initial_guess').median(), args=group.get_column('period_start').median()).x}), schema=None)\n
Run Code Online (Sandbox Code Playgroud)\n

最小的例子:

\n
import scipy\nimport polars as pl\nfrom datetime import datetime\n\nhourly_data = pl.DataFrame({'period': [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3], 'price': …
Run Code Online (Sandbox Code Playgroud)

python scipy python-polars

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

极坐标中的“df.query()”?

极坐标中的pandas.DataFrame.query相当于什么?

import pandas as pd
data= {
    'A':["Polars","Python","Pandas"],
    'B' :[23000,24000,26000],
    'C':['30days', '40days',np.nan],
      }

df = pd.DataFrame(data)

    A        B       C
0   Polars  23000   30days
1   Python  24000   40days
2   Pandas  26000   NaN
Run Code Online (Sandbox Code Playgroud)

现在,定义一个变量item

item=24000
df.query("B>= @item")

    A        B       C
1   Python  24000   40days
2   Pandas  26000   NaN
Run Code Online (Sandbox Code Playgroud)

现在,使用极坐标:

import polars as pl
df = pl.DataFrame(data)

item=24000
df.query("B>= @item")
Run Code Online (Sandbox Code Playgroud)

我得到:

AttributeError: 'DataFrame' object has no attribute 'query'
Run Code Online (Sandbox Code Playgroud)

我的大胆猜测是,df.filter()但语法看起来不一样,而且看起来也filter相当于?df.loc[]

python dataframe python-3.x python-polars

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

我们如何对极坐标中的时间序列进行重新采样

我想将表达式与 groupby 一起使用,每月进行下采样,因为下采样函数将被弃用。有没有一种简单的方法可以做到这一点,datetime.timedelta 仅适用于天数及更短的时间。

python python-polars

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

将极坐标中的日期时间[ms] 转换为日期时间[ns]

我想将极坐标中类型为 datetype[ms] 的列转换为 datetime[ns] 。有没有简单的方法可以做到这一点?我认为使用 datetime[ms] 时 group_by_dynamic 有问题,我想测试一下

python datetime python-polars

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

我可以使用 Polars 处理 DataFrame 而无需在内存中构建整个输出吗?

为了有效地将大型数据集加载到 Polars 中,可以使用惰性 API 和函数scan_*。当我们执行聚合时,这很有效(因此我们有一个大的输入数据集,但一个小的结果)。但是,如果我想完整地处理一个大数据集(例如,更改列的每一行中的值),似乎无法使用collect整个(结果)数据集并将其加载到内存中。

是否可以直接将 LazyFrame 写入磁盘,并按顺序对数据集的块进行处理,以限制内存使用?

python-polars

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

如何在Python中将极地系列转换为熊猫系列?

如何在Python中将极地系列转换为熊猫系列?

我当前的解决方法是:

df = pl.DataFrame({"a":[1,1,2], "b":[2,2,3], "c":[1,2,3]})
df[["a"]].to_pandas()["a"]
Run Code Online (Sandbox Code Playgroud)

但是有没有办法直接从polls系列转到pandas系列呢?

我之所以需要这个是因为我将数据输入 statmodels.OLS 并希望使用变量名称而不是变量数字。当我直接从极坐标将数据输入 statmodels.OLS 时,出现以下错误:

unrecognized data structures: <class 'polars.internals.series.Series'> / <class 'polars.internals.frame.DataFrame'>
Run Code Online (Sandbox Code Playgroud)

python python-polars

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

在整个表格的组内排序

如果我有一个列,我可以使用该over方法在组内对该列进行排序。例如,

\n
import polars as pl\n\ndf = pl.DataFrame({\'group\': [2,2,1,1,2,2], \'value\': [3,4,3,1,1,3]})\n \ndf.with_column(pl.col(\'value\').sort().over(\'group\'))\n# shape: (6, 2)\n# \xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n# \xe2\x94\x82 group \xe2\x94\x86 value \xe2\x94\x82\n# \xe2\x94\x82 ---   \xe2\x94\x86 ---   \xe2\x94\x82\n# \xe2\x94\x82 i64   \xe2\x94\x86 i64   \xe2\x94\x82\n# \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n# \xe2\x94\x82 2     \xe2\x94\x86 1     \xe2\x94\x82\n# \xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n# \xe2\x94\x82 2     \xe2\x94\x86 3     \xe2\x94\x82\n# \xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n# \xe2\x94\x82 1     \xe2\x94\x86 1     \xe2\x94\x82\n# \xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n# \xe2\x94\x82 1     \xe2\x94\x86 3     \xe2\x94\x82\n# \xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n# \xe2\x94\x82 2     \xe2\x94\x86 3     \xe2\x94\x82\n# \xe2\x94\x9c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xbc\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x95\x8c\xe2\x94\xa4\n# \xe2\x94\x82 2     \xe2\x94\x86 4     \xe2\x94\x82\n# \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

该操作的优点在于它保持了组的顺序(例如,group=1 仍然是第 3 行和第 4 行;group=2 仍然是第 1、2、5 和 …

python-polars

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

Python Polars 解析纪元日期

如何将一列 i64 纪元字符串转换为极坐标中的日期?

我有一列 i64 代表自纪元以来的秒数,我想将它们解析为极坐标本机日期时间。

python python-polars

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

标签 统计

python-polars ×10

python ×7

dataframe ×2

datetime ×1

python-3.x ×1

scipy ×1