重庆明镜滩项目-11-脚本学习-260122DataPreV5MissAna2
问题1:这个脚本中任务2的代码我没看懂,详细介绍一下功能和代码
我来详细解释任务2的代码功能和实现逻辑。
任务2的功能目标
找出所有指标同时都没有缺失值的时间段。也就是说,某个时间点只有当所有指标都有数据时,这个时间点才算有效。
代码详细解析
# 构建所有指标的共同非缺失掩码
all_valid_mask = pd.notna(df.drop(columns=['InsertTime'])).all(axis=1).values
common_segments = find_continuous_segments(all_valid_mask)
第一行代码拆解:
步骤1: df.drop(columns=['InsertTime'])
- 移除时间列,只保留指标数据列
- 例如原本有15列(1个时间列+14个指标列),现在只剩14个指标列
步骤2: pd.notna(...)
- 对每个单元格判断是否非缺失
- 返回一个布尔值DataFrame,True表示有数据,False表示缺失(NaN)
- 形状与原数据相同,例如10000行×14列
步骤3: .all(axis=1)
axis=1表示沿着列方向(横向)进行判断- 对每一行的所有列进行"与"运算
- 只有当某行的所有指标都是True时,该行才返回True
- 返回一个长度为10000的Series,每个值代表该时间点是否所有指标都有效
步骤4: .values
- 转换为NumPy数组,方便后续处理
举例说明:
假设某个时间点的数据:
指标A: 5.2 (有值 → True)
指标B: NaN (缺失 → False)
指标C: 3.1 (有值 → True)
经过 .all(axis=1) 后,这一行返回 False(因为指标B缺失)
如果所有指标都有值:
指标A: 5.2 (有值 → True)
指标B: 4.8 (有值 → True)
指标C: 3.1 (有值 → True)
这一行返回 True
第二行代码:
common_segments = find_continuous_segments(all_valid_mask)
调用辅助函数,找出所有连续的True值段落:
- 输入:布尔数组
[False, True, True, True, False, True, False, ...] - 输出:连续True段的起止索引
[(1, 4), (5, 6), ...] - 表示索引1-3是一个连续有效段,索引5是另一个连续有效段
最终效果
这段代码找出了数据中所有指标都完整的时间段,例如:
- 时间段1: 2025-02-15 08:00 至 2025-02-20 15:30,共1234个数据点
- 时间段2: 2025-03-01 10:00 至 2025-03-05 18:45,共567个数据点
这些时间段内的数据可以直接用于建模,无需插值处理。
浙公网安备 33010602011771号