计算 Polars 列中某个值的分位数,又称为 Polars CDF

问题描述 投票:0回答:1

我想计算 Polars 列中每一行的分位数。 Polars 有一个分位数函数,用于计算对应于输入分位数的值(逆 CDF),但它似乎没有任何类型的经验 CDF 函数。

目前Polars有这个功能吗?

python-polars quantile cdf ecdf
1个回答
0
投票

您可以通过按相关值排序然后取

cum_count
/
count

来导出 ecdf

例如,让我们将其与plotly的ecdf进行比较

import polars as pl
import numpy as np
import plotly.express as px
import plotly.graph_objects as go

df=pl.DataFrame({'a':np.random.normal(10,5,1000)})
df_ecdf = df.sort('a').with_columns(
         ecdf=((pl.first().cum_count()+1)/(pl.count()))
)
myecdf=px.line(df_ecdf,
        x='a', y='ecdf')
myecdf.update_traces(line_color='red')
pxecdf=px.ecdf(df,
        x='a')
fig=go.Figure()
fig.add_trace(list(myecdf.select_traces())[0])
fig.add_trace(list(pxecdf.select_traces())[0])
fig.show()

Plotly 的 ecdf 似乎有更多的阶梯,我无法解释,如果我们放大到任意部分,它可以更容易看到......

也就是说,与 px.ecdf 相比,px.line 可能被过度平滑。

如果我们从

pxecdf
中提取数据,那么我们就可以进行数值比较。

compare=pl.DataFrame({'plotly_ecdf': pxecdf._data[0]['y'],
                      'plotly_x':pxecdf._data[0]['x']})

compare=df_ecdf.join(compare, left_on='a', right_on='plotly_x')
compare.select(diff=(pl.col('ecdf')-pl.col('plotly_ecdf')).abs().sum())
### returns 0

因此 px.ecdf 中的可见阶梯必须由 px.line 中的某些默认平滑驱动,该平滑未应用于 px.ecdf,因为它们在数值上是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.