基础入门
把原始行情表缩成只保留日期、收盘价和成交量的工作表,练习最基础也最常用的选列与筛行动作,为后续收益率、均线和统计分析建立一张边界清晰的练习表。
第 2 讲只做一件非常实用的事:把第 1 讲读进来的整张行情表,压成一张只保留日期、收盘价和成交量的工作表。这一步看起来简单,但它决定了你后面做收益率、均线、缺失值处理时,是在一张清楚的练习表上继续推进,还是抱着一张原始大表一路硬算。
学完这一讲后,你可以直接完成下面几件事:
这就是 pandas 入门里最常见、也最值得尽早养成的动作之一:先缩表,再继续。
第 1 讲解决的是“我能把 CSV 稳定读进来吗”。到了第 2 讲,真正的问题变成:读进来以后,这张表是不是已经适合当前任务。现实里,原始表经常有很多列,但你当下并不需要全部字段。若你一直把所有字段都带着走,后面会遇到两个明显问题:
所以第 2 讲不是在教一个小技巧,而是在帮你建立一种工作顺序:先保留核心字段,再做后续处理。
本讲默认你已经完成第 1 讲,手上有一张名为 df 的行情表:
import pandas as pd
df = pd.read_csv('stock_daily_sample.csv')
print(df.head())
当前这张表通常至少有这些列:
datecodeopenhighlowclosevolume第 2 讲不会把它全部丢掉,但会主动只保留当前最有用的三列。
这四步分别对应定范围、取数据、去掉明显不可用的行,以及回头确认结果。顺着这个顺序做,后面继续加工会轻松很多。
本讲只保留:
date,因为后面所有时序处理都离不开日期。close,因为收益率和均线通常都先从收盘价开始。volume,因为它是最常见的成交活跃度字段。对应代码可以直接写成:
keep_cols = ['date', 'close', 'volume']
work_df = df[keep_cols].copy()
print(work_df.head())
这里建议一定加 copy()。目的很简单,就是把原始 df 和后面要反复修改的工作表分开,避免调试时互相干扰。
第 2 讲不做复杂筛选,只做一条最常见也最合理的规则:把 close 或 volume 为空的行先去掉。
work_df = work_df.dropna(subset=['close', 'volume'])
print(work_df.shape)
这样做的意义很直接。因为后面的收益率、均线和简单统计,都会依赖这两列。如果这一步就已经空着,后面的问题只会越来越大。
print(work_df.columns.tolist())
print(work_df.head())
print(work_df.shape)
第 2 讲的目标不是“代码运行一下就算过”,而是你要明确确认:这张工作表已经只有你当前要用的列,并且仍然是一张结构正常的 DataFrame。
验证不需要很复杂,只要把列、空值和行数三件事检查清楚,就足以判断这张表能不能继续往后用。
assert work_df.columns.tolist() == ['date', 'close', 'volume']
assert isinstance(work_df, pd.DataFrame)
assert work_df['close'].notna().all()
assert work_df['volume'].notna().all()
assert len(work_df) > 0
只要这四条都成立,你就已经得到了一张可以继续往第 3 讲传递的精简工作表。
这一步最容易被忽略,不是因为它不重要,而是因为它看起来太基础。真实的数据处理里,越基础的整理动作,越能决定后面代码是不是清楚。
可以,但不稳。原表列多时,你会越来越难判断当前任务到底依赖哪几列。第 2 讲的核心就是把任务边界压清楚。
这些列当然有用,只是这套入门短课后面几讲主要围绕收盘价、收益率、均线和聚合统计展开,所以先保留 date、close、volume 最合适。
不一定。只要你明确知道为什么被删,且结果表仍然保留了有效样本,这通常是正常清理动作。
因为后面你会不断在 work_df 上新增列。如果不复制,原表和工作表之间的边界会变得模糊,调试时更容易混乱。
code,但如果这样做,得清楚它当前不是第 2 讲的核心列。date 转成 datetime,第 2 讲主要先完成列和行的收窄。dropna 后行数不变,完全正常。import pandas as pd
def keep_core_market_cols(df: pd.DataFrame) -> pd.DataFrame:
out = df[['date', 'close', 'volume']].copy()
out = out.dropna(subset=['close', 'volume'])
return out
work_df = keep_core_market_cols(df)
print(work_df.head())
这类函数非常适合作为你后面所有 pandas 入门练习的起点,因为它把“先缩表”这个动作固定住了。
原始表不一定等于工作表。原始表更像输入材料,工作表则是你为了当前任务主动整理出来的一张中间表。第 2 讲最重要的收获,就是让你开始区分这两者。只要这个意识建立起来,后面新增收益率列、处理缺失值、排序和导出时,你都会更清楚自己是在操作哪一层数据。
如果你现在已经能把原始行情表稳定缩成一张只保留 date、close、volume 的工作表,并知道为什么后面要继续基于它往下做,那第 2 讲就算完成。
本讲是《pandas金融数据入门短课》的第 2/8 讲,当前主题是《选列筛行:保留日期收盘价和成交量》。
上一讲:第 1 讲《读取CSV:先看前5行行情》。
下一讲:第 3 讲《新增收益率列》。
后续安排:第 4 讲《处理缺失值》;第 5 讲《排序并重置索引》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。