跳到正文
选择国家与语言当前国家: 中国

德勤 Virtual Internship / 任务 04

实习猿原创实训 · 任务 04

服务时效差异审查

控制服务结构和样本量差异,给出站点复核优先级及有边界的解释。

先查看已完成的成果,再使用材料完成自己的交付。

先阅读完整成果

材料

learner/checkpoints/order-review.csv 阅读完整文件下载文件
order_idhubserviceroutecreated_atdue_atcohortlate_minutesoverdue_minutes
O0001海港standardR112026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0002海港standardR122026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late500
O0003海港standardR112026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0004海港standardR122026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0005海港standardR112026-09-05T10:00:00Z2026-09-06T10:00:00Zdelivered_late500
O0006海港standardR122026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0007海港standardR112026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0008海港standardR122026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late500
O0009海港standardR112026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0010海港standardR122026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0011海港standardR112026-09-11T08:00:00Z2026-09-12T08:00:00Zdelivered_late500
O0012海港standardR122026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0013海港standardR112026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0014海港standardR122026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late500
O0015海港standardR112026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0016海港standardR122026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0017海港standardR112026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late500
O0018海港standardR122026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0019海港standardR112026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0020海港standardR122026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late500
O0021海港standardR112026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0022海港standardR122026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0023海港standardR112026-09-10T12:00:00Z2026-09-11T12:00:00Zdelivered_late500
O0024海港standardR122026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0025海港standardR112026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0026海港standardR122026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late500
O0027海港standardR112026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0028海港standardR122026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0029海港standardR112026-09-03T10:00:00Z2026-09-04T10:00:00Zdelivered_late500
O0030海港standardR122026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0031海港standardR112026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0032海港standardR122026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late500
O0033海港standardR112026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0034海港standardR122026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0035海港standardR112026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0036海港standardR122026-09-10T09:00:00Z2026-09-11T09:00:00Zon_time00
O0037海港standardR112026-09-11T10:00:00Z2026-09-12T10:00:00Zon_time00
O0038海港standardR122026-09-12T11:00:00Z2026-09-13T11:00:00Zdelivered_late500
O0039海港standardR112026-09-13T12:00:00Z2026-09-14T12:00:00Zon_time00
O0040海港standardR122026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0041海港expressR112026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0042海港expressR122026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late500
O0043海港expressR112026-09-03T08:00:00Z2026-09-03T16:00:00Zdelivered_late500
O0044海港expressR122026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late500
O0045海港expressR112026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late500
O0046海港expressR122026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late500
O0047海港expressR112026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late500
O0048海港expressR122026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late500
O0049海港expressR112026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late500
O0050海港expressR122026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late500
O0051海港expressR112026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late500
O0052海港expressR122026-09-12T09:00:00Z2026-09-12T17:00:00Zdelivered_late500
O0053海港expressR112026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late500
O0054海港expressR122026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late500
O0055海港expressR112026-09-02T12:00:00Z2026-09-02T20:00:00Zdelivered_late500
O0056海港expressR122026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late500
O0057海港expressR112026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late500
O0058海港expressR122026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0059海港expressR112026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late500
O0060海港expressR122026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0061东城standardR212026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0062东城standardR222026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late700
O0063东城standardR212026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0064东城standardR222026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0065东城standardR212026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0066东城standardR222026-09-06T11:00:00Z2026-09-07T11:00:00Zdelivered_late700
O0067东城standardR212026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0068东城standardR222026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0069东城standardR212026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0070东城standardR222026-09-10T07:00:00Z2026-09-11T07:00:00Zdelivered_late700
O0071东城standardR212026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0072东城standardR222026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0073东城standardR212026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0074东城standardR222026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late700
O0075东城standardR212026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0076东城standardR222026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0077东城standardR212026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0078东城standardR222026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0079东城standardR212026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0080东城standardR222026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0081东城expressR212026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0082东城expressR222026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late700
O0083东城expressR212026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0084东城expressR222026-09-04T09:00:00Z2026-09-04T17:00:00Zdelivered_late700
O0085东城expressR212026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late700
O0086东城expressR222026-09-06T11:00:00Z2026-09-06T19:00:00Zon_time00
O0087东城expressR212026-09-07T12:00:00Z2026-09-07T20:00:00Zdelivered_late700
O0088东城expressR222026-09-08T13:00:00Z2026-09-08T21:00:00Zdelivered_late700
O0089东城expressR212026-09-09T06:00:00Z2026-09-09T14:00:00Zon_time00
O0090东城expressR222026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late700
O0091东城expressR212026-09-11T08:00:00Z2026-09-11T16:00:00Zdelivered_late700
O0092东城expressR222026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0093东城expressR212026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late700
O0094东城expressR222026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late700
O0095东城expressR212026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0096东城expressR222026-09-03T13:00:00Z2026-09-03T21:00:00Zdelivered_late700
O0097东城expressR212026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late700
O0098东城expressR222026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0099东城expressR212026-09-06T08:00:00Z2026-09-06T16:00:00Zdelivered_late700
O0100东城expressR222026-09-07T09:00:00Z2026-09-07T17:00:00Zdelivered_late700
O0101东城expressR212026-09-08T10:00:00Z2026-09-08T18:00:00Zon_time00
O0102东城expressR222026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late700
O0103东城expressR212026-09-10T12:00:00Z2026-09-10T20:00:00Zdelivered_late700
O0104东城expressR222026-09-11T13:00:00Z2026-09-11T21:00:00Zon_time00
O0105东城expressR212026-09-12T06:00:00Z2026-09-12T14:00:00Zdelivered_late700
O0106东城expressR222026-09-13T07:00:00Z2026-09-13T15:00:00Zdelivered_late700
O0107东城expressR212026-09-01T08:00:00Z2026-09-01T16:00:00Zon_time00
O0108东城expressR222026-09-02T09:00:00Z2026-09-02T17:00:00Zdelivered_late700
O0109东城expressR212026-09-03T10:00:00Z2026-09-03T18:00:00Zdelivered_late700
O0110东城expressR222026-09-04T11:00:00Z2026-09-04T19:00:00Zcancelled00
O0111东城expressR212026-09-05T12:00:00Z2026-09-05T20:00:00Zdelivered_late700
O0112东城expressR222026-09-06T13:00:00Z2026-09-06T21:00:00Zdelivered_late700
O0113东城expressR212026-09-07T06:00:00Z2026-09-07T14:00:00Zon_time00
O0114东城expressR222026-09-08T07:00:00Z2026-09-08T15:00:00Zdelivered_late700
O0115东城expressR212026-09-09T08:00:00Z2026-09-09T16:00:00Zoverdue_open07680
O0116东城expressR222026-09-10T09:00:00Z2026-09-10T17:00:00Zon_time00
O0117东城expressR212026-09-11T10:00:00Z2026-09-11T18:00:00Zdelivered_late700
O0118东城expressR222026-09-12T11:00:00Z2026-09-12T19:00:00Zdelivered_late700
O0119东城expressR212026-09-13T12:00:00Z2026-09-13T20:00:00Zon_time00
O0120东城expressR222026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0121西岭standardR312026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0122西岭standardR322026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late900
O0123西岭standardR312026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0124西岭standardR322026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0125西岭standardR312026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0126西岭standardR322026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0127西岭standardR312026-09-07T12:00:00Z2026-09-08T12:00:00Zdelivered_late900
O0128西岭standardR322026-09-08T13:00:00Z2026-09-09T13:00:00Zon_time00
O0129西岭standardR312026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0130西岭standardR322026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0131西岭standardR312026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0132西岭standardR322026-09-12T09:00:00Z2026-09-13T09:00:00Zdelivered_late900
O0133西岭standardR312026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0134西岭standardR322026-09-01T11:00:00Z2026-09-02T11:00:00Zon_time00
O0135西岭standardR312026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0136西岭standardR322026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0137西岭standardR312026-09-04T06:00:00Z2026-09-05T06:00:00Zdelivered_late900
O0138西岭standardR322026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0139西岭standardR312026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0140西岭standardR322026-09-07T09:00:00Z2026-09-08T09:00:00Zon_time00
O0141西岭standardR312026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0142西岭standardR322026-09-09T11:00:00Z2026-09-10T11:00:00Zdelivered_late900
O0143西岭standardR312026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0144西岭standardR322026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0145西岭standardR312026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0146西岭standardR322026-09-13T07:00:00Z2026-09-14T07:00:00Zon_time00
O0147西岭standardR312026-09-01T08:00:00Z2026-09-02T08:00:00Zdelivered_late900
O0148西岭standardR322026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0149西岭standardR312026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0150西岭standardR322026-09-04T11:00:00Z2026-09-05T11:00:00Zcancelled00
O0151西岭standardR312026-09-05T12:00:00Z2026-09-06T12:00:00Zon_time00
O0152西岭standardR322026-09-06T13:00:00Z2026-09-07T13:00:00Zdelivered_late900
O0153西岭standardR312026-09-07T06:00:00Z2026-09-08T06:00:00Zon_time00
O0154西岭standardR322026-09-08T07:00:00Z2026-09-09T07:00:00Zon_time00
O0155西岭standardR312026-09-09T08:00:00Z2026-09-10T08:00:00Zoverdue_open06720
O0156西岭standardR322026-09-14T21:00:00Z2026-09-15T21:00:00Znot_mature00
O0157西岭expressR312026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0158西岭expressR322026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late900
O0159西岭expressR312026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0160西岭expressR322026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0161西岭expressR312026-09-05T10:00:00Z2026-09-05T18:00:00Zdelivered_late900
O0162西岭expressR322026-09-06T11:00:00Z2026-09-06T19:00:00Zdelivered_late900
O0163西岭expressR312026-09-07T12:00:00Z2026-09-07T20:00:00Zon_time00
O0164西岭expressR322026-09-08T13:00:00Z2026-09-08T21:00:00Zon_time00
O0165西岭expressR312026-09-09T06:00:00Z2026-09-09T14:00:00Zdelivered_late900
O0166西岭expressR322026-09-10T07:00:00Z2026-09-10T15:00:00Zdelivered_late900
O0167西岭expressR312026-09-11T08:00:00Z2026-09-11T16:00:00Zon_time00
O0168西岭expressR322026-09-12T09:00:00Z2026-09-12T17:00:00Zon_time00
O0169西岭expressR312026-09-13T10:00:00Z2026-09-13T18:00:00Zdelivered_late900
O0170西岭expressR322026-09-01T11:00:00Z2026-09-01T19:00:00Zdelivered_late900
O0171西岭expressR312026-09-02T12:00:00Z2026-09-02T20:00:00Zon_time00
O0172西岭expressR322026-09-03T13:00:00Z2026-09-03T21:00:00Zon_time00
O0173西岭expressR312026-09-04T06:00:00Z2026-09-04T14:00:00Zdelivered_late900
O0174西岭expressR322026-09-05T07:00:00Z2026-09-05T15:00:00Zoverdue_open013500
O0175西岭expressR312026-09-06T08:00:00Z2026-09-06T16:00:00Zon_time00
O0176西岭expressR322026-09-07T09:00:00Z2026-09-07T17:00:00Zon_time00
O0177西岭expressR312026-09-08T10:00:00Z2026-09-08T18:00:00Zdelivered_late900
O0178西岭expressR322026-09-09T11:00:00Z2026-09-09T19:00:00Zdelivered_late900
O0179西岭expressR312026-09-10T12:00:00Z2026-09-10T20:00:00Zon_time00
O0180西岭expressR322026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
O0181南湾standardR412026-09-01T06:00:00Z2026-09-02T06:00:00Zcancelled00
O0182南湾standardR422026-09-02T07:00:00Z2026-09-03T07:00:00Zdelivered_late1100
O0183南湾standardR412026-09-03T08:00:00Z2026-09-04T08:00:00Zon_time00
O0184南湾standardR422026-09-04T09:00:00Z2026-09-05T09:00:00Zon_time00
O0185南湾standardR412026-09-05T10:00:00Z2026-09-06T10:00:00Zon_time00
O0186南湾standardR422026-09-06T11:00:00Z2026-09-07T11:00:00Zon_time00
O0187南湾standardR412026-09-07T12:00:00Z2026-09-08T12:00:00Zon_time00
O0188南湾standardR422026-09-08T13:00:00Z2026-09-09T13:00:00Zdelivered_late1100
O0189南湾standardR412026-09-09T06:00:00Z2026-09-10T06:00:00Zon_time00
O0190南湾standardR422026-09-10T07:00:00Z2026-09-11T07:00:00Zon_time00
O0191南湾standardR412026-09-11T08:00:00Z2026-09-12T08:00:00Zon_time00
O0192南湾standardR422026-09-12T09:00:00Z2026-09-13T09:00:00Zon_time00
O0193南湾standardR412026-09-13T10:00:00Z2026-09-14T10:00:00Zon_time00
O0194南湾standardR422026-09-01T11:00:00Z2026-09-02T11:00:00Zdelivered_late1100
O0195南湾standardR412026-09-02T12:00:00Z2026-09-03T12:00:00Zon_time00
O0196南湾standardR422026-09-03T13:00:00Z2026-09-04T13:00:00Zon_time00
O0197南湾standardR412026-09-04T06:00:00Z2026-09-05T06:00:00Zon_time00
O0198南湾standardR422026-09-05T07:00:00Z2026-09-06T07:00:00Zoverdue_open012540
O0199南湾standardR412026-09-06T08:00:00Z2026-09-07T08:00:00Zon_time00
O0200南湾standardR422026-09-07T09:00:00Z2026-09-08T09:00:00Zdelivered_late1100
O0201南湾standardR412026-09-08T10:00:00Z2026-09-09T10:00:00Zon_time00
O0202南湾standardR422026-09-09T11:00:00Z2026-09-10T11:00:00Zon_time00
O0203南湾standardR412026-09-10T12:00:00Z2026-09-11T12:00:00Zon_time00
O0204南湾standardR422026-09-11T13:00:00Z2026-09-12T13:00:00Zon_time00
O0205南湾standardR412026-09-12T06:00:00Z2026-09-13T06:00:00Zon_time00
O0206南湾standardR422026-09-13T07:00:00Z2026-09-14T07:00:00Zdelivered_late1100
O0207南湾standardR412026-09-01T08:00:00Z2026-09-02T08:00:00Zon_time00
O0208南湾standardR422026-09-02T09:00:00Z2026-09-03T09:00:00Zon_time00
O0209南湾standardR412026-09-03T10:00:00Z2026-09-04T10:00:00Zon_time00
O0210南湾standardR422026-09-14T21:00:00Z2026-09-15T21:00:00Zcancelled00
O0211南湾expressR412026-09-01T06:00:00Z2026-09-01T14:00:00Zcancelled00
O0212南湾expressR422026-09-02T07:00:00Z2026-09-02T15:00:00Zdelivered_late1100
O0213南湾expressR412026-09-03T08:00:00Z2026-09-03T16:00:00Zon_time00
O0214南湾expressR422026-09-04T09:00:00Z2026-09-04T17:00:00Zon_time00
O0215南湾expressR412026-09-05T10:00:00Z2026-09-05T18:00:00Zon_time00
O0216南湾expressR422026-09-14T21:00:00Z2026-09-15T05:00:00Znot_mature00
learner/materials/rules.json 阅读完整文件下载文件
{
  "cutoff": "2026-09-15T00:00:00Z",
  "late_target": 0.1,
  "min_sample": 15,
  "review_gap_pp": 5,
  "priority_gap_pp": 15,
  "standard_weight": 0.5,
  "express_weight": 0.5
}
learner/materials/data-dictionary.md 阅读完整文件下载文件

数据字典与口径

业务工作单

你加入冷链履约运营项目组。运营负责人需要回答:哪些订单与站点需要先处理、导出接口哪里存在控制缺口,以及下一版工作台应交付什么。四个站点为海港、东城、西岭、南湾。standard 承诺 24 h,express 承诺 8 h;具体截止时间以 orders.csv 的 due_at 为准。

材料覆盖 2026 年 9 月的订单及事件,统一复盘截止点为 rules.json 的 cutoff。所有业务时间转 UTC;本地显示时可以换时区,但计算不能把无时区字符串当成本地时间。输入可包含截止点之后的事件,用于检查是否错误使用未来信息。

orders.csv

  • order_id:唯一订单号,字符串,不转成数字。
  • hub:站点名;service:standard/express;route:线路编号。
  • created_at:带时区的下单时刻;due_at:承诺交付时刻,UTC ISO 8601。
  • 一行代表一个订单,事件不等于订单;不要按事件行数统计订单。

两个事件源

  • A:event_id → event_id;order_ref → order_id;hub → hub;service → service;event → kind;event_time → happened_at。
  • B:id → event_id;shipment.number → order_id;shipment.station → hub;shipment.product → service;action 的 OPEN/COLLECT/DROP/VOID 映射 created/picked_up/delivered/cancelled;at_ms 为整数 Unix 毫秒,输出为 UTC ISO 时间。
  • 标准事件必须且只需包含 event_id、order_id、hub、service、kind、happened_at。来源文件与行号写入异常/重复清单。
  • 同 event_id 标准内容完全相同:只留一条,其他计 exact_replay。同 event_id 内容不同:整组隔离,不能先到先得。坏字段、未知动作或无时区时间:隔离并保留来源及原因。
  • 禁止原地修改原始材料。对账:原始事件数 = 标准事件数 + 隔离记录数 + 重复剔除数。

截止日履约口径

按订单聚合,先只保留 happened_at ≤ cutoff 的事件。取消单优先排除;due_at > cutoff 的非取消单记 not_mature。其他订单:截止前无交付记 overdue_open;首次交付时刻 > due_at 记 delivered_late;其余 on_time。恰好到期算成熟,恰好交付算准时。

成熟分母 = on_time + delivered_late + overdue_open。迟交分子 = delivered_late + overdue_open。取消与未到期均不得填为准时。已交付迟交分钟按交付时间减 due_at,未交付逾期分钟按 cutoff 减 due_at,两者单列。此材料不包含退款、食物损坏或实际成本,不能推出这些金额。

服务审查口径

rules.json 固定目标迟交率为 10%,最小成熟样本 15。差距用百分点,不用百分比变化。成熟样本 <15 优先归“待补样本”;差距 >15 个百分点归“优先处理”;>5 且 ≤15 归“需要复核”;≤5 归“达到阈值”。这些是本次运营审查规则,不是统计显著性或公平性的证明。

统一服务结构比较:standard 和 express 各 50% 权重。两个服务层均满足最小样本才计算站点标准化迟交率;否则保留空值并说明缺口。不得用无依据的总体平均填补小样本。业务假设须与观察事实分开。

访问日志与授权策略

access-log.csv 一行一个请求。request_id 唯一;at 为 UTC;user、session、role 为请求上下文;method、path 为路由;status 为响应码;rows、bytes 是网关响应计数。它们不证明唯一客户数,也不证明接收者已使用数据。

access-policy.json 是本次调查的授权基线。operator 只能读取被授权站点,不能 export。supervisor 与 service 允许导出。登录成功后 session 有效 30 分钟,恰好 30 分钟有效;之后应拒绝。401 请求代表被拒绝的尝试,不是成功泄露。svc-archive 是批准的归档账号,频繁大批导出不能只因次数高就定性。日志没有文件正文、终端取证或 VPN 会话记录,不能据此归属自然人、地理位置或入口路径。

步骤

  1. 先按 hub×service 汇总成熟数与迟交数。可用表格透视或 Python;直接使用订单表,不从已汇总百分比反推人数。
  1. 计算 late/eligible,与 10% 目标相减后乘 100 得 gap_pp。按字典先判样本,再判 >15、>5 的区间;为 5、15 的恰好值补测试。
  1. 输出 service-review.csv,保留每格的样本量、迟交数、比例、目标、百分点差与建议。
  1. 按 standard 50%+express 50% 重新计算每个站点的标准化迟交率;任一层样本不足 15,整站比较值为空并显示待补样本。
  1. 并排比较原始率与标准化率,解释东城 express 占比较高的影响;不要将标准化当成因果证明。
  1. 写 review-memo.md,明确南湾缺少哪一层、还需多少条成熟订单,给出运营复核行动与不能得出的结论。

完整成果

服务时效差异审查备忘录

复核顺序

海港 express(18/18)与海港 standard(14/37)应先复核。东城 express(26/37)也需优先处理。南湾 express 只有 4 条成熟订单,1 条迟交,先补样本,不能按 25% 做稳定的站点排名。

站点原始迟交率统一服务结构后的迟交率
东城56.36%49.02%
南湾21.88%待补样本
海港58.18%68.92%
西岭36.36%38.64%

计算与解释

每格迟交率为 late/eligible,目标为 10%;gap_pp = (late_rate − 0.10) × 100。样本不足先归“待补样本”,再按 >15、>5 判定。恰好差 15 个百分点属于“需要复核”,不是“优先处理”;恰好差 5 属于“达到阈值”。

统一结构率 = 0.5 × standard 率 + 0.5 × express 率。东城 express 占成熟订单的 37/55,原始率 56.36%;改用相等权重后为 49.02%。海港 express 只占 18/55,统一权重后由 58.18% 上升至 68.92%。服务结构会影响总体比较,不应把原始差异全部解释为站点表现。

数据缺口与下一步

南湾 express 至少还需 11 条成熟订单才能达到本次 15 条门槛;新增结果可能改变当前比例。补数据时固定同一时段、订单口径和观察窗口,并保留取消与未到期记录。达到 15 只是业务复核门槛,不是统计显著性证明。

本次比较不含天气、线路距离、客户预约或班次因素,不足以归责个人、证明不公平或预测改善效果。下一步核对海港 express 的发车班次和交接扫描,比较同路线/服务/时段后再提出流程实验。

下载文件

参考答案

instructor/answers/service-review.csv 阅读完整文件下载文件
hubserviceeligiblelatelate_ratetargetgap_ppreview
东城express37260.7027030.160.27优先处理
东城standard1850.2777780.117.778优先处理
南湾express410.250.115.0待补样本
南湾standard2860.2142860.111.429需要复核
海港express18181.00.190.0优先处理
海港standard37140.3783780.127.838优先处理
西岭express22110.50.140.0优先处理
西岭standard3390.2727270.117.273优先处理
instructor/answers/standardized-comparison.csv 阅读完整文件下载文件
hubstandardized_late_ratestatus
东城0.49024可比较
南湾待补样本
海港0.689189可比较
西岭0.386363可比较
完整参考实现 阅读完整文件下载文件
"""Reference implementation for the Ape Intern cold-chain operations lab."""
import csv,json
from collections import defaultdict,Counter
from datetime import datetime,timezone
from pathlib import Path
from urllib.parse import urlparse,parse_qs
UTC=timezone.utc
KINDS={'OPEN':'created','COLLECT':'picked_up','DROP':'delivered','VOID':'cancelled'}
HUBS={'海港','东城','西岭','南湾'}
def parse_time(value):
    t=datetime.fromisoformat(value.replace('Z','+00:00'))
    if t.tzinfo is None:raise ValueError('timezone_required')
    return t.astimezone(UTC)
def iso(t):return t.isoformat(timespec='seconds').replace('+00:00','Z')
def readcsv(p):
    with Path(p).open(encoding='utf-8-sig',newline='') as f:return list(csv.DictReader(f))
def writecsv(p,rows,fields=None):
    rows=list(rows)
    with Path(p).open('w',encoding='utf-8-sig',newline='') as f:
        w=csv.DictWriter(f,fieldnames=fields or list(rows[0]));w.writeheader();w.writerows(rows)
def dump(p,value):Path(p).write_text(json.dumps(value,ensure_ascii=False,indent=2)+'\n')
def _normalize(record,source):
    if source=='A':
        e=dict(event_id=record['event_id'],order_id=record['order_ref'],hub=record['hub'],service=record['service'],kind=record['event'],happened_at=iso(parse_time(record['event_time'])))
    else:
        ms=record['at_ms']
        if type(ms) is not int:raise ValueError('epoch_must_be_integer')
        e=dict(event_id=record['id'],order_id=record['shipment']['number'],hub=record['shipment']['station'],service=record['shipment']['product'],kind=KINDS[record['action']],happened_at=iso(datetime.fromtimestamp(ms/1000,UTC)))
    if e['kind'] not in KINDS.values():raise ValueError('unsupported_event')
    if e['hub'] not in HUBS or e['service'] not in {'standard','express'}:raise ValueError('unknown_dimension')
    if not e['event_id'] or not e['order_id']:raise ValueError('empty_key')
    return e

def normalize(record,source):
    try:return _normalize(record,source)
    except (KeyError,TypeError,OverflowError) as error:raise ValueError(str(error).strip("'")) from error

def ingest(data):
    grouped=defaultdict(list);rejected=[];duplicates=[]
    for source,name in [('A','dispatch-a.jsonl'),('B','courier-b.jsonl')]:
        for line,text in enumerate((data/name).read_text().splitlines(),1):
            loc={'source':name,'line':line}
            try:
                event=normalize(json.loads(text),source);grouped[event['event_id']].append((event,loc))
            except (ValueError,KeyError,TypeError,OverflowError) as ex:
                rejected.append(dict(loc,reason=str(ex).strip("'")))
    accepted=[]
    for eid,items in grouped.items():
        distinct={json.dumps(e,sort_keys=True,ensure_ascii=False) for e,loc in items}
        if len(distinct)>1:
            rejected.extend(dict(loc,reason='immutable_id_conflict') for e,loc in items);continue
        accepted.append(items[0][0])
        duplicates.extend(dict(loc,event_id=eid,reason='exact_replay') for e,loc in items[1:])
    accepted.sort(key=lambda e:(e['happened_at'],e['event_id']))
    return accepted,rejected,duplicates

def classify_order(order,events,cutoff):
    # Only facts available at cutoff can influence a retrospective result.
    visible=[e for e in events if parse_time(e['happened_at'])<=cutoff]
    visible.sort(key=lambda e:parse_time(e['happened_at']))
    delivered=[parse_time(e['happened_at']) for e in visible if e['kind']=='delivered']
    cancelled=any(e['kind']=='cancelled' for e in visible)
    due=parse_time(order['due_at'])
    if cancelled:state='cancelled'
    elif due>cutoff:state='not_mature'
    elif not delivered:state='overdue_open'
    elif min(delivered)>due:state='delivered_late'
    else:state='on_time'
    delay=round((min(delivered)-due).total_seconds()/60) if state=='delivered_late' else 0
    overdue=round((cutoff-due).total_seconds()/60) if state=='overdue_open' else 0
    return dict(order,cohort=state,late_minutes=delay,overdue_minutes=overdue)

def aggregate(rows,keys):
    groups=defaultdict(list)
    for row in rows:groups[tuple(row[k] for k in keys)].append(row)
    result=[]
    for dims,records in sorted(groups.items()):
        counts=Counter(r['cohort'] for r in records)
        eligible=sum(counts[x] for x in ['on_time','delivered_late','overdue_open'])
        late=counts['delivered_late']+counts['overdue_open']
        result.append(dict(zip(keys,dims),total=len(records),eligible=eligible,late=late,late_rate=round(late/eligible,6) if eligible else None,on_time=counts['on_time'],delivered_late=counts['delivered_late'],overdue_open=counts['overdue_open'],cancelled=counts['cancelled'],not_mature=counts['not_mature'],delivered_late_minutes=sum(r['late_minutes'] for r in records),open_overdue_minutes=sum(r['overdue_minutes'] for r in records)))
    return result

def service_band(rate,n,rules):
    if n<rules['min_sample']:return '待补样本'
    gap=(rate-rules['late_target'])*100
    if gap>rules['priority_gap_pp']:return '优先处理'
    if gap>rules['review_gap_pp']:return '需要复核'
    return '达到阈值'
def fairness(hub_tiers,rules):
    rows=[]
    for x in hub_tiers:
        rate=x['late_rate'];rows.append(dict(hub=x['hub'],service=x['service'],eligible=x['eligible'],late=x['late'],late_rate=rate,target=rules['late_target'],gap_pp=round((rate-rules['late_target'])*100,3) if rate is not None else None,review=service_band(rate,x['eligible'],rules)))
    standardized=[]
    for hub in sorted(HUBS):
        parts=[r for r in rows if r['hub']==hub]
        enough=len(parts)==2 and all(r['eligible']>=rules['min_sample'] for r in parts)
        value=sum(r['late_rate']*rules[r['service']+'_weight'] for r in parts) if enough else None
        standardized.append(dict(hub=hub,standardized_late_rate=round(value,6) if value is not None else None,status='可比较' if enough else '待补样本'))
    return rows,standardized

def investigate(logs,policy):
    logins={};findings=[]
    for row in sorted(logs,key=lambda r:(r['at'],r['request_id'])):
        t=parse_time(row['at']);status=int(row['status']);route=urlparse(row['path']);query=parse_qs(route.query)
        if route.path=='/login' and status==200:logins[(row['user'],row['session'])]=t;continue
        if status!=200:continue
        types=[]
        if route.path=='/export' and row['role'] not in policy['export_roles']:types.append('unauthorised_export')
        hub=query.get('hub',[''])[0]
        if row['role']=='operator' and hub and hub!=policy['operator_hub'].get(row['user']):types.append('hub_scope_violation')
        login=logins.get((row['user'],row['session']))
        if login is None or (t-login).total_seconds()>policy['session_ttl_minutes']*60:types.append('expired_or_missing_session')
        if types:findings.append(dict(request_id=row['request_id'],at=row['at'],user=row['user'],session=row['session'],finding=';'.join(types),status=status,rows=int(row['rows']),bytes=int(row['bytes'])))
    return findings

def solve(data,out):
    data=Path(data);out=Path(out);out.mkdir(parents=True,exist_ok=True)
    events,rejects,dups=ingest(data)
    (out/'canonical-events.jsonl').write_text(''.join(json.dumps(e,ensure_ascii=False)+'\n' for e in events))
    writecsv(out/'rejected.csv',rejects);writecsv(out/'duplicates.csv',dups)
    rules=json.loads((data/'rules.json').read_text());cutoff=parse_time(rules['cutoff'])
    by_order=defaultdict(list)
    for e in events:by_order[e['order_id']].append(e)
    orders=readcsv(data/'orders.csv')
    records=[classify_order(o,by_order[o['order_id']],cutoff) for o in orders]
    writecsv(out/'order-review.csv',records)
    hubs=aggregate(records,['hub']);tiers=aggregate(records,['hub','service']);routes=aggregate(records,['route'])
    writecsv(out/'hub-metrics.csv',hubs);writecsv(out/'route-metrics.csv',routes)
    bands,std=fairness(tiers,rules)
    writecsv(out/'service-review.csv',bands);writecsv(out/'standardized-comparison.csv',std)
    findings=investigate(readcsv(data/'access-log.csv'),json.loads((data/'access-policy.json').read_text()))
    writecsv(out/'security-findings.csv',findings)
    summary=dict(orders=len(orders),accepted_events=len(events),rejected=len(rejects),duplicates=len(dups),cohorts=dict(Counter(r['cohort'] for r in records)),hubs=hubs,service_review=bands,standardized=std,security=dict(flagged_requests=len(findings),potential_export_rows=sum(f['rows'] for f in findings if 'unauthorised_export' in f['finding']),potential_export_bytes=sum(f['bytes'] for f in findings if 'unauthorised_export' in f['finding']),findings=findings))
    dump(out/'results.json',summary)
    return summary
if __name__=='__main__':
    import sys
    print(json.dumps(solve(sys.argv[1],sys.argv[2]),ensure_ascii=False,indent=2))

百分比与百分点不同;小样本的低迟交率不能用作“最公平”或“最好”的业务结论。

每项 20 分,14 分及以上且没有关键口径错误再进入下一次 Review。原始数据被改写、静默丢记录、分母含未到期、把 401 算成泄露、用小样本硬排站点或把前端筛选当授权,均须修正后再验收。

  • 分层分母与目标计算 6 分
  • 阈值边界和小样本优先 5 分
  • 标准化及缺失值 5 分
  • 结论解释和后续采样 4 分