第4章:Pandas基础与数据读取

各位风电运维的同行们,大家好。我是老张,在风场摸爬滚打了十来年。今天咱们聊聊Pandas——说白了,就是Python里处理表格数据的那把“瑞士军刀”。

你想想看,我们每天面对的是什么?SCADA系统导出的几十万行数据,振动监测的时序记录,还有各种Excel报表。没有Pandas,光靠Excel打开这些文件,电脑都能卡成PPT。我刚开始用Python时,就靠它从一堆乱糟糟的数据里扒出规律来。

Pandas数据读取与概览 数据结构 Series(一维) DataFrame(二维) 数据读取 read_csv() read_excel() 数据概览 head() / info() describe() 索引与选择 loc / iloc 列选择 / 布尔索引 掌握这些,风场数据任你摆布

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)
我的经验:刚开始用Pandas时,我老把DataFrame和Excel表格划等号。后来发现,DataFrame的索引功能比Excel强大太多了。比如按时间索引切片,Excel得写公式,Pandas一行代码搞定。

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)
避坑指南:我曾经因为编码问题,折腾了一下午。SCADA系统导出的CSV,有的用UTF-8,有的用GBK。我的建议是:先打开文件看一眼,确认编码格式。实在不行,用encoding='utf-8'和encoding='gbk'都试一遍。

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)
关键点:读取Excel需要安装openpyxl或xlrd库。我习惯用openpyxl,兼容性好。安装命令:pip install openpyxl

4.4 数据概览——拿到数据先别急着分析

数据读进来了,第一件事不是做分析,而是看看数据长什么样。我见过太多人,上来就画图,结果数据全是空值,图出来一片空白。

head()——瞄一眼数据长啥样

# 看前5行,默认是5行
print(df.head())

# 也可以指定行数
print(df.head(10))

info()——看数据类型和缺失值

# 这个函数我几乎每次都用
print(df.info())

它会告诉你:有多少行、多少列、每列的数据类型、有没有空值。嗯,这是诊断数据质量的第一个工具。

describe()——看统计信息

# 对数值列做统计描述
print(df.describe())

它会给出每列的计数、均值、标准差、最小值、四分位数、最大值。我经常用这个来快速判断数据有没有异常。比如风速最大值显示999.9,那肯定是传感器出问题了。

我的习惯:每次拿到新数据,先跑一遍info()和describe()。info()看结构,describe()看数值分布。这两个函数能帮你发现80%的数据问题。

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)]
避坑指南:多条件筛选时,每个条件要用括号括起来,中间用&(与)或|(或)连接。不能用and/or。我曾经在这里栽过跟头,查了半天才发现是语法问题。

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())

这一套下来,数据质量心里就有数了。我每次做数据分析前,都会跑一遍这个流程。花不了几分钟,但能避免后面走弯路。

总结一下:Pandas的核心就三件事——读数据、看数据、选数据。读数据用read_csv/read_excel,看数据用head/info/describe,选数据用loc/iloc/布尔索引。把这几个玩熟了,风场数据随便你折腾。

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