为什么要有"对账基准"
改口径、改代码、补录数据之后,怎么确定系统没算错?方法是留一套能反复核对的基准数字:同一批数据,用完全独立的方式再算一遍,结果对得上才放心。这篇讲统计层怎么算、以及怎么做对账。
唯一统计层
所有统计都在 rideshare_calc.py 里实现,对外提供三个核心函数:
daily_stats:单日 / 单班次month_stats:按月汇总year_stats:按年汇总
日报、周报、月报、年报、看板都调它,保证同一个指标处处算法一致。
归属规则(一切统计的前提)
- 出勤日(出门那天)= 一个班次。
- 收入、单数、工时、出勤天数全部按班次归属。
- 跨午夜的订单归出门日所在班次。
- 一个班次完整计入一个月,不再出现"跨月出勤日两个月都算"导致的天数重复。
核心指标怎么算
- 收入 = 实际到账(不是流水)。
- 总时薪 = 收入 ÷ 总外出时长。
- 有效时薪 = 收入 ÷ 有效跑单时长。
- 空等时长 = 总外出 − 有效跑单。
- 出勤天数 = 去重后的班次数。
一条关键规则:比率用原始量直算
算时薪、占比这类比率,一律用没有舍入过的分钟数直接算,禁止先把中间量四舍五入再除。先舍入会产生 0.01~0.03 的偏差,跨脚本对拍时会被误报成数据错误,样本越小越明显。
怎么对账
- 独立重算:直接用 SQL 读原始表,手写聚合,完全不 import 统计层,避免"同一个 bug 自己验自己"。
- 对拍:独立结果与统计层逐项比对,金额容忍 0.01 误差。
- 一致性脚本:跑 check_consistency.py,核对日报、月报、年报、看板四者数字同源。
基准数字放哪里
对账基准不手抄到文档里(手抄多份必然漂移),而是由 dump_baseline.py 直接从数据库现算,生成 BASELINE.md,作为"当前值"的唯一真源。脚本里的固定断言在每次封版时按这份基准校准。
冻结 vs 滚动
- 月报 = 月末定格快照,生成后不再随补录改变,重渲染旧月报等于篡改历史。
- 年报、看板 = 滚动值,随新数据增长重新生成。
对账时拿对应语义的数字去比,才不会出现"用历史快照对实时值"造成的假红。