第1章:数据采集与预处理实战
大家好,我是老张。在电池算法这个行当摸爬滚打了十来年,今天咱们聊聊数据采集和预处理。
很多人一上来就急着建模型,结果数据质量不行,后面全白搭。我踩过这个坑,所以这一章咱们把基础打牢。
1.1 电池循环测试数据集介绍
做电池寿命预测,数据是命根子。目前业界最常用的两个公开数据集,一个是NASA的,一个是Calce的。
NASA数据集:来自美国宇航局艾姆斯研究中心。他们用18650电池做循环老化测试,记录了电压、电流、温度、阻抗等参数。每个电池从满充到放空算一次循环,直到容量衰减到70%左右。
Calce数据集:来自马里兰大学的CALCE中心。这个数据集更丰富一些,包含了不同温度、不同放电倍率下的测试数据。我个人更喜欢用Calce的数据做验证,因为它的工况更接近真实场景。
| 数据集 | 电池类型 | 测试条件 | 样本数量 |
|---|---|---|---|
| NASA | 18650 | 室温,1C充放 | 约30个电池 |
| Calce | 18650/磷酸铁锂 | 多温度,多倍率 | 约50个电池 |
1.2 电压/电流/温度曲线可视化
拿到数据第一件事,画曲线。别急着算特征,先看看数据长什么样。
我习惯用Matplotlib画三张图:电压曲线、电流曲线、温度曲线。放在同一个画布上,方便对比。
import matplotlib.pyplot as plt
import pandas as pd
# 假设data是DataFrame,包含voltage, current, temperature列
plt.figure(figsize=(12, 8))
plt.subplot(3, 1, 1)
plt.plot(data['voltage'], color='blue')
plt.ylabel('电压 (V)')
plt.subplot(3, 1, 2)
plt.plot(data['current'], color='green')
plt.ylabel('电流 (A)')
plt.subplot(3, 1, 3)
plt.plot(data['temperature'], color='red')
plt.ylabel('温度 (°C)')
plt.xlabel('时间点')
plt.tight_layout()
plt.show()
你看,电压曲线在放电末端会有一个陡降,那是电池快没电的信号。温度曲线在放电中期会上升,那是内阻发热导致的。这些规律看多了,你一眼就能判断数据是否正常。
1.3 异常值检测与平滑滤波
数据采集过程中,传感器偶尔会抽风。我遇到过电压值突然跳到100V的情况,明显是采集错误。
异常值检测,我常用两种方法:
- 3σ原则:数据点偏离均值超过3个标准差,视为异常
- IQR方法:四分位距法,超出Q1-1.5IQR或Q3+1.5IQR的算异常
检测到异常后,别直接删掉。我建议用前后值的均值替换,或者用插值法补全。
from scipy import signal
# 中值滤波,窗口大小设为5
filtered_voltage = signal.medfilt(data['voltage'], kernel_size=5)
# 或者用Savitzky-Golay滤波
filtered_voltage_sg = signal.savgol_filter(data['voltage'], window_length=7, polyorder=2)
我曾经在一个项目里,用窗口大小为21的滤波器处理数据,结果容量衰减曲线变得太平滑,模型死活学不到退化趋势。后来发现是滤波过度了,改回窗口5就好了。
1.4 容量增量分析(ICA)基础
容量增量分析,英文叫Incremental Capacity Analysis,简称ICA。这是电池健康状态评估的利器。
说白了,ICA就是把电压-容量曲线转换成dQ/dV曲线。为什么要这么做?因为dQ/dV曲线上的峰值位置和高度,能反映电池内部的电化学状态变化。
计算步骤很简单:
- 对电压进行等间隔采样
- 计算相邻采样点之间的容量变化dQ
- 计算相邻采样点之间的电压变化dV
- 用dQ除以dV,得到dQ/dV值
import numpy as np
def compute_ica(voltage, capacity):
# 对电压排序,确保单调递增
idx = np.argsort(voltage)
voltage_sorted = voltage[idx]
capacity_sorted = capacity[idx]
# 计算差分
dQ = np.diff(capacity_sorted)
dV = np.diff(voltage_sorted)
# 避免除零
dV[dV == 0] = 1e-6
# 计算dQ/dV
ica = dQ / dV
# 电压取中点
voltage_mid = (voltage_sorted[:-1] + voltage_sorted[1:]) / 2
return voltage_mid, ica
画出来的ICA曲线,你会看到几个明显的峰。随着电池老化,这些峰的位置会偏移,高度会降低。这就是我们做寿命预测的依据。
嗯,这一章的内容就这些。数据采集和预处理看着基础,但真要做好,需要反复练习。我当年也是画了上百张曲线图,才慢慢找到感觉的。