如何在Pandas中向量化实现漂移变化检测?
无循环向量化实现温度漂移检测
原代码通过遍历温度序列,识别出与上一次漂移点温度偏差超过toffset的记录,将对应DriftedTemp列设为当前温度,并更新基准温度t0。由于逻辑依赖前一次计算的状态,常规列级向量化无法直接实现,这里提供一种无需显式循环的向量化解决方案:
实现代码
import pandas as pd import numpy as np # 定义累积处理函数,维护基准温度和当前漂移标记 def drift_accumulator(accumulated_state, current_temp): prev_t0, _ = accumulated_state if np.abs(current_temp - prev_t0) > toffset: # 超过阈值,更新基准温度并记录当前温度 return (current_temp, current_temp) else: # 未超过阈值,保持基准温度,不记录 return (prev_t0, None) # 初始化初始状态:(初始温度, 无漂移记录) initial_state = (df['Temperature'].iloc[0], None) # 对温度序列从第二个元素开始应用累积函数 accumulated_results = df['Temperature'].iloc[1:].accumulate(drift_accumulator, initial=initial_state) # 提取漂移记录值,构造DriftedTemp列 drifted_values = [result[1] for result in accumulated_results] df['DriftedTemp'] = [None] + drifted_values
方案说明
pandas.Series.accumulate会依次处理序列中的每个元素,每次传递上一次的累积状态(包含当前基准温度t0和上一次的漂移记录)给自定义函数- 自定义函数内部完成偏差判断逻辑,返回更新后的基准温度和当前是否记录漂移的结果
- 最终将累积结果整理为
DriftedTemp列,逻辑与原循环代码完全一致,且无需编写显式循环
性能优化(可选)
如果处理超大规模数据集,可使用numba编译累积函数提升速度:
from numba import jit @jit(nopython=True) def drift_accumulator_numba(accumulated_state, current_temp): prev_t0 = accumulated_state[0] if np.abs(current_temp - prev_t0) > toffset: return (current_temp, current_temp) else: return (prev_t0, None) # 使用编译后的函数重复上述累积步骤即可
内容的提问来源于stack exchange,提问作者TryingHardToBecomeAGoodPrSlvr
相关产品推荐
相关产品推荐

