深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【AkShare 系列 第5讲】转成DataFrame并预览

本讲把 AkShare 原始返回结果推进成真正可继续使用的工作表,围绕列结构检查、核心列抽取、日期与数值转型、头尾预览和通用预览函数展开。目标是让入门者把“拿到一张表”升级成“会判断这张表是否已经能继续用于保存、排错和均线计算”。

2026-04-23 智铨研究 阅读时长 10 分钟

目录

  1. 本节目标
  2. 为什么要把“转成 DataFrame 并预览”单独拎出来
  3. 沿用前 2 到第 4 讲的数据对象
  4. 四步把原始返回表变成可读工作表
  5. 先看整体轮廓
  6. 挑出最关键的几列
  7. 把日期列和数值列显式处理一遍
  8. 做一次真正的预览输出
  9. 怎样判断这张预览表已经可继续使用
  10. 预览表还是 DataFrame
  11. 列数不为 0,且至少保住了 3 列核心信息
  12. 日期列能被正常解析
  13. 收盘列有足够多的有效数值
  14. 预览打印后人能看懂
  15. 为什么明明是 DataFrame 还要再处理
  16. 原始表本来就是 DataFrame,为啥还要 copy
  17. 列名在本地和教程不完全一样怎么办
  18. 数值列转型后有空值是不是失败
  19. 头尾打印出来顺序不对
  20. 哪些情况依然算完成本讲
  21. 把预览动作封装成一个通用函数
  22. 做一张“后面愿意继续拿来用”的预览表
  23. 这一讲过没过怎么判断
  24. 预览不是“随便看两眼”,而是建立数据感
  25. 一套更稳的预览顺序
  26. 把预览结果写成一句工作结论
  27. 如果换成别的 AkShare 表,这一讲还能复用吗
  28. 系列衔接
  29. 风险揭示与免责声明

1. 本节目标

本讲要做的事情很明确:把前几讲已经拿到的原始返回结果,稳定地放进 pandas DataFrame,并用最小预览动作确认这张表已经进入“可继续清洗、可继续计算”的状态。虽然前面几讲里你已经不断看到 DataFrame,但那更多是“接口返回了一个表”。第 5 讲的重点,是把这种“看到表”升级成“会主动检查表的结构、列名、类型和可读性”。

学完这一讲后,先把下面三件事做扎实:

  1. 看到一张原始行情表后,先用 pandas 做结构检查,而不是直接往下算指标。
  2. 知道怎样把日期列、价格列、成交量列压成最常用的预览视图。
  3. 能明确判断一张表是“已经可以往下用”,还是“还停留在原始接口返回层”。

这一步看起来很基础,但它其实决定了后面第 6 讲保存 CSV、第 8 讲联动 pandas 算均线时,你是在处理一张整洁表,还是在一堆还没看清的原始字段上硬算。

2. 为什么要把“转成 DataFrame 并预览”单独拎出来

很多新手会说:前面拿到的本来就是 DataFrame,为什么还要单独讲这一课?问题就在这里。接口“返回一个 DataFrame”和你“真正会用一张 DataFrame”不是一回事。真正的差别体现在三个动作上:

  1. 你会不会第一时间检查 shapecolumnsdtypes
  2. 你会不会把原始表压缩成一张更容易看懂的预览表。
  3. 你会不会在进入下一步前先判断日期和价格列是不是可计算。

如果这三个动作没建立起来,后面你每次拿到新接口时都还会重新慌一次。所以第 5 讲本质上是在训练一种通用的表格处理顺序,而不是只服务当前这一套 AkShare 短课。

3. 沿用前 2 到第 4 讲的数据对象

这一讲不需要重新安装环境,也不要求新增依赖。你可以直接复用前面几讲已经拿到的任意一张表,例如:

import akshare as ak
import pandas as pd

daily_df = ak.stock_zh_a_hist(
    symbol="000001",
    period="daily",
    start_date="20240101",
    end_date="20240215",
    adjust=""
)

如果你更想用指数表练习,也完全可以。关键不在于必须用哪张表,而在于你要对一张“已经从接口拿回来的原始表”做结构化预览。

4. 四步把原始返回表变成可读工作表

下面四步分别对应看轮廓、收窄字段、处理类型和检查头尾。按这个顺序做,后面保存和计算都会稳很多。

5. 先看整体轮廓

不要一上来就盯着前几行内容,先看这张表的大轮廓:

print(daily_df.shape)
print(daily_df.columns.tolist())
print(daily_df.dtypes)

这三行解决的是三类完全不同的问题:

如果你把这一步省掉,后面一旦均线算错、保存 CSV 混乱或日期排序异常,你会很难快速定位原因。

6. 挑出最关键的几列

AkShare 原始表经常列不少,但入门阶段最常用的其实就几类:日期、开盘、收盘、成交量。你可以先把它们抽出来:

keep_cols = ["日期", "开盘", "收盘", "成交量"]
preview_df = daily_df[[col for col in keep_cols if col in daily_df.columns]].copy()
print(preview_df.head())

这里的关键不是死抠列名,而是形成一个动作:原始表先收窄,再进入下一步。因为真正的工作表应该服务于当前任务,而不是把所有原始字段一股脑带着走。

7. 把日期列和数值列显式处理一遍

如果你想让预览表真正可继续用,最好不要只停在打印上,而是顺手做一次基础类型处理:

preview_df["日期"] = pd.to_datetime(preview_df["日期"])
preview_df["开盘"] = pd.to_numeric(preview_df["开盘"], errors="coerce")
preview_df["收盘"] = pd.to_numeric(preview_df["收盘"], errors="coerce")
preview_df["成交量"] = pd.to_numeric(preview_df["成交量"], errors="coerce")

这样做的意义很直接:你把“看起来像能用”的表,推进成了“类型上真的能继续用”的表。后面保存、计算、排序时,问题会少很多。

8. 做一次真正的预览输出

最后不要只看 head(),建议同时看头部和尾部:

print(preview_df.head(5))
print(preview_df.tail(5))

头部帮助你检查起始日期和字段排列,尾部帮助你确认末端日期和整体排序逻辑。一个很常见的初学者误区,是只看前 5 行就以为整张表都没问题。实际上,很多排序、重复、异常值问题只在尾部或中间位置才容易暴露。

9. 怎样判断这张预览表已经可继续使用

第 5 讲的验证标准不复杂,但一定要做完整。

10. 预览表还是 DataFrame

assert isinstance(preview_df, pd.DataFrame)

11. 列数不为 0,且至少保住了 3 列核心信息

assert preview_df.shape[1] >= 3

12. 日期列能被正常解析

assert preview_df["日期"].notna().all()

13. 收盘列有足够多的有效数值

assert preview_df["收盘"].notna().sum() > 0

14. 预览打印后人能看懂

print(preview_df.head())

这条看似主观,但其实很重要。因为第 5 讲的本质就是让你把一张原始返回表整理成“人眼先能快速理解”的工作表。

15. 为什么明明是 DataFrame 还要再处理

这些问题大多不是代码太难,而是原始表和工作表的边界还没分清。先把边界理顺,后面很多小问题会自己消失。

16. 原始表本来就是 DataFrame,为啥还要 copy

因为你后面很可能要做转型、筛列、重命名或排序。如果一直在原始对象上直接改,容易把调试过程和原始返回结果混在一起。copy() 的成本很低,但会让你的操作边界清楚很多。

17. 列名在本地和教程不完全一样怎么办

先打印 columns.tolist(),然后用你本地真实存在的字段名替换。第 5 讲真正训练的是“先识别结构,再抽核心列”,而不是死记固定字面值。

18. 数值列转型后有空值是不是失败

不一定。它可能只是表示某些位置原本就缺值,或者某个字段里混进了非数值字符。入门阶段你先把这些空值看见、标出来,就已经比完全不做转型前进了一步。

19. 头尾打印出来顺序不对

这通常说明你还需要明确排序规则。不是所有接口都保证你想象中的顺序,所以第 5 讲要你同时看头部和尾部,就是为了尽早发现这个问题。

20. 哪些情况依然算完成本讲

  1. 你最终保留下来的核心列不一定正好是“日期、开盘、收盘、成交量”这四列,只要能形成一张对后续任务真正有用的预览表就可以。
  2. 预览表的行数可以很多,不要求在这一讲把它缩成很短的数据集。当前目标是“结构清楚”,不是“数据量最小”。
  3. 某一列转成数值后出现少量空值,不等于本讲失败。只要你已经识别出来并知道后面要处理,它仍然是有效进展。
  4. 你用股票表练,也可以用指数表练。本讲强调的是 pandas 预览动作,不是某个特定数据对象。

21. 把预览动作封装成一个通用函数

第 5 讲最值得沉淀的,不是某个接口名,而是一小段通用预览函数:

import pandas as pd

def build_preview(df: pd.DataFrame, keep_cols: list[str]) -> pd.DataFrame:
    picked = [col for col in keep_cols if col in df.columns]
    preview = df[picked].copy()
    if "日期" in preview.columns:
        preview["日期"] = pd.to_datetime(preview["日期"], errors="coerce")
    for col in preview.columns:
        if col != "日期":
            preview[col] = pd.to_numeric(preview[col], errors="coerce")
    return preview

preview_df = build_preview(daily_df, ["日期", "开盘", "收盘", "成交量"])
print(preview_df.head())

这个函数后面不仅能服务 AkShare,也能服务你用别的接口拿到的表。只要原理一致,它就是一段能反复复用的基础工具。

22. 做一张“后面愿意继续拿来用”的预览表

建议你花 5 到 10 分钟完成下面这个最小作业:

  1. 从前面任一讲拿到一张原始表。
  2. 挑出你接下来最常用的 3 到 4 列。
  3. 完成日期和数值列的基础转型。
  4. 打印头部和尾部。
  5. 用一句话写明:下一讲或后面哪个任务会继续使用这张表。

做到这一步,第 5 讲的价值才真正落地。因为你不只是“会看一张表”,而是已经得到一张准备继续往下传递的中间产物。

23. 这一讲过没过怎么判断

如果你现在能说出这句话,第 5 讲就算真的完成了:

“我已经能把 AkShare 的原始返回结果压成一张字段清楚、类型基本可用、头尾都能正常检查的工作表。”

这句话其实就把第 5 讲最核心的工作说完了。后面无论是保存 CSV、排查字段问题,还是联动 pandas 算均线,都会从这样一张工作表继续往下走。

24. 预览不是“随便看两眼”,而是建立数据感

很多人第一次接触 DataFrame 时,会把预览理解成“打印一下 head() 看看有没有报错”。但真正有用的预览,不只是确认程序没崩,而是建立你对这张表的第一层数据感。所谓数据感,在第 5 讲里主要体现在四个判断上:

  1. 这张表一眼看上去是不是你想拿到的那类数据。
  2. 列名是不是贴合当前任务,而不是看起来像别的接口。
  3. 日期列、价格列、成交量列是不是出现在合理位置。
  4. 如果现在立刻让我继续做下一步,我最想保留的是哪几列。

你会发现,一旦这四个判断建立起来,后面每次拿到新表时,你都不会再从完全陌生开始。哪怕是别的接口、别的标的、别的频率,第一反应也还是先看结构、再看核心列、最后看类型。这就是第 5 讲真正想帮你建立的通用习惯。

25. 一套更稳的预览顺序

如果你总担心自己预览时漏掉东西,可以直接把顺序固定下来:

print('--- shape ---')
print(daily_df.shape)

print('--- columns ---')
print(daily_df.columns.tolist())

print('--- dtypes ---')
print(daily_df.dtypes)

print('--- head ---')
print(daily_df.head(3))

print('--- tail ---')
print(daily_df.tail(3))

这套顺序的好处,是它把“全局轮廓”和“局部样本”分开看了。先看 shapecolumns,你知道这是不是一张大体合理的表;再看 headtail,你知道具体内容是不是也大体对路。只要坚持几次,这会变成一种近乎自动的检查流程。

26. 把预览结果写成一句工作结论

入门阶段还有一个很有用的小动作:不要只打印,顺手写一句结论。例如:

print('结论:这张表已经包含日期、开盘、收盘、成交量四列,可以继续用于 CSV 保存和均线计算。')

这句话看起来像多余,但它有两个实际价值:

  1. 迫使你把“我看到了什么”转成“我确认了什么”。
  2. 帮你明确这张表下一步到底要拿去做什么。

当你把打印结果和一句结论绑在一起时,后面的练习会更像在完成真实工作,而不是单纯在堆代码。

27. 如果换成别的 AkShare 表,这一讲还能复用吗

完全可以。第 5 讲的方法并不是只绑定个股日线。比如你前面抓过财经日历,也能照样套同样的预览思路:

  1. 先看行列数是否合理。
  2. 再看列名有没有你需要的事件字段、日期字段。
  3. 然后只保留最关键的几列做预览。
  4. 最后确认这张表后面究竟准备用来做什么。

你会发现,只要是“接口返回一张表”,第 5 讲的方法几乎都能直接套过去。这也是为什么它值得单独成一讲。它训练的不是某个一次性的代码片段,而是一套后面能持续复用的数据入口动作。

28. 系列衔接

本讲是《AkShare数据获取入门短课》的第 5/8 讲,当前主题是《转成DataFrame并预览》。

上一讲:第 4 讲《抓取一份财经日历》。

下一讲:第 6 讲《保存行情到CSV》。

后续安排:第 7 讲《排查空数据和字段报错》;第 8 讲《联动pandas算5日均线》。

29. 风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。