机器学习:Pandas
用Pandas开启数据分析之旅:从基础操作到实战可视化
一、Pandas核心优势
作为Python生态中最强大的数据分析库,Pandas凭借其两大核心数据结构——Series和DataFrame,为数据工作者提供了:
- 高效便捷的数据清洗能力
- 灵活多样的数据转换方法
- 快速直观的数据可视化接口
- 无缝衔接数据库的读写操作
二、环境搭建
# 安装核心库
pip install pandas
# 扩展依赖(数据可视化需要)
pip install matplotlib
三、核心数据结构解析
3.1 Series:智能一维数组
import pandas as pd
import numpy as np
price_series = pd.Series([1.23, 3.45, np.nan, 6.78],
index=['苹果', '香蕉', '橙子', '葡萄'],
name="水果价格")
print(price_series)
特性说明:
- 支持自动对齐索引
- 内置缺失值处理(NaN)
- 支持矢量化运算
3.2 DataFrame:二维数据表
stock_data = {
'日期': pd.date_range('20240101', periods=3),
'开盘价': [3.14, 3.25, 3.30],
'收盘价': [3.20, 3.22, 3.28]
}
df = pd.DataFrame(stock_data)
# 数据探查三部曲
print(df.head(2)) # 查看头部数据
print(df.describe()) # 统计摘要
print(df.dtypes) # 查看数据类型
四、数据操作工具箱
4.1 数据清洗
# 缺失值处理
df.fillna(method='ffill', inplace=True) # 前向填充
df.dropna(thresh=2, inplace=True) # 保留至少2个非空值的行
# 重复值处理
print(df[df.duplicated()]) # 查看重复记录
df.drop_duplicates(subset=['日期'], keep='last', inplace=True)
# 数据类型转换
df['日期'] = pd.to_datetime(df['日期'])
df['收盘价'] = df['收盘价'].astype('float32')
4.2 数据查询技巧
# 条件过滤
print(df.query('收盘价 > 开盘价')) # 筛选上涨日
# 时间范围过滤
print(df[(df['日期'] > '2024-05-01') & (df['收盘价'] < 3.2)])
# 排序优化
df.sort_values(by=['收盘价'], ascending=False, inplace=True)
4.3 分组聚合
# 时间维度统计
monthly_stats = df.groupby(pd.Grouper(key='日期', freq='M')).agg({
'收盘价': ['mean', 'max', 'min'],
'开盘价': 'sum'
})
print(monthly_stats)
五、数据可视化实战
5.1 绘制股票趋势图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import akshare as ak
from datetime import datetime, timedelta
end_date = datetime.now().strftime('%Y-%m-%d')
start_date = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d')
# df = ak.fund_etf_hist_sina(symbol="sh510880")
df = pd.read_csv('510880_1year.csv')
df['date'] = pd.to_datetime(df['date'])
df = df[(df['date'] >= start_date) & (df['date'] <= end_date)]
df = df.sort_values('date')
# 计算7日和21日移动平均线
df['SMA_30'] = df['close'].rolling(window=30).mean()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置黑体显示中文
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.figure(figsize=(10, 6))
plt.plot(df['close'], label='收盘价')
plt.plot(df['SMA_30'], label='30日均线')
plt.title('红利走势图', fontsize=14)
plt.xlabel('date', fontsize=12)
plt.ylabel('price', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
5.2 进阶技巧
# 分块处理大数据
chunk_iter = pd.read_csv('510880_1year.csv',
parse_dates=['date'],
chunksize=1000)
for chunk in chunk_iter:
process_chunk(chunk) # 自定义处理函数
# 数据库交互
with pyodbc.connect(conn_str) as conn:
df = pd.read_sql("SELECT * FROM stocks WHERE volume > 1e6", conn)
df.to_sql('filtered_stocks', conn, if_exists='replace')
六、效率优化建议
- 使用
astype()优化内存占用 - 避免逐行操作,优先使用向量化方法
- 大数据场景使用
dask库并行处理 - 定期使用
df.memory_usage(deep=True)检查内存消耗

浙公网安备 33010602011771号