第4章:Pandas基础与数据读取
各位风电运维的同行们,大家好。我是老张,在风场摸爬滚打了十来年。今天咱们聊聊Pandas——说白了,就是Python里处理表格数据的那把“瑞士军刀”。
你想想看,我们每天面对的是什么?SCADA系统导出的几十万行数据,振动监测的时序记录,还有各种Excel报表。没有Pandas,光靠Excel打开这些文件,电脑都能卡成PPT。我刚开始用Python时,就靠它从一堆乱糟糟的数据里扒出规律来。
4.1 两种核心数据结构:Series 和 DataFrame
Pandas里就两种东西:Series和DataFrame。Series就是一列数据,带个索引。DataFrame就是多列数据组成的表格。嗯,就这么简单。
Series——说白了就是一维数组加了个标签。比如我们测风塔的10分钟平均风速,一列数据下来,每个值对应一个时间点。
import pandas as pd
# 创建一个Series,就像我们风场的一列传感器数据
wind_speed = pd.Series([5.2, 6.8, 7.1, 4.9, 8.3],
index=['10:00', '10:10', '10:20', '10:30', '10:40'])
print(wind_speed)
DataFrame——这才是我们真正天天打交道的。它就像Excel表格,有行有列。每列可以存不同类型的数据:风速是浮点数,风向是整数,状态是字符串。
# 创建一个DataFrame,模拟SCADA数据
data = {
'时间': ['10:00', '10:10', '10:20'],
'风速(m/s)': [5.2, 6.8, 7.1],
'功率(kW)': [1200, 1500, 1600],
'状态': ['正常', '正常', '限功率']
}
df = pd.DataFrame(data)
print(df)
4.2 读取CSV文件——风场数据的第一道门槛
我们风场的数据,大部分存在CSV文件里。SCADA系统每天生成一个文件,一年下来几百个。手动打开?不现实。
# 读取CSV文件,最常用的方式
df = pd.read_csv('wind_farm_data.csv')
# 实际项目中,CSV文件经常有坑
# 比如分隔符不是逗号,而是分号
df = pd.read_csv('data.csv', sep=';')
# 再比如文件有中文,编码不对
df = pd.read_csv('data.csv', encoding='gbk')
# 或者前几行是注释,需要跳过
df = pd.read_csv('data.csv', skiprows=3)
4.3 读取Excel文件——报表数据的来源
运维报告、月度统计,很多还是Excel格式。Pandas读取Excel也很方便,但要注意:Excel文件可能有多个Sheet。
# 读取Excel文件
df = pd.read_excel('monthly_report.xlsx')
# 指定Sheet
df = pd.read_excel('monthly_report.xlsx', sheet_name='风速统计')
# 如果Sheet名字记不清,先看看有哪些Sheet
xls = pd.ExcelFile('monthly_report.xlsx')
print(xls.sheet_names)
4.4 数据概览——拿到数据先别急着分析
数据读进来了,第一件事不是做分析,而是看看数据长什么样。我见过太多人,上来就画图,结果数据全是空值,图出来一片空白。
head()——瞄一眼数据长啥样
# 看前5行,默认是5行
print(df.head())
# 也可以指定行数
print(df.head(10))
info()——看数据类型和缺失值
# 这个函数我几乎每次都用
print(df.info())
它会告诉你:有多少行、多少列、每列的数据类型、有没有空值。嗯,这是诊断数据质量的第一个工具。
describe()——看统计信息
# 对数值列做统计描述
print(df.describe())
它会给出每列的计数、均值、标准差、最小值、四分位数、最大值。我经常用这个来快速判断数据有没有异常。比如风速最大值显示999.9,那肯定是传感器出问题了。
4.5 索引与选择——精准定位数据
数据量大了,怎么找到我们想要的那部分?Pandas提供了几种选择方式。
按列选择
# 选择单列,返回Series
wind_speed = df['风速(m/s)']
# 选择多列,返回DataFrame
subset = df[['时间', '风速(m/s)', '功率(kW)']]
按行选择——loc和iloc
这两个函数,我刚开始也搞混过。loc是用标签索引,iloc是用位置索引。
# loc:按标签选择
# 假设时间列是索引
df_indexed = df.set_index('时间')
print(df_indexed.loc['10:00':'10:20']) # 选择时间范围
# iloc:按位置选择
print(df.iloc[0:3]) # 选择前3行
print(df.iloc[0, 1]) # 第1行第2列的值
布尔索引——条件筛选
这个功能,做运维分析时太常用了。比如找出所有风速超过切出风速的数据点。
# 找出风速大于25m/s的数据
high_wind = df[df['风速(m/s)'] > 25]
# 多条件筛选:风速高且功率低(可能是故障)
abnormal = df[(df['风速(m/s)'] > 20) & (df['功率(kW)'] < 500)]
4.6 实战小案例:快速诊断风场数据
好了,理论讲完了,咱们来点实际的。假设你刚拿到一个风场昨天的SCADA数据,怎么快速判断数据质量?
# 1. 读取数据
df = pd.read_csv('scada_20240115.csv', encoding='gbk')
# 2. 数据概览
print("数据形状:", df.shape)
print("\n数据信息:")
print(df.info())
print("\n统计描述:")
print(df.describe())
# 3. 检查缺失值
print("\n缺失值统计:")
print(df.isnull().sum())
# 4. 检查异常值(风速不能为负)
print("\n异常风速:")
print(df[df['风速(m/s)'] < 0])
# 5. 检查停机状态
print("\n停机记录:")
print(df[df['状态'] == '停机'].head())
这一套下来,数据质量心里就有数了。我每次做数据分析前,都会跑一遍这个流程。花不了几分钟,但能避免后面走弯路。
公众号:蓝海资料掘金营,微信deep3321