RustPython / RustPython/pymath

Add statistics module: Mathematical statistics functions

未关闭
#17 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Rust
星标
12
派生
1
平均合并
8 分钟
30 天内合并 PR
1

描述

Summary

Port Python's statistics module to Rust — averages, measures of spread, and probability distributions.

In CPython this is a pure Python implementation (Lib/statistics.py) that heavily uses fractions.Fraction internally for exact intermediate arithmetic to avoid cumulative rounding errors.

Public API (21 items)

Central tendency
  • mean(data) — arithmetic mean (exact via Fraction)
  • fmean(data, weights=None) — fast float mean (via fsum)
  • geometric_mean(data) — geometric mean (via log/exp)
  • harmonic_mean(data, weights=None) — harmonic mean
  • median(data) — median (average of middle two for even length)
  • median_low(data) / median_high(data) — low/high median
  • median_grouped(data, interval=1.0) — grouped data median
  • mode(data) — single most common value
  • multimode(data) — all modes
  • quantiles(data, *, n=4, method='exclusive') — cut points
Spread
  • variance(data, xbar=None) — sample variance
  • pvariance(data, mu=None) — population variance
  • stdev(data, xbar=None) — sample standard deviation
  • pstdev(data, mu=None) — population standard deviation
Bivariate
  • covariance(x, y) — sample covariance
  • correlation(x, y, *, method='linear') — Pearson or Spearman correlation
  • linear_regression(x, y, *, proportional=False) — OLS regression
Kernel density estimation
  • kde(data, h, kernel='normal', *, cumulative=False) — returns PDF/CDF callable
  • kde_random(data, h, kernel='normal', *, seed=None) — returns sampling callable
Distribution
  • NormalDist(mu=0.0, sigma=1.0) — normal distribution class
    • Methods: pdf, cdf, inv_cdf, overlap, zscore, samples, quantiles
    • Class method: from_samples(data)
    • Arithmetic: +, -, *, / with scalars and other NormalDist
Exception
  • StatisticsError (subclass of ValueError)

Key design considerations

Dependency on fractions

CPython's statistics module uses Fraction internally for exact arithmetic in mean, variance, stdev, harmonic_mean, covariance, correlation, and linear_regression. This means the fractions module (#16) should be implemented first, or at minimum concurrently.

Precision strategy
Function group CPython approach Rust approach
mean, variance, harmonic_mean Fraction-exact intermediate arithmetic Use Fraction<BigInt> from #16
fmean, geometric_mean Float with fsum/log-exp Use math::fsum (already in pymath)
stdev, pstdev _float_sqrt_of_frac(n, d) specialized sqrt Implement equivalent
NormalDist.inv_cdf Wichura's Algorithm AS241 (rational approximations) Direct port of the piecewise approximation
Type system

CPython statistics functions are polymorphic over int, float, Fraction, and Decimal. For the Rust port, the initial scope should focus on f64 inputs with exact Fraction-based intermediates where CPython does so, and return f64. Full type polymorphism can be added later via generics.

Implementation plan

Phase 1: Core averages (depends on #16)
  • Internal _sum() helper using Fraction for exact summation
  • mean, fmean, geometric_mean, harmonic_mean
  • StatisticsError error type
Phase 2: Median & mode
  • median, median_low, median_high, median_grouped
  • mode, multimode
  • quantiles (exclusive and inclusive methods)
Phase 3: Variance & standard deviation
  • Internal _ss() helper (sum of squared deviations via Fraction)
  • variance, pvariance, stdev, pstdev
  • _float_sqrt_of_frac() for precision-preserving sqrt
Phase 4: Bivariate statistics
  • covariance
  • correlation (linear and ranked methods)
  • linear_regression (with proportional option)
Phase 5: NormalDist
  • Constructor, properties (mean, median, mode, stdev, variance)
  • pdf, cdf (via erf from math::erf)
  • inv_cdf (Wichura's Algorithm AS241)
  • overlap, zscore
  • Arithmetic operators
  • from_samples, samples, quantiles
Phase 6: KDE
  • kde with all kernel types (normal, logistic, rectangular, triangular, etc.)
  • kde_random
  • Cumulative mode support
Phase 7: Testing
  • pyo3 proptest against CPython statistics module
  • Edge cases: empty data, single element, identical values, NaN/Inf handling
  • Precision verification for Fraction-based functions

Feature flag

[features]
statistics = ["fractions"]  # depends on fractions module

Out of scope

  • Decimal input support (separate concern)
  • random module dependency for sampling (NormalDist.samples, kde_random)

References

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 CPython's Lib/statistics.py 和 fractions 模块的 issue (#16) 开始,然后检查 pymath fsum 实现以及提议的 statistics feature flag。在实现之前定义分阶段的 API 和依赖边界;完成的标准是完成列出的阶段,以及针对 CPython 的 pyo3 property tests,包括边界情况和精度检查。

由索引模型根据 Issue 内容生成。

评估

技术栈
python, rust
领域
data
Issue 类型
功能
难度
5/5
预计耗时
一周以上
活跃度
停滞
描述清晰度
基本清楚
新手友好度
30/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。