咨询按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
相关产品推荐
相关产品推荐

