pandas_demo · 表格处理演示 2026-09-27

内容:
Series 列vs DataFrame 表
数据清洗三连:看结构 / 筛条件 / 补缺失
时间序列三件套:日期索引 / pct_change / rolling
一张表打尽:收盘价 + 收益率 + 20日均线

导入与主入口

import pandas as pd # pandas:表格处理库(工作台) from quant_data import get_kline # 从数据工具箱拿"拉数据"的函数 if __name__ == "__main__":

1. Series vs DataFrame

# ========== 1. Series vs DataFrame ========== df = get_kline() # 拿到默认股票日线表格 print("\n----- DataFrame 长这样(一张表)-----") print(df.tail(3).to_string()) # 打印最后 3 行 s = df["close"] # 取"收盘价"这一列,得到 Series print("\n----- Series 长这样(一列)-----") print(s.tail(3)) # 打印这一列最后 3 行 print("\nSeries 是一列,DataFrame 是一张表;列拼起来就是表。")
比喻:Series 是一列(一竖条),DataFrame 是一张表(多列拼起来)。

2. 数据清洗三连

清洗三连 ① 看结构

# ========== 2. 数据清洗三连 ========== print("\n===== 清洗三连 ① 看结构 =====") print("行数 x 列数:", df.shape) # .shape:几行几列 print("列名:", list(df.columns)) # .columns:所有列名 print("缺失值统计:\n", df.isna().sum()) # .isna():每个格子是不是空值(空 True / 不空 False) # .sum():把 True 数一下,得到每列缺几个值

清洗三连 ② 筛条件

print("\n===== 清洗三连 ② 筛条件 =====") df["pct"] = df["close"].pct_change() # 新增一列 pct:当日涨幅。pct_change() = 和上一行比,变化百分之多少 hot = df[df["pct"] > 0.03] # 布尔筛选:在方括号里写条件,只留下"满足条件的行" # 0.03 就是 3%,即单日涨超 3% 的日子 print(f"五年里单日涨超 3% 的日子有 {len(hot)} 天:") # 数一下有几行 print(hot.head(3).to_string()) # 打印前 3 天看看

清洗三连 ③ 补缺失

print("\n===== 清洗三连 ③ 补缺失 =====") print("删掉空行后还剩:", len(df.dropna()), "行") # .dropna():把有空值的行删掉 df = df.dropna() # 真正执行删除,覆盖原表

3. 时间序列三件套

# ========== 3. 时间序列三件套 ========== print("\n===== 时间序列三件套 =====") df["收益率"] = df["close"].pct_change() # ① 收益率(和上一日比) df["MA5"] = df["close"].rolling(5).mean() # ② 5 日均线 # .rolling(5):开一个"5 天"的滚动窗口;数据范围就是它以及它前面4个元素(总共5个元素)来计算;.mean():求窗口里的均值 df["MA20"] = df["close"].rolling(20).mean() # ③ 20 日均线

4. 一张表打尽

print("\n----- 一张表打尽 -----") print(df.tail(5)[["close", "收益率", "MA5", "MA20"]].to_string()) # [["close", ...]]:同时取好几列(注意里面是两层方括号) print("\n看最后一行:MA20 是 20 天均值的滚动窗口,越平滑、反应越慢;") print("MA5 更灵敏。短线上穿长线 = 金叉(买入信号),这就是下期实战的基础。")

核心要点速览

Series:一列(df["close"])
DataFrame:一张表(df)
看结构:shape / columns / isna
筛条件:df[df["pct"] > 0.03]
补缺失:df.dropna()
收益率:pct_change()
均线:rolling(5).mean()
多列选取:df[["close","MA5"]]
金句: pct_change() 算收益率, rolling(5).mean() 算均线 —— pandas 把"时间序列"变成"一行代码"。

运行输出 · python .\pandas_demo.py

PS> python .\pandas_demo.py [数据源] akshare 不可用(ProxyError),尝试 baostock... login success! logout success! [数据源] baostock 获取成功,共 178 条 ----- DataFrame 长这样(一张表)----- open high low close volume date 2026-09-22 1252.15 1265.88 1248.10 1253.80 2457294 2026-09-23 1255.03 1271.50 1250.89 1251.24 3098122 2026-09-24 1250.01 1256.13 1231.05 1237.00 3123935 ----- Series 长这样(一列)----- date 2026-09-22 1253.80 2026-09-23 1251.24 2026-09-24 1237.00 Name: close, dtype: float64 Series 是一列,DataFrame 是一张表;列拼起来就是表。 ===== 清洗三连 ① 看结构 ===== 行数 x 列数: (178, 5) 列名: ['open', 'high', 'low', 'close', 'volume'] 缺失值统计: open 0 high 0 low 0 close 0 volume 0 dtype: int64 ===== 清洗三连 ② 筛条件 ===== 五年里单日涨超 3% 的日子有 8 天: open high low close volume pct date 2026-01-29 1304.138805 1411.595935 1298.336120 1404.484227 18953440 0.086146 2026-02-03 1411.595935 1442.670583 1409.671475 1440.824274 8632066 0.033581 2026-02-04 1450.671255 1497.825397 1439.925542 1489.746575 10912293 0.033954 ===== 清洗三连 ③ 补缺失 ===== 删掉空行后还剩: 177 行 ===== 时间序列三件套 ===== ----- 一张表打尽 ----- close 收益率 MA5 MA20 date 2026-09-18 1257.12 -0.007782 1266.562 1291.7955 2026-09-21 1252.57 -0.003619 1261.484 1289.1910 2026-09-22 1253.80 0.000982 1257.694 1286.6810 2026-09-23 1251.24 -0.002042 1256.342 1284.1030 2026-09-24 1237.00 -0.011381 1250.346 1281.3380 看最后一行:MA20 是 20 天均值的滚动窗口,越平滑、反应越慢; MA5 更灵敏。短线上穿长线 = 金叉(买入信号),这就是下期实战的基础
关键结论:清洗后剩 177 行;单日涨超 3% 的日子有 8 天;MA5 比 MA20 更灵敏,短线上穿长线即"金叉"。