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

咨询按t列分组求和x值绘制光谱图的Polars实现是否最优

按t分组求和x的实现优化建议

你需要绘制光谱图,核心需求是对x坐标做积分处理:将同一t值对应的所有x数据求和为单个值。

初始绘图代码

f, ax = plt.subplots(figsize=(8, 8))
ax.plot(
    dft.filter((pl.col("x") < 1_000) & (pl.col("t") < 15_000)).select(pl.col("x"))[:npts],
    dft.filter((pl.col("x") < 1_000) & (pl.col("t") < 15_000)).select(pl.col("t"))[:npts],
    ".",
    markersize=0.01,
);

初始绘图效果:
初始散点图

你编写的分组求和代码

grouped_data = (
    dft
    .filter((pl.col("x") < 1_000) & (pl.col("t") < 15_000))
    .groupby("t")
    .agg(pl.col("x").sum().alias("sum_x"))
)

# 绘制聚合后的数据
f, ax = plt.subplots(figsize=(12, 4))
ax.plot(
    grouped_data.select(pl.col("t")),
    grouped_data.select(pl.col("sum_x")),
    ".",
    markersize=1,
);

实现评价与优化建议

你的代码思路完全正确,而且已经是Polars中高效实现此类需求的标准写法——先过滤再分组聚合的顺序能最大限度减少处理的数据量,Polars的groupby+agg是矢量化操作,性能远高于循环处理。

可以做几个小优化让代码更简洁健壮:

  • 绘图时直接用列索引替代select,代码更简洁
  • 分组后添加sort("t"),确保绘图时数据按t的顺序排列,避免出现乱序的曲线
  • 若t是浮点型,存在精度误差导致分组错误的风险,可以考虑用round或分箱处理后再分组

优化后的代码:

grouped_data = (
    dft
    .filter((pl.col("x") < 1_000) & (pl.col("t") < 15_000))
    .groupby("t")
    .agg(pl.col("x").sum().alias("sum_x"))
    .sort("t")  # 按时间排序,保证绘图顺序正确
)

# 绘图优化:直接通过列名索引数据
f, ax = plt.subplots(figsize=(12, 4))
ax.plot(grouped_data["t"], grouped_data["sum_x"], ".", markersize=1);

内容的提问来源于stack exchange,提问作者Maxwell's Daemon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:22:42