70城房价数据集
本仓库是一个围绕单一 CSV 的数据集包。本文件只负责建立数据心智模型和选择流程;每条流程自己拥有完整步骤。
加载顺序
- 读本文件。
- 从下表选中恰好一条流程,读它的流程文档。
- 只在流程文档显式要求时才读对应的
references/。
| 意图 | 流程authority |
|---|---|
| 抓取并追加新月份数据 | workflows/monthly-update.md |
| 按城市/月份/组合条件取子集 | workflows/extract.md |
| 重绘 README 走势图 | workflows/chart.md |
| 构建/调试 GitHub Pages 数据 | workflows/site-build.md |
纯数据问答("深圳最近同比怎么走")不需要选流程,直接用 workflows/extract.md 里的只读命令查,但必须先读 references/fixedbase-caliber.md 再解释任何定基比数值。
数据心智模型
只有一个事实源:仓库根的 70cityprice.csv,2006 年至今的月度数据,约 4.7 万行。不引入数据库,所有工具都是围绕这份 CSV 的读写。
四条必须先内化的约束:
一个「日期 × 城市」= 3 行,
FixedBase∈ {同比,环比,定基比}。Below90 / 144 / Above144这类带后缀的列是同一行内的分户型细分,不要再展开成额外行。写回格式不可改:
utf-8-sig编码 +csv.QUOTE_ALL全字段加引号(update_csv()里的to_csv(..., quoting=1, encoding='utf-8-sig'))。改动它会造成大规模无意义 diff 或 BOM 错乱。排序键固定为(CITY, DATE, FixedBase),日期格式固定YYYY/M/D(无前导零,恒为该月 1 日)。城市名必须走标准化链路:任何外部输入(抓来的城市名、
--cities参数)都要经normalize_city_name→get_standard_city_name才能落库或比对。禁止直接字符串比较。细节见references/city-naming.md。定基比不是一条连续序列。基期在 2010 / 2015 / 2020 之间轮换过,2023 年起停止公布。任何跨期拼接都是错的。在给出涉及该字段的结论前,必读
references/fixedbase-caliber.md。
全局执行纪律
- 命令一律用
python3/pip3,不要在文档、docstring 或 print 里写裸python。本机已在.venv/装好依赖,直接用系统解释器时命令写成.venv/bin/python3 scripts/...。 - 改完数据必跑校验。
scripts/validate_70cityprice.py是本仓库事实上的回归测试(没有测试套件、lint 和 CI 检查)。 projects/是输出沙箱,已被.gitignore忽略,脚本默认输出到这里。不要把生成的子集提交进仓库。scripts/是扁平脚本目录,不是 Python 包。各脚本直接from common import ...,依赖同目录运行。新加工具脚本时维持这种扁平结构,共用逻辑放进common.py。- 不要为本仓库引入通用工程脚手架(
tests/、分支流程、打包配置)。它是数据集包,不是应用。
参考资料索引
按需加载,不要预读:
| 文档 | 何时读 |
|---|---|
references/schema.md |
需要理解列含义、主键、排序、写回约定时 |
references/city-naming.md |
涉及城市名匹配、去重、新增城市时 |
references/fixedbase-caliber.md |
任何涉及定基比字段的分析或回答(强制) |
references/stats-table-parsing.md |
改动 update_70cityprice.py 的解析逻辑,或抓取失败排查时 |
面向人类读者的完整叙述(数据来源、官方附注、城市清单、引用格式)在 README.md,不要把它的内容复制到本包里。