我想计算 Polars 列中每一行的分位数。 Polars 有一个分位数函数,用于计算对应于输入分位数的值(逆 CDF),但它似乎没有任何类型的经验 CDF 函数。
目前Polars有这个功能吗?
您可以通过按相关值排序然后取
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,因为它们在数值上是相同的。