稳态数据识别示例代码:
import pandas as pd#稳态数据识别
def process_windows(filepath, parameters, window_size, step, threshold=0.4):def read_data(filepath):df = pd.read_csv(filepath)return dfdef split_windows(data, window_size, step):windows = []for start in range(0, len(data) - window_size + 1, step):windows.append(data.iloc[start:start + window_size])return windowsdef calculate_slope_sum(window, parameters):k_sum = 0for param in parameters:if param in window.columns:max_val = window[param].max()min_val = window[param].min()mean_val = window[param].mean()k_sum += (max_val - min_val) / mean_val if mean_val != 0 else 0return k_sumdef check_steady_state(windows, parameters, threshold):steady_states = []for window in windows:k_sum = calculate_slope_sum(window, parameters)steady_states.append(k_sum < threshold)return steady_statesdf = read_data(filepath)if not all(param in df.columns for param in parameters):raise ValueError("Dataframe does not contain all required parameters.")windows = split_windows(df, window_size, step)steady_states = check_steady_state(windows, parameters, threshold)stable_indices = [i for i, is_stable in enumerate(steady_states) if is_stable]unstable_indices = [i for i, is_stable in enumerate(steady_states) if not is_stable]stable_windows = [windows[i] for i in stable_indices]unstable_windows = [windows[i] for i in unstable_indices]return stable_windows, unstable_windows, stable_indices, unstable_indices# 示例用法
if __name__ == "__main__":filepath = r"D:\2024qsds_work\AHU-A(2008spring)\AHU-B(2007summer).csv"parameters = ['HWC-VLV', 'CHWC-VLV', 'SA-TEMP', 'SA-SP']window_size = 60step = 15threshold = 0.4stable_windows, unstable_windows, stable_indices, unstable_indices = process_windows(filepath, parameters, window_size, step, threshold)print("Stable indices:", stable_indices)print("Unstable indices:", unstable_indices)
为什么要实现稳态数据识别?
-
确保数据稳定:稳态数据是指系统在达到稳定状态后采集的数据,而不是系统启动或波动期间的数据。识别稳态数据有助于过滤掉波动数据,从而确保分析结果的准确性和稳定性。
-
提升数据质量:稳态数据通常表现为较低的噪声和较小的偏差,因此更适合作为数据建模、趋势分析和预测的基础数据。识别稳态数据有助于提升数据质量,从而提高数据分析和模型构建的精确度。
-
避免错误结论:在系统启动或波动期间收集的数据可能会包含瞬时的极端值或异常数据。如果不加以区分就直接用于分析,可能会得出错误的结论。稳态数据的识别可以帮助我们排除这种潜在的干扰。
-
提高分析效率:在分析复杂系统时,稳态数据识别可以减少数据量,专注于分析关键稳定阶段的数据,从而减少计算资源的消耗,提高分析效率。
-
用于过程控制:在工业控制、工程监测等领域,识别稳态数据有助于判断系统是否在正常运行状态。如果数据偏离稳态范围,可能意味着系统出现故障或异常,从而及时采取维护或调整措施。
代码实现分解
-
主函数
process_windows
:- 输入参数:文件路径 (
filepath
),要分析的参数列表 (parameters
),窗口大小 (window_size
),步长 (step
),以及稳态阈值 (threshold
)。 - 通过子函数进行数据读取、窗口分割、斜率计算和稳态检测,最终返回稳定和不稳定窗口的索引和窗口数据。
- 输入参数:文件路径 (
-
子函数
read_data
:- 使用
pandas
的pd.read_csv
读取指定文件路径的CSV文件并将数据存储为DataFrame
。
- 使用
-
子函数
split_windows
:- 将数据分割为指定大小的滑动窗口。
- 每个窗口从
start
到start + window_size
的行组成,start
每次增加一个步长step
,直到覆盖整个数据。 - 返回一个窗口列表,每个窗口是原数据的一个子集。
-
子函数
calculate_slope_sum
:- 计算给定窗口中指定参数的斜率和 (
k_sum
)。 - 遍历参数列表
parameters
,对于每个参数:- 计算该参数在窗口中的最大值 (
max_val
)、最小值 (min_val
) 和均值 (mean_val
)。 - 计算归一化的差值斜率
(max_val - min_val) / mean_val
,将其加到k_sum
中。若均值为 0 则斜率记为 0。
- 计算该参数在窗口中的最大值 (
- 斜率和 (
k_sum
) 是用来衡量数据波动的度量,波动越小(即k_sum
越小),数据越可能处于稳态。
- 计算给定窗口中指定参数的斜率和 (
-
子函数
check_steady_state
:- 遍历所有窗口,调用
calculate_slope_sum
计算每个窗口的斜率和。 - 比较
k_sum
与阈值threshold
,若k_sum
小于阈值则判断该窗口处于稳态。 - 返回一个布尔列表
steady_states
,每个元素对应一个窗口,值为True
表示稳态,False
表示非稳态。
- 遍历所有窗口,调用
-
返回结果:
process_windows
根据steady_states
结果提取稳定和不稳定的窗口索引和数据,分别保存在stable_indices
、unstable_indices
、stable_windows
和unstable_windows
。- 返回这些结果,便于进一步分析或验证。
示例用法说明
在 __main__
中的示例用法展示了如何调用 process_windows
:
- 使用指定的文件和参数,定义窗口大小、步长和阈值。
- 通过输出稳定窗口的索引和不稳定窗口的索引来识别数据的稳态区域。
稳态检测原理
稳态检测主要通过 calculate_slope_sum
计算窗口内数据的波动情况:
- 如果数据在某窗口内波动较小,则
k_sum
会较小;如果数据变化较大,则k_sum
会较大。 - 通过设定一个阈值
threshold
来判断k_sum
是否较小,从而确定是否为稳态。