第1章:数据采集与预处理实战

大家好,我是老张。在电池算法这个行当摸爬滚打了十来年,今天咱们聊聊数据采集和预处理。

很多人一上来就急着建模型,结果数据质量不行,后面全白搭。我踩过这个坑,所以这一章咱们把基础打牢。

1.1 电池循环测试数据集介绍

做电池寿命预测,数据是命根子。目前业界最常用的两个公开数据集,一个是NASA的,一个是Calce的。

NASA数据集:来自美国宇航局艾姆斯研究中心。他们用18650电池做循环老化测试,记录了电压、电流、温度、阻抗等参数。每个电池从满充到放空算一次循环,直到容量衰减到70%左右。

Calce数据集:来自马里兰大学的CALCE中心。这个数据集更丰富一些,包含了不同温度、不同放电倍率下的测试数据。我个人更喜欢用Calce的数据做验证,因为它的工况更接近真实场景。

数据集 电池类型 测试条件 样本数量
NASA 18650 室温,1C充放 约30个电池
Calce 18650/磷酸铁锂 多温度,多倍率 约50个电池
我的建议:新手先用NASA数据集练手,数据干净、结构简单。等熟悉了再上Calce,那个坑多,但学到的也多。

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)
注意:滤波窗口别设太大。窗口太大,会把真实的容量退化特征也给平滑掉。我一般用5到9之间的奇数。

我曾经在一个项目里,用窗口大小为21的滤波器处理数据,结果容量衰减曲线变得太平滑,模型死活学不到退化趋势。后来发现是滤波过度了,改回窗口5就好了。

1.4 容量增量分析(ICA)基础

容量增量分析,英文叫Incremental Capacity Analysis,简称ICA。这是电池健康状态评估的利器。

说白了,ICA就是把电压-容量曲线转换成dQ/dV曲线。为什么要这么做?因为dQ/dV曲线上的峰值位置和高度,能反映电池内部的电化学状态变化。

计算步骤很简单:

  1. 对电压进行等间隔采样
  2. 计算相邻采样点之间的容量变化dQ
  3. 计算相邻采样点之间的电压变化dV
  4. 用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曲线,你会看到几个明显的峰。随着电池老化,这些峰的位置会偏移,高度会降低。这就是我们做寿命预测的依据。

核心思路:ICA曲线的变化,本质上是电池正负极材料活性物质损失、锂离子消耗的外在表现。看懂ICA,你就看懂了电池的衰老过程。

嗯,这一章的内容就这些。数据采集和预处理看着基础,但真要做好,需要反复练习。我当年也是画了上百张曲线图,才慢慢找到感觉的。

数据采集与预处理知识体系 电池循环测试数据 公开数据集 NASA数据集 Calce数据集 曲线可视化 电压曲线 电流曲线 温度曲线 数据预处理 异常值检测 平滑滤波 容量增量分析(ICA) dQ/dV计算 峰值分析

蓝海数据掘金营,专注资料整理