×
¥
查看详情

数据清洗与统一宽表构建计划

目标

  • 从 ODS 增量导出的 CSV 构建一张统一宽表(主键:order_id + item_id),解决已知质量问题并保证主外键一致性、时区统一、枚举规范与金额口径统一。
  • 提供可重复、可审计的清洗流程,支持10%稳定样本的干跑与全量上线。

数据来源与分区

  • 读取路径:s3://retail/exports/2023-2024
  • 文件:orders.csv, order_items.csv, customers.csv, payments.csv
  • 分区策略:按文件日期目录或文件名标识;若无明确分区列,使用加载批次时间作为技术分区。保持每日增量的幂等处理(同一订单重复导出不重复入库)。

处理框架与执行模式

  • 推荐使用 Spark(或等价分布式引擎)读取 CSV(UTF-8, comma),withHeader=true,mode=PERMISSIVE。
  • 流程分层:raw_staging → cleaned_conformed → wide_table
  • 幂等性:以业务键作去重与 upsert,保留历史审计字段(_source_file, _load_ts, _row_hash)。

统一数据类型与模式(进入 cleaned_conformed 前)

  • IDs:全部转为字符串(string),去除首尾空格,保持大小写原样或统一大写(建议大写);验证前缀格式:
    • order_id: ^O\d{8}-\d{6}$
    • customer_id: ^C\d+$
    • payment_id: ^P-\d{8}-\d+$
  • 时间:order_time, pay_time → 先 trim,再多格式解析;强制解析为带时区的时间戳,统一到 UTC(新增列 _utc),保留原始偏移(_tz_offset)。非法日期置为 null 并记录错误代码。
  • 数值:order_amount, discount_amount, unit_price, tax, qty, paid_amount, fx_rate → cast 为 decimal(18,2) 或适用精度;负值与异常值进入校验规则。
  • 枚举:status, currency, channel, device, pay_method, shipping_country, province → 统一大小写与标准字典(见下)。

标准化字典与清洗规则

  • status 统一为小写且限集合 {paid, shipped, canceled}
    • 映射:(?i)shipped → shipped;(?i)paid → paid;(?i)canceled|cancelled → canceled;其他置为 null 并告警
  • currency 统一为 ISO 4217 大写(CNY, USD)。异常值置为 null 并告警。
  • shipping_country 统一为 ISO-3166 alpha-2:CN, US
    • 映射:(?i)china → CN;usa|united states → US;大小写不敏感
  • device 统一集合 {ios, android, web};其他置为 unknown 并记录。
  • province 标准化:去空格、转大写;中国省份使用约定编码(例:FJ 对应 Fujian)。若与邮编冲突,依据邮编校正(见地址校验)。

时间与时区处理

  • 输入可能混用 +00:00 与 +08:00;统一转换为 UTC:
    • order_time_utc = to_utc_timestamp(order_time)
    • pay_time_utc = to_utc_timestamp(pay_time)
  • 移除尾随空格;多格式解析(如 "yyyy-MM-dd HH:mm:ssXXX"),失败置 null。
  • 下游切片与评估使用 UTC。保留原始字符串供审计(*_raw)。

去重与主键一致性

  • orders 重复行:
    • 步骤1:先做枚举与字段标准化(特别是 status)。
    • 步骤2:exact-duplicate 去重:以完整行 hash(除技术字段)去重。
    • 步骤3:near-duplicate(同一 order_id 出现多行):保留优先规则:
      • 先选最大 order_time_utc
      • 如并列,按 status 优先级 shipped > paid > canceled
      • 再并列,选数据质量分最高的记录(非空字段更多、金额与类型校验通过)
    • 记录合并日志(每个 order_id 合并前后行数)。
  • order_items 复合主键:order_id + item_id
    • 去重:partition by (order_id, item_id) 按数据质量分高者保留(unit_price 合法优先;时间靠近订单时间优先)。
  • customers 主键:customer_id → 去重保留最新 signup_date 或数据质量分高者。
  • payments 主键:payment_id → exact-duplicate 去重;跨 payment_id 的同一 order_id 聚合时保留所有有效支付(见金额口径)。

金额与币种统一

  • 定义口径:
    • order_currency = 标准化后的 orders.currency
    • payment_currency = 标准化后的 payments.txn_currency
    • paid_amount_sum = Σ paid_amount(仅支付记录 fx_rate>0 且时间合法)
    • amount_in_order_ccy = 若 payment_currency=order_currency → paid_amount;否则 paid_amount * fx_rate(fx_rate 为 txn to order_ccy 的比率)
      • fx_rate=1.00 为同币保证;fx_rate≤0 或 null → 标记无效,暂不换算,纳入异常统计
  • total_net_amount(订单级):order_amount - discount_amount
    • 校验1:order_amount ≥ 0 且 discount_amount ≥ 0 且 total_net_amount ≥ 0
    • 校验2:与 Σ(line_amount) 比较(允许容差,例如绝对差 ≤ 0.05),差超限告警
  • item 行金额:
    • line_unit_price = unit_price 如果 unit_price > 0;若 unit_price=0,视为赠品(line_amount=0);若 unit_price<0 标记异常(line_amount=null,不纳入合计)
    • line_amount = line_unit_price * qty;qty 必须为正整数(≤0 置为异常)
  • 多支付订单:
    • payments_agg:按 order_id 聚合 sum_paid_in_order_ccy、latest_pay_time_utc
    • 若存在跨币支付且 fx_rate 合规,按规则累计;否则剔除异常支付并告警

地址与地理校验

  • postal_code 标准化:trim、去空格、仅保留字母数字;中国邮编校验为6位数字;美国邮编 5位或 ZIP+4。
  • province 与 postal_code 一致性:
    • 若 shipping_country=CN:
      • 建立邮编前两位至省份映射表(如 35 → 福建/FJ)并校验
      • 若不一致:若 postal_code 合法且 province 缺失或非合法编码→按邮编纠正 province;否则置 postal_code 为 null
    • 非 CN:保留原值,最小校验(长度与字符集)。
  • 记录纠正与失败数量,输出问题清单。

主外键与参照完整性

  • 键类型统一为 string;去除空格与控制字符。
  • 外键校验:
    • order_items.order_id 必须存在于 orders
    • payments.order_id 必须存在于 orders
    • orders.customer_id 必须存在于 customers
  • 处理策略:
    • 孤儿行(无主表匹配)不进入宽表;输出孤儿清单用于回补
    • 多客户同一 order_id(异常)以合并规则选定一条,记录冲突

枚举与值域校验

  • status ∈ {paid, shipped, canceled};否则置 null 并标记 invalid_status
  • channel ∈ {web, app};device ∈ {ios, android, web};非法值归类 unknown
  • pay_method ∈ {wechat, alipay, card};非法值置 unknown
  • shipping_country ∈ {CN, US}
  • currency ∈ {CNY, USD}

非法与缺失处理

  • 非法日期 → null,后续派生字段依赖时按缺失处理
  • 负数单价或税 → line_amount=null,标记 invalid_unit_price
  • qty ≤ 0 → 行剔除或标记 invalid_qty(建议剔除,保留审计)
  • fx_rate ≤ 0 或 null → 该支付不参与币种换算,标记 invalid_fx
  • email_hash、phone_mask:保留原值,不反解;空值允许

联合与宽表构建

  • 以 order_items 作为明细锚表(确保主键 order_id + item_id)
  • 连接:
    • items JOIN orders ON order_id
    • JOIN customers ON customer_id
    • LEFT JOIN payments_agg(按 order_id 聚合支付)ON order_id
  • 输出字段(建议):
    • 键:order_id, item_id, customer_id
    • 时间:order_time_utc, order_time_tz_offset, latest_pay_time_utc
    • 状态与渠道:status_std, channel_std, device_std
    • 地理:shipping_country_std, shipping_city, province_std, postal_code_std
    • 金额:
      • order_currency, payment_currency
      • order_amount, discount_amount, total_net_amount
      • qty, unit_price_clean, line_amount
      • paid_amount_sum_in_order_ccy, paid_amount_sum_raw
    • 分类:category, brand_clean("NA" → null)
    • 质量标记:invalid_unit_price, invalid_qty, invalid_fx, invalid_status, address_fix_applied
    • 审计:_source_file, _load_ts
  • 目标变量:
    • delivered_7d:需依赖发货与签收时间;当前数据不含签收时间,置为 null,预留字段与计算逻辑接口
    • total_net_amount:已计算

抽样与上线策略

  • 干跑样本(10%):对 orders 按稳定哈希采样(md5(order_id) % 10 = 0),联动过滤 items/payments/customers(仅保留关联到样本订单的记录)。
  • 验证留出集:2024-06 为留出时间窗(按 order_time_utc 切片)用于时序外推验证。
  • 加速验收:可在宽表上抽取近90天进行指标对比。
  • 上线前对比指标:重复行数量、非法日期率、枚举标准化覆盖率、币种一致率、地址纠正率、孤儿行比例、金额一致性(订单金额与明细合计的差异分布)。

数据质量规则与阈值(示例)

  • orders 去重后主键唯一率 ≥ 99.99%
  • 非法日期占比 ≤ 0.1%
  • status 可识别率 ≥ 99.5%
  • shipping_country 标准化成功率 ≥ 99.9%
  • unit_price<0 的行占比 ≤ 0.05%,全部标记并排除金额聚合
  • postal_code-省份一致性纠正成功率 ≥ 95%(限 CN)
  • 外键完整性(items→orders, payments→orders, orders→customers)≥ 99.9%

异常与日志

  • 按类型输出异常清单:重复订单、非法日期、地址冲突、金额异常(商品合计与订单差超限)、孤儿记录、币种/汇率异常。
  • 每日运行生成质量报表,含关键指标与较上一周期的变化。

示例清洗伪代码(SQL/Spark 混合表达)

  • status 标准化:
    • status_std = lower(trim(status));
    • CASE WHEN status_std IN ('paid','shipped','canceled') THEN status_std ELSE null END
  • 时间统一到 UTC:
    • order_time_utc = to_utc_timestamp(parse_ts(trim(order_time)), extract_tz(order_time))
  • 国家标准化:
    • shipping_country_std = CASE WHEN ilike(shipping_country,'china') THEN 'CN' WHEN ilike(shipping_country,'usa') OR ilike(shipping_country,'united states') THEN 'US' ELSE upper(trim(shipping_country)) END
  • orders 去重:
    • 使用窗口:ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY order_time_utc DESC, status_rank DESC, dq_score DESC) = 1
  • payments 聚合到订单:
    • payments_agg AS SELECT order_id, SUM(CASE WHEN fx_rate>0 AND txn_currency=order_currency THEN paid_amount WHEN fx_rate>0 AND txn_currency<>order_currency THEN paid_amount*fx_rate ELSE 0 END) AS paid_amount_sum_in_order_ccy, MAX(pay_time_utc) AS latest_pay_time_utc FROM payments_clean GROUP BY order_id

性能与资源

  • 规模:~1.2M orders, ~3.6M items, ~1.25M payments, ~0.54M customers;单次全量可由中小型 Spark 集群轻松处理。
  • 联结策略:对 orders 与 payments_agg 先行广播(若尺寸允许),items 为事实表驱动;对 keys 建立分桶或适度 repartition(按 order_id)。
  • 使用列裁剪与谓词下推;采样运行时启用 cache 以稳定验证。

交付物

  • cleaned_conformed.*(4张清洗后中间表)
  • wide_table.orders_items_fact(统一宽表,主键 order_id + item_id)
  • 质量报表与异常清单(CSV/JSON),含去重、枚举规范化、地址纠正、金额一致性与外键完整性指标
  • 运行日志(含源文件列表、行计数、失败原因聚合)

备注

  • delivered_7d 需补充发货与签收时间后计算:delivered_7d = (delivered_time_utc - shipped_time_utc) ≤ 7 天。
  • 汇率若未来改为独立表(按日/交易级),以支付时间对齐并替换 payments.fx_rate。当前仅使用支付记录内 fx_rate。

数据清洗计划(BMS 物联网数据,UTC 对齐与分钟级重采样)

目标

  • 产出对齐后的时间序列数据(1 分钟等频,设备×时间长表为主,另提供 5 分钟重采样版本)。
  • 统一时间到 UTC,消除重复与时间漂移,修复或标记异常与缺失。
  • 与设备元数据与外部气象数据按分钟对齐。
  • 在清洗后构造派生目标 power_kw_next_15min。
  • 提供可复现的质量度量与规则验证流程。

总体原则

  • 所有清洗均应保留审计线索:保留原值列或质量标记列以支持回溯。
  • 优先使用保守修复:无法可靠修复的值设为缺失并标记。
  • 时间规则以 UTC 为基准,读数级主键为 device_id + ts_utc。
  • 对插值设置明确的最大连续缺失长度阈值,不跨越长缺口、不跨越设备边界。
  • 干跑阶段先在 5 台设备两周数据验证规则与阈值,再推广到全量。

数据读取与类型规范

  • 按 dt=YYYY-MM-DD 读取 sensor_readings.parquet;读取 device_meta.csv 与 weather.csv。
  • 统一字段类型:
    • 时间: ts, ingest_time, weather.timestamp_utc -> 时间戳类型(ISO 8601 解析)。
    • 标识: device_id -> 字符串。
    • 数值(若被存为字符串):temp_c, humidity_pct, co2_ppm, pressure_pa, fan_speed_pct, power_kw, tz_offset, seq -> 转为数值。对含单位/逗号的字符串进行正则清洗(如 "45,2" -> 45.2;剔除 "ppm"/"%" 等单位)。
    • status -> 分类(ok, fault, offline)。
  • 校验 sampling_period_s(来自 device_meta),若缺失以60s为默认并在质量标记中记录。

时间规范化与对齐

  • 统一计算 ts_utc:
    1. 若 ts 带 Z(UTC)或显式时区偏移(±HH:MM),按其自带时区解析为 UTC。
    2. 若 ts 为“天真本地时间”(无时区),且 tz_offset 存在:ts_utc = ts - tz_offset。
    3. 若 ts 为天真时间且 tz_offset 缺失:采用站点默认偏移(+08:00),并在质量标记中记录默认规则生效。
  • 校验时间合理性:
    • 计算 ingest_lag_s = ingest_time - ts_utc。
    • 规则:ingest_lag_s < 0 视为时钟错误,设质量标记并保留;0–180s 正常;180–600s 延迟;>600s 视为陈旧数据(建议丢弃或仅保留状态,不用于建模)。
    • 统计每设备的时间漂移(ts_utc 间隔的分布),若大量偏离 60s,记录并在后续重采样时按规则处理。
  • 构造分钟级索引:
    • minute_ts = floor(ts_utc 到分钟) 作为重采样锚点。
    • 输出数据的时间范围覆盖 2024-01-01 00:00:00 UTC 至 2024-03-31 23:59:00 UTC 全部分钟。

重复与序列规则

  • 针对每 device_id + ts_utc 的精确重复:
    • 首选保留 seq 最大的记录;若 seq 不可靠则保留 ingest_time 最新的记录。
    • 若不同记录 status 不同,优先级 ok > fault > offline;但保留 status 字段以供分析。
    • 合并质量标记:记录重复发生次数与保留策略。
  • 对同一分钟内多个读数:
    • 若 ts_utc 同一分钟且不完全相同,则在重采样阶段取近 minute_ts 的记录;若多个同等近,则按上述规则(seq 最大、ingest_time 最新)选一。

设备编号复用与标识修正

  • 识别 device_id 复用(同一 device_id 在时间上出现不可解释的楼层/区域变化或统计结构断点):
    • 结构断点检测:对 power_kw、fan_speed_pct 的中位数与方差进行滚动比较(例如 1 天窗口);出现显著跃迁且持续(>12小时)视为段边界。
    • 可选:结合 device_meta(model, calibration_offset_c, sampling_period_s)及 zone/floor 异常变化。
  • 分段与标识:
    • 为复用设备创建 device_key = device_id + segment_id(segment_id 随时间段递增)。
    • 读数级主键仍为 device_id + ts_utc 以满足业务要求,但在分析/建模建议使用 device_key + ts_utc。
    • 在输出中提供 device_key 与 segment边界时间,供下游过滤。

数值清洗与范围校验

  • 通用规则:
    • 若 status=offline:数值字段置为缺失(NaN),保留 status。
    • 负值校验:power_kw、co2_ppm、pressure_pa 不允许负值;出现负值设为 NaN 并标记。
    • 合理范围(用于硬阈值剔除与标记,具体上限在干跑阶段可微调):
      • temp_c: [-40, 80];-273 视为哨兵值,设 NaN。
      • humidity_pct: [0, 100],超过范围进行截断并标记;较大段缺失单独处理。
      • co2_ppm: [250, 10000](室内常见 400–2000),越界设 NaN。
      • pressure_pa: [90000, 110000],越界设 NaN。
      • fan_speed_pct: [0, 100],越界截断并标记。
      • power_kw: >=0;过大尖峰使用鲁棒方法检测。
  • 传感器校准与异常过滤:
    • 温度应用校准:temp_c_adj = temp_c + calibration_offset_c(来自 device_meta)。
    • 尖峰与异常检测:
      • Hampel(鲁棒 z-score)滤波:窗口 15 分钟,阈值 3σ,应用于 temp_c_adj、co2_ppm、power_kw。检测到尖峰时将值设为 NaN 或替换为窗口中位数(建议设 NaN 并在重采样阶段可选插值)。
      • 明显物理不可能值直接设 NaN。
  • 字段级质量标记:
    • 为每数值列添加 flags:is_outlier、is_clipped、is_negative、is_sentinel、from_interpolation、from_ffill 等布尔标记或分类。

缺失段处理与插值策略(1 分钟频率)

  • 缺失定义:重采样后无观测或被清洗为 NaN。
  • 插值上限(每设备每变量):
    • temp_c_adj、co2_ppm、pressure_pa、fan_speed_pct:线性插值最大缺口 30 分钟;超过保留 NaN。
    • humidity_pct:因成段缺失,线性插值最大缺口 15 分钟;超过保留 NaN。对于>2小时的缺口不插值、不前向填充。
    • power_kw:为模型目标保守处理,线性插值最大缺口 15 分钟;超过保留 NaN,避免不真实能耗信号。
  • 前向/后向填充使用限制:
    • 不对 power_kw、co2_ppm 使用长距离前向填充;仅在 ≤5 分钟缺口时允许一次性 FFill。
    • 不跨越 status=offline 段进行填充或插值。
  • 插值边界:
    • 不跨设备分段(device_key)边界插值。
    • 不跨日界限进行长距离插值(>1小时的缺口不跨日)。

分钟重采样与聚合

  • 建立设备×分钟的网格:
    • 对每个 device_id 或 device_key,在全时间窗生成完整分钟索引。
    • 对同一分钟有多个观测:优先近 minute_ts 的原始点;若需要聚合(极少数情况),使用中位数。
  • 状态聚合:
    • 同一分钟内存在不同 status,取最差状态(offline > fault > ok),用于质量标记,不覆盖原始读数。
  • 输出两个版本:
    1. 1 分钟等频长表:device_id, device_key, minute_ts, temp_c_adj, humidity_pct, co2_ppm, pressure_pa, fan_speed_pct, power_kw, status, 各质量标记。
    2. 5 分钟重采样:在 1 分钟版本基础上取滚动或间隔聚合:
      • 数值字段:中位数或均值(power_kw建议均值),窗口对齐到 5 分钟边界。
      • 标记字段:若窗口内任一 is_outlier/is_offline 为真,则该聚合点标记为受影响。

气象数据对齐

  • weather.timestamp_utc 取整到分钟,与 minute_ts 左连接。
  • 气象缺失处理:
    • 允许前向填充 ≤30 分钟;超过范围保留 NaN。
    • 不进行跨天填充。
  • 可选派生(如需):室外露点或焓值用于质量分析,但不强制输出。

目标变量构造

  • power_kw_next_15min = shift(power_kw, -15 分钟) 在每设备(或 device_key)上计算。
  • 构造前提:
    • 严禁跨设备或跨分段移位。
    • 若当前或未来 15 分钟内存在 NaN 或 status=offline,target 标记为不可用(target_valid=false)。
  • 训练集建议:仅使用 target_valid=true 且过去 30 分钟内插值比例低的样本。

质量度量与验收标准

  • 干跑阶段(5 台设备×两周)输出以下指标:
    • 重复率:去重前后相同 device_id+ts_utc 的重复比例;期望去重后重复为 0。
    • 时间漂移:与 60s 偏差的分布与比例;大于 ±5s 的比例;用于评估采集稳定性。
    • 异常/哨兵剔除率:各字段被设为 NaN 的比例与原因分解。
    • 插值覆盖率:各字段插值占比与平均缺口长度(不超过设定阈值)。
    • ingest_lag 分布:>600s 的比例;若显著,确认丢弃策略。
    • 设备分段检测:产生的 segment 数量与断点合理性(人工抽样核查)。
  • 全量运行验收:
    • 1 分钟版本:对齐矩阵行数≈设备数×时间分钟数;与预估规模一致(≈30×24×60×91)。
    • 丢弃比例控制:因陈旧与严重异常被丢弃的行数不超过 2%(阈值可根据干跑结果调整)。
    • 目标变量有效样本:target_valid 的比例报告与分布。

实现与运维要点

  • 计算框架:
    • 建议使用 Spark(PySpark)进行读取与初步清洗(分区并行、去重、时间标准化),再导出到 Parquet。
    • 频率对齐、插值与派生可在 Spark 或 Pandas(基于设备分组)完成,4M 行规模两者均可承载。
  • 键与索引:
    • 主键:device_id + ts_utc(读数级);推荐分析键:device_key + minute_ts。
  • 审计与可追踪性:
    • 保存原始值列(如 temp_c_raw)与清洗后列(temp_c_adj),以及质量标记列。
    • 每步计数与日志输出(去重数、丢弃数、插值数)。
  • 配置化阈值:
    • 所有范围与插值上限在配置中管理,干跑阶段根据实际分布调整。

交付物

  • Clean_1min.parquet:长表,字段包括 device_id, device_key, minute_ts, temp_c_adj, humidity_pct, co2_ppm, pressure_pa, fan_speed_pct, power_kw, status, 各质量标记, weather 对齐字段(outdoor_temp_c, rh_pct, wind_mps)。
  • Clean_5min.parquet:5 分钟重采样版本。
  • 质量报告(JSON/CSV):含重复、异常、插值、延迟、分段统计。
  • 目标变量列:power_kw_next_15min 与 target_valid 标记已包含在两版本中。
  • 规则验证报告(干跑与全量):阈值与效果评估,3 月留出集的插值与对齐质量评估。

数据清洗与特征工程计划

  1. 目标与输出
  • 目标:基于安装级快照构建两类标签并产出特征集,支持模型预测 r7_revenue_usd(安装后7日净收入)与 payer_7d(7日内是否付费)。
  • 输出:
    1. 清洗后的基础层(clean layer):clean_ad_spend_daily、clean_installs、clean_events、clean_user_profile
    2. 训练快照(feature layer):features_install_snapshot(两个时间切点:T0=安装时、T1=安装后24小时)
    3. 标签层(label layer):labels_r7(r7_revenue_usd、payer_7d)
  • 范围:2024-06-01 至 2024-09-30;开发期采用 6 月 5%随机安装样本并保留全量付费用户;9 月作为留出集。
  1. 数据摄取与统一
  • 文件介质:CSV 与 Parquet 混合。禁用自动推断,显式制定 schema。
  • 指定 schema(关键字段类型):
    • ad_spend.csv:date DATE, campaign_id STRING, channel STRING, cost_usd DOUBLE, impressions LONG, clicks LONG, currency STRING
    • installs.csv:install_id STRING, user_id STRING, campaign_id STRING, country STRING, os STRING, install_time TIMESTAMP (UTC), att_status STRING, device_price_bucket STRING
    • events.parquet:user_id STRING, event_time TIMESTAMP WITH TZ, event_name STRING, revenue_usd DOUBLE, order_id STRING
    • user_profile.csv:user_id STRING, age_band STRING, gender STRING, region STRING, paid_user BOOLEAN
  • 统一标识与文本规范:
    • user_id:统一为大写,trim。生成 user_id_norm。
    • campaign_id:统一为大写,trim。生成 campaign_id_norm。
    • channel、country、os、att_status、device_price_bucket、gender、region:统一小写或枚举规范化,trim。
  • 时区与时间:
    • installs.install_time 已为 UTC(Z)。保留为 install_ts_utc。
    • events.event_time:按原记录偏移解码,统一转换为 UTC,保存 event_ts_utc;保留原偏移来源字段 tz_source(如 +08:00/UTC)。
    • ad_spend.date:视为供应商账期日(通常本地或UTC)。若无时区标注,先按原值处理,并与 install_date_utc=to_date(install_ts_utc)进行日粒度匹配;保留后续对账校验逻辑。
  1. 表级清洗规则 3.1 installs(主键:install_id)
  • 重复 install_id:
    • 规则:按 install_id 分组,优先保留最早 install_ts_utc 的记录(same-day重复占比高的渠道回传常见);若字段冲突:
      • user_id:取众数;如无一致则取最早记录值
      • campaign_id、country、os、att_status、device_price_bucket:优先取非空;存在冲突则取最早记录值
    • 输出:dedup_flag(bool),dup_count(int)
  • 字段校验:
    • os ∈ {android, ios};异常值置为 null,并记录 os_invalid_flag
    • att_status ∈ {authorized, denied};异常值置为 null
    • country:ISO2 大写;异常编码归一到 “unknown”
    • device_price_bucket ∈ {low, mid, high};异常归一到 “unknown”
  • 派生字段:
    • install_date_utc=to_date(install_ts_utc)
    • install_hour_utc(0-23)、install_wday_utc(1-7)
    • user_id_norm、campaign_id_norm(见统一规范)

3.2 events(候选唯一键:user_id_norm + event_ts_utc + event_name)

  • 时区统一:将 event_time 按偏移转换为 event_ts_utc(TIMESTAMP UTC),保留 tz_source。
  • 去重:
    • 基于 user_id_norm + event_ts_utc + event_name 去重;若同键 revenue_usd 多值:
      • 对 purchase 事件:合并为单条,revenue_usd 取和,order_id 保留列表或首个(用于一致性审核)
      • 非付费事件:保留单条
    • 输出:event_dup_flag
  • 收入处理:
    • revenue_usd 对非 purchase 事件统一置 0(并保留原值至 revenue_usd_raw 以便审计)
    • 负值视为退款(chargeback),保留并标记 refund_flag(revenue_usd<0)
    • purchase 的 revenue_usd 可为正负;保留净额计算能力
  • 事件过滤与对齐:
    • 仅保留能关联到 installs.user_id_norm 的事件;无法关联的记录进入孤立表 events_orphan 以便核查
    • 针对每个安装,保留 install_ts_utc 至 install_ts_utc+30d 的事件用于扩展分析;建模与标签严格使用 7d 窗口
    • 若事件时间 < 安装时间(设备时钟偏差):设置 negative_lag_flag;超过 -10 分钟的事件视为预安装噪声,移除

3.3 ad_spend(聚合键:date + campaign_id_norm + channel)

  • 命名与枚举:campaign_id、channel 统一规范化;空字符串视为 null。
  • cost_usd 缺失处理(cost_usd_missing_flag):
    • 估算顺序:
      1. 近邻期同 campaign_id_norm+channel 的 CPC:cost_usd=clicks×CPC_rolling7(滚动7天加权均值)
      2. 若 clicks=0,则用 CPM:cost_usd=(impressions/1000)×CPM_rolling7
      3. 若两者皆不可用,用 channel 级 CPC/CPM 历史均值
    • 标记来源:cost_usd_source ∈ {actual, cpc_model, cpm_model, channel_avg}
    • 不做均值估算的替代策略:若估算不可靠(样本<50点击或<100k展示),保留缺失并下游特征以缺失编码(推荐优先使用估算+质量标记)
  • 派生指标(日-活动-渠道粒度):
    • ctr=clicks/impressions(分母为0则置0)
    • cvr=installs_count/clicks(join 至 installs 后计算;分母为0置0)
    • cpc=cost_usd/max(clicks,1)
    • cpm=cost_usd/max(impressions,1)×1000
    • installs_count:当日匹配 installs(见跨表关联)
    • cpi=cost_usd/max(installs_count,1)

3.4 user_profile(主键:user_id_norm)

  • 编码规范与填充:
    • age_band 映射至有序分箱:{<18, 18-24, 25-34, 35-44, 45-54, 55+};异常值与缺失置为 "unknown"
    • gender ∈ {male, female, unknown};异常→unknown
    • region:归一到预置枚举(如 north/south/east/west/central);异常→unknown
    • paid_user 为布尔;异常→null
  • 补全率低:
    • 不做基于事件的反推填充,避免引入标签泄漏;保留缺失并产出缺失指示特征
    • 输出:profile_missing_flag(行级)、各字段 missing_flag
  1. 跨表关联与一致性检查
  • installs ←→ ad_spend:on campaign_id_norm and install_date_utc = ad_spend.date。左连接(保留所有安装);记录是否匹配 spend(ad_spend_match_flag)
  • events ←→ installs:on user_id_norm。内连接形成安装会话事件;记录每条事件是否在安装后窗口内(within_7d_flag、within_24h_flag)
  • 一致性度量:
    • 日级 install- spend 匹配率(≥95% 期望);低于阈值需回溯渠道账期时区或命名
    • 去重率、负收入占比、时区转换后事件滞后分布
    • 事件孤立率(无法关联安装)应 <1%
  1. 标签构造(label layer)
  • 窗口定义:基于 UTC 时间,安装后 [0, 7) 天内事件。
  • r7_revenue_usd:
    • 定义:sum(revenue_usd) for purchase events within 7d(包含退款,负值计入净额)
    • 同时产出 r7_revenue_gross(仅正值求和,不含退款)与 r7_refund_usd(负值加总,绝对额)
  • payer_7d:
    • 定义:7日内是否发生至少一次正收入 purchase(any revenue_usd > 0)
    • 辅助:payer_7d_any_purchase(含负净额但有正单次支付,也置1)若有需要区分净额为负的付款后退款场景可另外提供 payer_7d_net_positive(r7_revenue_usd>0)
  1. 采样与切片
  • 清洗规则开发与调试:2024-06 随机抽样 5% installs + 全量付费用户(确保付费样本充分);事件与广告数据按关联提取。
  • 留出集:2024-09 全量,用于时间外推验证。
  • 分层:按 payer_7d 进行过采样少数类(仅在训练集、保持时间一致性,不打乱安装时间序)。
  1. 特征工程候选集(含工程说明) 特征按两类快照生成:
  • T0(安装时可用,无后置事件,避免泄漏)
  • T1(安装后24小时内事件,作为早期行为信号)

7.1 广告与投放特征(安装日-活动-渠道)

  • cpc_t0:ad_spend.cpc 当日 campaign_id_norm+channel
  • cpm_t0:ad_spend.cpm 当日
  • ctr_t0:当日 CTR
  • cvr_t0:当日 CVR(需与 installs 关联后的 clicks→installs)
  • cpi_t0:当日 CPI(cost_usd / installs_count)
  • spend_per_install_t0:同 CPI;若 cost_usd 缺失估算,保留 cost_imputed_flag
  • campaign_channel_onehot:campaign_id_norm、channel 的嵌入或 one-hot(高基数建议 target encoding/embedding,在建模阶段处理)
  • ad_spend_match_flag:是否匹配到账(质量特征)
  • rolling_7d_campaign_cpc_t0:安装日前7天(不含当日)滚动加权 CPC(避免同日未来信息)
  • rolling_7d_campaign_cpm_t0、rolling_7d_campaign_ctr_t0、rolling_7d_campaign_cvr_t0 工程说明:上述 rolling 特征以安装日前一日作为窗口上限,避免数据泄漏;权重按 clicks 或 impressions。

7.2 用户与设备特征

  • country_onehot / region_onehot:国家与区域(异常编码→unknown一类)
  • os_onehot:android/ios
  • att_status_bin:authorized=1, denied=0, missing=-1
  • device_price_bucket_ord:low=0, mid=1, high=2, unknown=-1
  • install_hour_utc、install_wday_utc:时间形态特征
  • age_band_ord:<18=0, 18-24=1, 25-34=2, 35-44=3, 45-54=4, 55+=5, unknown=-1
  • gender_onehot:male/female/unknown
  • paid_user_profile_bin:user_profile.paid_user(缺失→-1)
  • profile_missing_flag:整行缺失指示 工程说明:高基数字段(campaign_id)不直接 one-hot,建议在模型阶段采用频率编码、目标编码或embedding。

7.3 早期行为特征(T1,安装后24小时内)

  • sessions_24h:event_name=session_start 计数
  • add_to_cart_24h:计数
  • purchases_24h:purchase 次数(revenue_usd>0 的次数与总次数分别计算:purchases_pos_24h、purchases_any_24h)
  • revenue_gross_24h:正收入求和
  • revenue_net_24h:净收入(含退款)
  • refund_24h_flag:是否出现退款(revenue_usd<0)
  • time_to_first_session_min:min(event_ts_utc - install_ts_utc) for session_start(分钟)
  • time_to_first_purchase_min:同上(正收入 purchase)
  • aov_24h:24h 内正收入总额 / 正收入 purchase 次数(分母为0置0)
  • event_mix_entropy_24h:24h 事件类型分布熵(指示活跃多样性) 工程说明:全部限定在安装后24小时窗口,避免对7日目标的直接泄漏;同时产出 within_24h_flag 保障窗口约束。

7.4 归因与一致性特征

  • event_negative_lag_flag:事件早于安装时间(>10 分钟阈值)占比(作为数据质量信号)
  • events_orphan_rate_user:用户事件无法关联安装的比率(安装聚合)
  • user_id_case_inconsistency_flag:跨表原始 user_id 大小写不一致(用于审计)

7.5 目标相关但非训练输入的监控指标(不作为特征输入)

  • r7_revenue_gross、r7_refund_usd(用于报表与模型诊断)
  • day_campaign_roi_r7:当日 campaign 的 r7 净收入 / cost_usd(用于渠道评估)
  1. 计算与实现要点(伪逻辑)
  • 时区统一(Spark SQL 示例):
    • events_clean as select upper(trim(user_id)) as user_id_norm, to_utc_timestamp(event_time, extract_tz(event_time)) as event_ts_utc, lower(trim(event_name)) as event_name, coalesce(revenue_usd,0.0) as revenue_usd_raw, case when lower(trim(event_name))='purchase' then coalesce(revenue_usd,0.0) else 0.0 end as revenue_usd from events_parquet
  • installs 去重:
    • installs_dedup as select * from ( select i.*, upper(trim(user_id)) as user_id_norm, upper(trim(campaign_id)) as campaign_id_norm, row_number() over (partition by install_id order by install_time asc) as rn from installs_csv i ) where rn=1
  • events 关联与窗口:
    • events_linked as select e.*, i.install_ts_utc, e.event_ts_utc between i.install_ts_utc and i.install_ts_utc + interval 7 days as within_7d_flag, e.event_ts_utc between i.install_ts_utc and i.install_ts_utc + interval 1 day as within_24h_flag from events_clean e join installs_dedup i using (user_id_norm)
  • r7 标签:
    • labels_r7 as select i.install_id, sum(case when within_7d_flag and revenue_usd>0 and event_name='purchase' then revenue_usd else 0 end) as r7_revenue_gross, sum(case when within_7d_flag and event_name='purchase' then revenue_usd else 0 end) as r7_revenue_usd, sum(case when within_7d_flag and revenue_usd<0 and event_name='purchase' then revenue_usd else 0 end) as r7_refund_usd, case when max(case when within_7d_flag and event_name='purchase' and revenue_usd>0 then 1 else 0 end)=1 then 1 else 0 end as payer_7d from events_linked group by i.install_id
  • ad_spend 衔接与 CPI:
    • spend_daily as select date, upper(trim(campaign_id)) as campaign_id_norm, lower(trim(channel)) as channel, cost_usd, impressions, clicks from ad_spend_csv
    • installs_daily as select install_date_utc as date, campaign_id_norm, channel, count(*) as installs_count from installs_dedup join spend_daily using (campaign_id_norm) where install_date_utc = spend_daily.date group by install_date_utc, campaign_id_norm, channel
    • cpi_daily as select s.date, s.campaign_id_norm, s.channel, s.cost_usd / nullif(i.installs_count,0) as cpi from spend_daily s left join installs_daily i using (date, campaign_id_norm, channel)
  1. 质量监控与验收标准
  • 主键完整性:installs.install_id 唯一;events 去重后复合键唯一性冲突率 <0.1%
  • 时区一致性:事件滞后分布中负滞后(<-10 分钟)率 <0.5%
  • 广告对齐:install-date 与 ad_spend.date 匹配率 ≥95%;低于阈值需渠道账期时区复核
  • 缺失与估算:cost_usd 估算记录占比与误差(通过与已知成本的对齐天验证),RMSE 控制在渠道均值 ±15% 范围
  • 退款标记:负收入识别准确率(与订单维度抽查)≥99%
  1. 交付结构
  • clean_ad_spend_daily:date, campaign_id_norm, channel, cost_usd, cost_usd_source, cost_usd_missing_flag, impressions, clicks, ctr, cpc, cpm
  • clean_installs:install_id, user_id_norm, campaign_id_norm, country, os, att_status, device_price_bucket, install_ts_utc, install_date_utc, install_hour_utc, install_wday_utc, dedup_flag
  • clean_events:user_id_norm, event_ts_utc, event_name, revenue_usd, refund_flag, within_7d_flag, within_24h_flag, event_dup_flag, tz_source
  • clean_user_profile:user_id_norm, age_band_norm, gender_norm, region_norm, paid_user, profile_missing_flag
  • features_install_snapshot:
    • T0 特征:广告投放、用户画像、设备与安装时间特征、滚动7天历史投放指标、质量标记
    • T1 特征:24h 行为特征(counts、times、entropy、revenue_24h),质量标记
  • labels_r7:install_id, r7_revenue_usd, r7_revenue_gross, r7_refund_usd, payer_7d
  1. 备注与边界
  • currency 字段当前为 USD;如后续出现非USD,需引入统一 FX 表并在摄取层转换为 cost_usd。
  • 高基数字段(campaign_id_norm)建议在建模阶段使用频率或目标编码;避免稀疏 one-hot。
  • 所有估算与清洗动作均保留来源与标记,以便模型使用质量特征与审计回溯。

示例详情

该提示词已被收录:
“AI工程师必备:高效建模与数据处理提示词合集”
覆盖建模到评估关键环节,助你快速构建高性能模型
√ 立即可用 · 零学习成本
√ 参数化批量生成
√ 专业提示词工程师打磨

解决的问题

面向数据团队与业务团队,快速生成一份结构化、可执行、可审阅的数据清洗计划。以最少输入换取高质量输出:明确要清什么、如何清、何时清、由谁清,以及如何验收。帮助你在短时间内完成从“杂乱数据”到“可用数据”的第一步,减少沟通成本,避免遗漏关键环节,提升项目交付速度与质量。

适用用户

数据分析师

快速制定各类数据清洗方案,统一字段标准,减少手工排查时间,确保报表准确并缩短交付周期。

数据科学家

在建模前生成高质量数据准备计划,明确缺失值处理、异常检测与验证步骤,提升模型表现与复现可靠性。

BI工程师

建立跨来源数据整合的清洗模板,规范命名与口径,提升仪表盘数据一致性,降低上线后的维护和返修。

特征总结

一键生成针对特定数据集的清洗计划,覆盖检查、修复、验证全流程,快速落地团队标准作业。
自动识别缺失值、异常值与重复记录,给出可执行处理策略,显著降低人为疏漏与返工成本。
智能建议字段标准化与命名规范,统一口径与格式,让报表、分析与建模环节协同无缝。
生成可复用清洗模板与步骤清单,支持不同业务场景快速套用,缩短从探索到上线的周期。
提供质量评估指标与验收指南,帮助团队量化清洗效果,明确达标条件与后续跟踪。
面向营销、风控、运营等场景给出差异化策略,确保关键字段可靠,提升决策与投放命中率。
结合数据样本与业务背景生成风险提示与优先级排序,帮助团队先解决高影响问题。
输出结构化文档与清晰责任分工,方便跨部门协作与审计复核,减少沟通成本与误解。
根据语言偏好自动生成本地化计划与术语释义,让全球团队快速理解并一致执行。
在建模前提供数据准备清单与可视化检查建议,提升模型稳定性与可解释性。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

数据清洗计划器

417
35
Dec 1, 2025
该提示词基于用户提供的数据集概述,生成结构化、可执行的数据清洗计划(含字段检查、缺失/异常处理、类型转换、去重、标准化、采样策略与交付物)。输出以技术写作风格呈现,强调步骤可复现、所需输入字段和验收指标,便于工程实施与审计。所有结论仅基于用户输入数据。
成为会员,解锁全站资源
复制与查看不限次 · 持续更新权益
提示词宝典 · 终身会员

一次支付永久解锁,全站资源与持续更新;商业项目无限次使用

420 +
品类
8200 +
模板数量
17000 +
会员数量