第1章:Python数据处理入门
各位同学好,我是老张。在储能系统行业摸爬滚打了十几年,我越来越觉得数据可视化是咱们工程师的必备技能。今天开始,咱们一起走进Python数据处理的世界。
说实话,我刚入行那会儿,处理储能数据全靠Excel。一个10万行的电池测试数据,Excel直接卡死。后来转用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:00 | 3.7 | 10 | 25 |
| 09:00 | 3.8 | 12 | 26 |
| 10:00 | 3.9 | 15 | 27 |
读取数据文件
实际项目中,数据大多来自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