跟着小K开始零基础Python量化分析之旅 3: 初探数据世界 —— Pandas与数据清洗的武林秘笈

第三章:初探数据世界 —— Pandas与数据清洗的武林秘笈

在量化江湖中,数据正如武林秘籍中的内功心法,必须先打好基础,才能施展后续高深武技。小K这次获得了一份历史股票交易数据,但初看之下却是一团乱麻:缺失值、重复记录、日期格式不统一……前辈笑着说:“兄弟,若想踏入量化之路,先要学会如何把这‘脏数据’炼成一手干净的‘真气’!”

下面,就跟随小K的脚步,逐步揭开数据清洗的秘密,掌握 Pandas 的基本功法,让数据重新焕发活力!


故事情境

小K收到一份神秘的“历史股票交易数据.csv”,迫不及待地打开后,他发现数据中充斥着各种问题:

  • 日期格式混乱:部分日期格式为 2021-01-01,部分为 2021/01/02
  • 缺失值:有的记录缺失了关键数据,如最低价为空。
  • 重复记录:同一天的数据意外出现了多次。

前辈严肃地指出:“在量化投资中,干净的数据就是你的根基。若想后续策略运行顺利,必须先把这混乱的数据整理整齐。”小K便决心利用 Pandas 这门神技,一步步地清洗并整理这些数据。


主要内容

1. 探索 Pandas 的核心数据结构

1.1 Series 与 DataFrame 的基本概念
  • Series 是一维数据结构,就像带标签的数组。
  • DataFrame 则是二维表格数据,由多个 Series 组成,每一行代表一条记录,每一列代表一个变量。
1.2 行列选择与条件索引
  • Pandas 提供 .loc.iloc 方法,方便我们按标签或位置选择数据;
  • 利用条件索引,我们可以快速筛选出满足特定条件的数据行。
1.3 常用方法
  • head() 方法可以让我们快速查看数据的前几行;
  • describe() 方法生成数据的统计摘要,帮助我们初步了解数据分布情况。

2. 数据清洗与预处理

数据清洗的过程,正如武林高手打磨内功心法。只有将数据处理得干净整齐,才能在后续的量化分析中发挥威力。

2.1 检查与处理缺失值和异常值
  • 缺失值处理:利用 ffill()(前向填充)或其他填充方法,让数据不再出现空白。
  • 异常值处理:对数据进行统计检测,识别并处理明显异常的数据点。
2.2 去重与日期格式转换
  • 去重:使用 drop_duplicates() 方法,确保每个日期只出现一次。
  • 日期格式转换:通过 pd.to_datetime() 方法,将各种格式的日期转换为标准格式;
    • 若转换失败,则生成 NaT(缺失的日期),需要进一步处理。
2.3 时间序列数据对齐

在量化分析中,时间序列数据必须整齐一致。利用重采样(resample)和前向填充(ffill),我们可以将数据统一为连续的时间序列。


实操演练

下面是一个完整的代码示例,小K通过这段代码,将混乱的“历史股票交易数据.csv”整理成一份规范、整洁的时间序列数据。代码中包含了数据读取、缺失值填充、日期格式转换、重复数据删除以及索引排序等步骤,确保后续重采样能顺利进行。

import pandas as pd

# 读取 CSV 数据
df = pd.read_csv('历史股票交易数据.csv')

# 使用 ffill() 填充缺失值(避免 FutureWarning)
df.ffill(inplace=True)

# 将日期列转换为标准日期格式,errors='coerce' 将无法转换的值变为 NaT
df['日期'] = pd.to_datetime(df['日期'], errors='coerce')

# 删除日期转换失败的行(NaT),确保所有日期有效
df.dropna(subset=['日期'], inplace=True)

# 删除重复记录,确保每个日期只出现一次
df.drop_duplicates(subset=['日期'], inplace=True)

# 将日期设为索引
df.set_index('日期', inplace=True)

# 对索引排序,确保其单调递增
df.sort_index(inplace=True)

# 检查索引是否单调递增
print("Index is monotonic increasing:", df.index.is_monotonic_increasing)

# 以每日为频率重采样,并前向填充缺失数据
df = df.resample('D').ffill()

# 输出清洗后的数据
print(df.head())

关键说明

  • 日期转换与 NaT 处理:使用 pd.to_datetime(..., errors='coerce') 后,再通过 dropna() 删除转换失败的日期行。
  • 去重:使用 drop_duplicates(subset=['日期']) 确保每个日期只出现一次,避免重复数据干扰重采样。
  • 排序索引:通过 sort_index() 确保日期索引单调递增,否则重采样时会报错。
  • 重采样:在索引有序的基础上,使用 resample('D').ffill() 将数据重采样为每日数据,并用前向填充法补全缺失值。

成就感与收获

经过这一章的学习,小K已经实现了从混乱无序的数据中提取出清晰、连续的时间序列数据。他体会到:

  • Pandas 基础操作:如何利用 Series 和 DataFrame 操作数据;如何选择数据、查看数据的基本信息。
  • 数据清洗实战:学会了处理缺失值、删除重复数据、转换日期格式,以及如何保证时间序列数据索引的单调性。
  • 实战成就:亲手运行代码,将“脏数据”转变为“干净数据”,为后续量化策略的开发打下坚实基础。

正如前辈所言:“数据若无真气,策略难以飞扬。”小K如今已初步掌握了数据清洗的武林秘笈,接下来,他将带着这份干净的数据继续在量化江湖中闯荡,探寻更多的奥秘……

你可能感兴趣的:(python)