第1章:Python数据处理入门

各位同学好,我是老张。在储能系统行业摸爬滚打了十几年,我越来越觉得数据可视化是咱们工程师的必备技能。今天开始,咱们一起走进Python数据处理的世界。

说实话,我刚入行那会儿,处理储能数据全靠Excel。一个10万行的电池测试数据,Excel直接卡死。后来转用Python,才发现什么叫效率。嗯,今天咱们就从最基础的三个库开始讲。

本章核心知识点:

  • NumPy:数组创建、索引、切片
  • Pandas:DataFrame创建、数据读取、基本统计
  • Matplotlib:折线图、柱状图
Python数据处理 NumPy 数值计算 数组创建 · 索引 · 切片 Pandas 数据分析 DataFrame · 读取 · 统计 Matplotlib 可视化 折线图 · 柱状图

1.1 NumPy:数组操作的基础

NumPy,说白了就是Python里的数学工具箱。我当年做电池SOC估算时,几千个数据点要同时计算,用Python原生列表慢得让人抓狂。NumPy的数组运算,速度能快几十倍。

数组创建

创建数组的方式有很多,我常用的就这几种:

import numpy as np

# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])

# 全零数组
zeros = np.zeros((3, 4))

# 等差数列
arr2 = np.arange(0, 10, 2)  # [0, 2, 4, 6, 8]

# 均匀分布
arr3 = np.linspace(0, 1, 5)  # [0, 0.25, 0.5, 0.75, 1.0]

我的小技巧:创建电池电压序列时,我习惯用 np.linspace,因为它能精确控制点数。比如模拟100个采样点,直接用 np.linspace(3.0, 4.2, 100) 就搞定了。

索引与切片

索引和切片,跟Python列表差不多,但NumPy多了一些花活。我曾经在分析电池组数据时,需要提取第2到第5节电池的电压,切片一步到位。

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 普通索引
print(arr[0, 1])  # 2

# 切片
print(arr[0:2, 1:3])  # [[2, 3], [5, 6]]

# 布尔索引
mask = arr > 5
print(arr[mask])  # [6, 7, 8, 9]

注意:NumPy的切片返回的是视图,不是副本。修改切片会影响原数组。我刚开始就踩过这个坑,改切片数据把原始数据也改了,排查了半天。

1.2 Pandas:数据分析的瑞士军刀

Pandas,我个人觉得是Python数据分析里最实用的库。你想想看,储能系统的数据,无非就是时间、电压、电流、温度这些列。Pandas的DataFrame,天然就是为这种表格数据设计的。

创建DataFrame

import pandas as pd

# 从字典创建
data = {
    '时间': ['08:00', '09:00', '10:00'],
    '电压(V)': [3.7, 3.8, 3.9],
    '电流(A)': [10, 12, 15],
    '温度(°C)': [25, 26, 27]
}
df = pd.DataFrame(data)
print(df)
时间电压(V)电流(A)温度(°C)
08:003.71025
09:003.81226
10:003.91527

读取数据文件

实际项目中,数据大多来自CSV或Excel文件。我记得有一次,客户给了个500MB的CSV文件,用Excel打开直接崩溃。用Pandas读取,几秒钟就搞定了。

# 读取CSV
df = pd.read_csv('battery_data.csv')

# 读取Excel
df = pd.read_excel('battery_data.xlsx', sheet_name='Sheet1')

# 查看前5行
print(df.head())

基本统计分析

做数据分析,第一步就是看统计摘要。Pandas的 describe() 方法,能一次性给出均值、标准差、四分位数等关键指标。

# 统计摘要
print(df.describe())

# 单独统计
print(df['电压(V)'].mean())   # 平均值
print(df['电压(V)'].max())    # 最大值
print(df['电压(V)'].min())    # 最小值
print(df['电压(V)'].std())    # 标准差

实战经验:我在做电池一致性分析时,经常用 describe() 快速查看各节电池电压的分布。如果某节电池的电压标准差明显偏大,那这节电池大概率有问题。

1.3 Matplotlib:数据可视化入门

数据光看数字不够直观,画成图才一目了然。Matplotlib是Python最经典的可视化库,我用了快十年了。

折线图:看趋势

折线图适合展示数据随时间的变化趋势。比如电池充电过程中的电压变化:

import matplotlib.pyplot as plt

# 模拟充电数据
time = [0, 10, 20, 30, 40, 50, 60]
voltage = [3.0, 3.2, 3.5, 3.7, 3.9, 4.0, 4.2]

plt.plot(time, voltage, marker='o', linestyle='-', color='b')
plt.xlabel('时间 (分钟)')
plt.ylabel('电压 (V)')
plt.title('电池充电曲线')
plt.grid(True)
plt.show()

柱状图:比大小

柱状图适合比较不同类别的数据。比如对比不同电池模组的容量:

# 模拟电池模组容量数据
modules = ['模组A', '模组B', '模组C', '模组D']
capacity = [100, 95, 110, 105]

plt.bar(modules, capacity, color=['#4a90d9', '#e74c3c', '#2ecc71', '#f39c12'])
plt.xlabel('电池模组')
plt.ylabel('容量 (Ah)')
plt.title('各模组容量对比')
plt.show()

我的习惯:画图时我总会加上网格线 plt.grid(True),这样数据点对应的数值更容易读。另外,颜色我一般用蓝、红、绿、橙这四种,对比明显。

避坑指南

最后,分享几个我踩过的坑:

  • 数据类型问题:我曾经从CSV读数据,电压列被读成了字符串,导致计算报错。记得用 df.dtypes 检查数据类型。
  • 缺失值处理:实际数据总有缺失。用 df.isnull().sum() 检查,再用 df.fillna()df.dropna() 处理。
  • 中文显示:Matplotlib默认不支持中文。记得加这两行代码:plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False

好了,第一章的内容就到这里。这三个库是Python数据处理的基石,多练练,后面做储能系统可视化就顺手了。


公众号:蓝海资料掘金营,微信deep3321