You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从Pandas移植至Polars的代码无法正常运行?

Polars 替代 Pandas 代码的正确实现

问题分析

你当前的Polars代码存在两处关键错误:

  • 计算日期差时错误将数值类型的reorder_threshold转为Date类型,应该用时长(Duration)来做日期减法
  • 直接引用DataFrame列而非使用Polars表达式风格,不符合其API设计逻辑

修正后的完整代码

import polars as pl

data = {
    'transaction_date': ['2023-06-01', '2023-06-02', '2023-06-03'],
    'quantity_available': [0, 2, 1],
    'reorder_threshold': [5, 1, 3],
    'current_price': [10.0, 12.0, 8.0],
    'sold_price': [0.0, 15.0, 20.0],
}

# 初始化DataFrame并将日期列转为Date类型
df_product_data = pl.DataFrame(data).with_columns(
    pl.col("transaction_date").str.to_date().alias("transaction_date")
)

# 构建筛选掩码(推荐用表达式风格)
product_sold_out_mask = (
    (pl.col("quantity_available") == 0)
    & (pl.col("reorder_threshold") >= 0)
)

# 计算sold_out_date
df_product_data = df_product_data.with_columns(
    pl.when(product_sold_out_mask)
    .then(pl.col("transaction_date") - pl.duration(days=pl.col("reorder_threshold")))
    .otherwise(pl.lit(None, dtype=pl.Date))
    .alias("sold_out_date")
)

# 修正sold_price字段
df_product_data = df_product_data.with_columns(
    pl.when(pl.col("sold_price") <= 0)
    .then(pl.lit(-999.0))
    .when(pl.col("sold_price") > 2.0 * pl.col("current_price"))
    .then(pl.col("current_price"))
    .otherwise(pl.col("sold_price"))
    .alias("sold_price")
)

print(df_product_data)

关键修正点说明

  • 日期处理:用pl.duration(days=pl.col("reorder_threshold"))将数值转为天数时长,再与日期列做减法,这是Polars中日期偏移的正确方式
  • 表达式风格:全程使用pl.col()引用列,而非直接从DataFrame取列,Polars会对表达式做优化,提升性能
  • 类型明确:otherwise(pl.lit(None, dtype=pl.Date))明确指定空值类型为Date,避免类型推断问题
  • 数值类型统一:pl.lit(-999.0)用浮点型,保证与原sold_price类型一致

内容的提问来源于stack exchange,提问作者Rocky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:23:12