如何在Polars中对delay轴分箱并聚合t值以生成目标曲线?
问题描述
我有一份实验数据集,绘制2D直方图时能看到一个特征:
2D直方图
可以注意到,在x轴218.46附近、y轴86000附近的区域存在异常特征。
我用以下代码对数据集进行过滤和聚合:
edc = ( df_TR.filter( (pl.col("t") > 85_700) & (pl.col("t") < 86_090) & (pl.col("delay") > 218.30) & (pl.col("delay") < 218.72) ) .group_by("delay").agg(pl.col("t").sum().alias("sum_t") )
得到的绘图代码及结果如下:
f, ax = plt.subplots() ax.plot(edc["delay"], edc["sum_t"], ".") ax.set_ylim(0, 1e7);
但这并非我想要的结果,我需要在过滤/分组后对数据进行分箱,生成类似下图的结果(忽略拟合部分,该图来自另一实验):
目标分箱绘图示例
我需要对delay轴进行分箱,并在每个分箱内对所有t值求和(或取平均),但不清楚Polars中如何实现分箱操作。
解决方案
Polars提供了多种分箱实现方式,以下是两种常用方案:
1. 固定宽度分箱(pl.bin())
若需按固定步长对delay分箱,可使用pl.bin()指定步长,代码示例:
# 按步长0.02对delay分箱,每个分箱内求和t edc = ( df_TR.filter( (pl.col("t") > 85_700) & (pl.col("t") < 86_090) & (pl.col("delay") > 218.30) & (pl.col("delay") < 218.72) ) .with_columns( delay_bin=pl.col("delay").bin(bin_width=0.02) ) .group_by("delay_bin") .agg( pl.col("t").sum().alias("sum_t"), # 可选:计算分箱中心值,用于绘图时的x轴 delay_center=pl.col("delay").mean() ) )
2. 自定义边界分箱(pl.cut())
若需手动指定分箱边界,可使用pl.cut()实现,代码示例:
# 自定义分箱边界:从218.3到218.72,间隔0.02 bins = pl.arange(218.30, 218.73, 0.02) edc = ( df_TR.filter( (pl.col("t") > 85_700) & (pl.col("t") < 86_090) & (pl.col("delay") > 218.30) & (pl.col("delay") < 218.72) ) .with_columns( delay_bin=pl.col("delay").cut(bins=bins, include_boundaries=True) ) .group_by("delay_bin") .agg( pl.col("t").sum().alias("sum_t"), delay_center=pl.col("delay").mean() ) )
绘图代码
分箱聚合完成后,用分箱中心值绘制曲线即可得到类似目标图的效果:
f, ax = plt.subplots() ax.plot(edc["delay_center"], edc["sum_t"], "-o") ax.set_ylim(0, 1e7);
可根据需求调整分箱步长或边界范围,适配数据特征。
内容的提问来源于stack exchange,提问作者Maxwell's Daemon
相关产品推荐
相关产品推荐

