基础入门
本讲把 AkShare 原始返回结果推进成真正可继续使用的工作表,围绕列结构检查、核心列抽取、日期与数值转型、头尾预览和通用预览函数展开。目标是让入门者把“拿到一张表”升级成“会判断这张表是否已经能继续用于保存、排错和均线计算”。
本讲要做的事情很明确:把前几讲已经拿到的原始返回结果,稳定地放进 pandas DataFrame,并用最小预览动作确认这张表已经进入“可继续清洗、可继续计算”的状态。虽然前面几讲里你已经不断看到 DataFrame,但那更多是“接口返回了一个表”。第 5 讲的重点,是把这种“看到表”升级成“会主动检查表的结构、列名、类型和可读性”。
学完这一讲后,先把下面三件事做扎实:
这一步看起来很基础,但它其实决定了后面第 6 讲保存 CSV、第 8 讲联动 pandas 算均线时,你是在处理一张整洁表,还是在一堆还没看清的原始字段上硬算。
很多新手会说:前面拿到的本来就是 DataFrame,为什么还要单独讲这一课?问题就在这里。接口“返回一个 DataFrame”和你“真正会用一张 DataFrame”不是一回事。真正的差别体现在三个动作上:
shape、columns、dtypes。如果这三个动作没建立起来,后面你每次拿到新接口时都还会重新慌一次。所以第 5 讲本质上是在训练一种通用的表格处理顺序,而不是只服务当前这一套 AkShare 短课。
这一讲不需要重新安装环境,也不要求新增依赖。你可以直接复用前面几讲已经拿到的任意一张表,例如:
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=""
)
如果你更想用指数表练习,也完全可以。关键不在于必须用哪张表,而在于你要对一张“已经从接口拿回来的原始表”做结构化预览。
下面四步分别对应看轮廓、收窄字段、处理类型和检查头尾。按这个顺序做,后面保存和计算都会稳很多。
不要一上来就盯着前几行内容,先看这张表的大轮廓:
print(daily_df.shape)
print(daily_df.columns.tolist())
print(daily_df.dtypes)
这三行解决的是三类完全不同的问题:
shape 告诉你表大不大、行列数是否合理;columns 告诉你字段有没有按预期返回;dtypes 告诉你后面哪些列还需要转型。如果你把这一步省掉,后面一旦均线算错、保存 CSV 混乱或日期排序异常,你会很难快速定位原因。
AkShare 原始表经常列不少,但入门阶段最常用的其实就几类:日期、开盘、收盘、成交量。你可以先把它们抽出来:
keep_cols = ["日期", "开盘", "收盘", "成交量"]
preview_df = daily_df[[col for col in keep_cols if col in daily_df.columns]].copy()
print(preview_df.head())
这里的关键不是死抠列名,而是形成一个动作:原始表先收窄,再进入下一步。因为真正的工作表应该服务于当前任务,而不是把所有原始字段一股脑带着走。
如果你想让预览表真正可继续用,最好不要只停在打印上,而是顺手做一次基础类型处理:
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")
这样做的意义很直接:你把“看起来像能用”的表,推进成了“类型上真的能继续用”的表。后面保存、计算、排序时,问题会少很多。
最后不要只看 head(),建议同时看头部和尾部:
print(preview_df.head(5))
print(preview_df.tail(5))
头部帮助你检查起始日期和字段排列,尾部帮助你确认末端日期和整体排序逻辑。一个很常见的初学者误区,是只看前 5 行就以为整张表都没问题。实际上,很多排序、重复、异常值问题只在尾部或中间位置才容易暴露。
第 5 讲的验证标准不复杂,但一定要做完整。
assert isinstance(preview_df, pd.DataFrame)
assert preview_df.shape[1] >= 3
assert preview_df["日期"].notna().all()
assert preview_df["收盘"].notna().sum() > 0
print(preview_df.head())
这条看似主观,但其实很重要。因为第 5 讲的本质就是让你把一张原始返回表整理成“人眼先能快速理解”的工作表。
这些问题大多不是代码太难,而是原始表和工作表的边界还没分清。先把边界理顺,后面很多小问题会自己消失。
因为你后面很可能要做转型、筛列、重命名或排序。如果一直在原始对象上直接改,容易把调试过程和原始返回结果混在一起。copy() 的成本很低,但会让你的操作边界清楚很多。
先打印 columns.tolist(),然后用你本地真实存在的字段名替换。第 5 讲真正训练的是“先识别结构,再抽核心列”,而不是死记固定字面值。
不一定。它可能只是表示某些位置原本就缺值,或者某个字段里混进了非数值字符。入门阶段你先把这些空值看见、标出来,就已经比完全不做转型前进了一步。
这通常说明你还需要明确排序规则。不是所有接口都保证你想象中的顺序,所以第 5 讲要你同时看头部和尾部,就是为了尽早发现这个问题。
第 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,也能服务你用别的接口拿到的表。只要原理一致,它就是一段能反复复用的基础工具。
建议你花 5 到 10 分钟完成下面这个最小作业:
做到这一步,第 5 讲的价值才真正落地。因为你不只是“会看一张表”,而是已经得到一张准备继续往下传递的中间产物。
如果你现在能说出这句话,第 5 讲就算真的完成了:
“我已经能把 AkShare 的原始返回结果压成一张字段清楚、类型基本可用、头尾都能正常检查的工作表。”
这句话其实就把第 5 讲最核心的工作说完了。后面无论是保存 CSV、排查字段问题,还是联动 pandas 算均线,都会从这样一张工作表继续往下走。
很多人第一次接触 DataFrame 时,会把预览理解成“打印一下 head() 看看有没有报错”。但真正有用的预览,不只是确认程序没崩,而是建立你对这张表的第一层数据感。所谓数据感,在第 5 讲里主要体现在四个判断上:
你会发现,一旦这四个判断建立起来,后面每次拿到新表时,你都不会再从完全陌生开始。哪怕是别的接口、别的标的、别的频率,第一反应也还是先看结构、再看核心列、最后看类型。这就是第 5 讲真正想帮你建立的通用习惯。
如果你总担心自己预览时漏掉东西,可以直接把顺序固定下来:
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))
这套顺序的好处,是它把“全局轮廓”和“局部样本”分开看了。先看 shape 和 columns,你知道这是不是一张大体合理的表;再看 head 和 tail,你知道具体内容是不是也大体对路。只要坚持几次,这会变成一种近乎自动的检查流程。
入门阶段还有一个很有用的小动作:不要只打印,顺手写一句结论。例如:
print('结论:这张表已经包含日期、开盘、收盘、成交量四列,可以继续用于 CSV 保存和均线计算。')
这句话看起来像多余,但它有两个实际价值:
当你把打印结果和一句结论绑在一起时,后面的练习会更像在完成真实工作,而不是单纯在堆代码。
完全可以。第 5 讲的方法并不是只绑定个股日线。比如你前面抓过财经日历,也能照样套同样的预览思路:
你会发现,只要是“接口返回一张表”,第 5 讲的方法几乎都能直接套过去。这也是为什么它值得单独成一讲。它训练的不是某个一次性的代码片段,而是一套后面能持续复用的数据入口动作。
本讲是《AkShare数据获取入门短课》的第 5/8 讲,当前主题是《转成DataFrame并预览》。
上一讲:第 4 讲《抓取一份财经日历》。
下一讲:第 6 讲《保存行情到CSV》。
后续安排:第 7 讲《排查空数据和字段报错》;第 8 讲《联动pandas算5日均线》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。