机器学习: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')

六、效率优化建议

  1. 使用astype()优化内存占用
  2. 避免逐行操作,优先使用向量化方法
  3. 大数据场景使用dask库并行处理
  4. 定期使用df.memory_usage(deep=True)检查内存消耗
posted @ 2025-04-10 14:20  破落户儿  阅读(29)  评论(0)    收藏  举报