数据查询
在平台的全部数据集里找数据、看口径、取数据、按键连接、汇总和统计。能处理区县和城市的级别不同、旧代码、北交所新旧代码、按行政区划取地图位置。
- 官方技能,由智元数据编写和维护
- 只调用智元数据的 REST 接口
- 1 个取数脚本,只用 Python 3 自带的库
- API Key 从环境变量 WI_API_KEY 读取
- 依赖的数据集
- 5
- 一次对话
- —
- 安装次数
- 8
- 近 7 天调用
- 154
01怎么用
三步,让你的 Agent 用上这些数据
安装和设置只做一次。以后直接向你的 Agent 提问就行。
01
发安装语句
复制页头的安装语句,发给 你的 Agent。它会下载技能,装进自己的技能目录。可以在页头切换你用的 Agent。
02
设置 API Key
在终端里运行下面的命令,再启动 你的 Agent。
export WI_API_KEY=你的 API Key
创建 API Key03
直接提问
02依赖的数据集
这些数据集都要有授权
技能用到的数据集都要有授权才能查询。缺授权时,Agent 会告诉你缺哪一个。
区域底数全国行政区划代码
admin-division
一行是一个行政区划(省、地级市或县区)。包含 6 位区划代码、名称、上级代码、级别和从省到县的完整名称。覆盖全国的省、市、县三级,是医保系统使用的区划。用来把别的数据集里的区划代码换成名称,或者按省市汇总。这是医保系统用的区划,和民政部的不同:多 1146 个代码(开发区、市本级等医保统筹区 1074 个,已撤销的 72 个),少民政部 2025 年的 61 个。查民政部的代码用 region-code-by-year。
4,299 行 · 5 个字段登录后查看授权
区域底数县级行政区划边界
county-boundary
一行是一个县级行政区的边界,包含区划代码、名称、所在城市和省、面积、中心点和外框。共 2850 行,覆盖全国的县级行政区。香港、澳门、台湾各是一行,没有分到县。边界取自公开的 2023 年初县级行政区划矢量图层,不是官方发布的边界,没有审图号,不能用来确定权属和界线。用来在地图上画出一个县的范围,按县汇总点和线,或者把县级统计数据画成分级的地图。
2,850 行 · 16 个字段登录后查看授权
区域底数行政区划新旧代码对照
region-code-crosswalk
一行是一个历史区划代码(一段使用时间)对应的一个现行代码,包含对应方式、主要去向、把握和变更路径。覆盖 1981 年以来用过的全部 6826 段代码,共 7388 行。一对多的没有面积或人口的权重。用来把按旧区县代码记录的数据连到今天的区县,再按现行区划汇总。
7,388 行 · 14 个字段登录后查看授权
企业主体沪深京上市证券
listed-security-master
一行是沪深京交易所的一个证券代码。每行有带交易所后缀的代码、简称、全称、板块、上市和退市日期、状态、地域、行业、实际控制人类型、注册资本、统一社会信用代码和换过的旧代码。共 6057 个代码:上交所 2529、深交所 3167、北交所 361,其中上市 5665、退市 372、代码已变更 5、分配了代码未上市 15,B 股 115 个。用来把别的数据集里的 6 位股票代码规范成 600519.SH 这样的写法,并认出已退市和换了代码的公司。
6,057 行 · 31 个字段登录后查看授权
企业主体北交所新旧证券代码对照
bse-code-crosswalk
一行是北交所的一只股票从旧代码到 920 开头的新代码的对应,包含新旧代码、简称、北交所上市日期。共 248 只股票,旧代码是 43、83、87 开头的 6 位代码。用来把 2024 年以前的数据里北交所股票的旧代码换成现在的代码。
248 行 · 7 个字段登录后查看授权
03技能内容
装进 Agent 的,全在这里
SKILL.md 可以看预览,也可以看原文。参考文件由平台按当前数据生成,需要时才读。
- 常驻约 332 token
- name 和 description,Agent 一直带着
- 触发后约 2,250 token
- 用到这个技能时读入 SKILL.md 正文
- 按需约 13,788 token
- 需要时才读参考文件、运行脚本
SKILL.md
96 行 · 约 2,582 token · 触发后读入--- name: data-query description: 在智元数据 World Insight 平台的全部数据集里找数据、取数据、连接数据、算数,回答用数据说话的问题。能做:按关键词找数据集,看字段、口径和覆盖年份,按条件取行,按区县、城市、省、股票代码、统一社会信用代码这些键把两个数据集连起来,区县汇总到城市或省,旧的区划代码和北交所旧代码换成现行代码,按行政区划取地图上的形状和中心点(经纬度、面积),要好几步的统计(排名、合计、比值、占比)。用户问"哪些数据集有县级降水""某市 2019 年的户籍人口是多少""把企业和处罚连起来""区县汇总到城市""上市公司的专利""北交所 920 开头的公司""在地图上标出每个县""各省排名",或者问题要用平台的数据但不属于别的专门技能时使用。精算计算用 actuarial-pc、actuarial-life、actuarial-risk、actuarial-ds-pricing。通过 REST 接口取数,需要环境变量 WI_API_KEY。 ---
数据查询
用平台的数据回答问题。平台有 600 多个数据集。你的工作是:找对数据集,看清口径,取对行,连对键,用代码算数,再说清楚数据从哪里来、怎么算的。
开始前
- 所有命令都在本技能的目录里运行:
python3 scripts/wi.py ...。一次一条命令。 - 脚本从环境变量
WI_API_KEY读取 API Key。没有设置时,请用户先设置,不要猜。 datasets、describe、links、plan不扣点。query、join扣点,脚本会打印扣了多少。- 查询的写法(过滤、连接、按地区取、地图)见
references/query.md。常用的参照数据集见references/datasets.md。做过的例子见references/examples.md。
步骤
- 列计划。 把问题拆成几步,写下每一步要什么数据、哪一年、哪一级(区县、城市、省)、什么口径。一次回答最多 24 步,一步一次工具调用。计划先写出来,后面按计划做,不要反复试。
- 找数据集。 用
python3 scripts/wi.py datasets --q <关键词>找。关键词用短词,例如"台风""户籍人口""绿色专利""财产险"。找到几个候选时,看名称和说明里的覆盖年份、级别,选能回答问题的那个。 - 看字段和口径。 用
python3 scripts/wi.py describe <数据集>看字段。特别看这几类字段: - 口径字段:表里常常同时有合计行和明细行。例如"全省合计"和各城市,"集团公司合计"和母公司、子公司,"合计"和分险种。只取一种口径,否则会重复计算。不确定有哪些取值时,先取几行看一看(
--limit 20)。 - 单位:万元、百万元、亿元,万人、人,百分数。回答里的单位和数据的单位要对上。
- 年份和级别:数据覆盖到哪一年,是区县、城市还是省。
- 取数据。 用
query加过滤条件,只取要的字段,加--save data/<文件名>.json。一个条件写一个--where,不能用 and 连起来,例如--where "year >= 2010" --where "year <= 2019"。数据多时加--limit 1000,还有下一页时按脚本提示加--cursor。 - 连接。 要用两个数据集时,先
plan <左> <右>,再join。规则见references/query.md的"联合查询"。三条要点: - 右边一组键对上多行时,用
--right-agg先汇总。 - 两边的级别不同时,按粗的一级连,回答里说明。
- 原来的数据有旧代码时,把参照数据集放在左边连接,不要按新代码直接筛选。
- 算。 排序、分组、合计、比值都用 run_python 读保存的文件计算。一次回答最多运行 6 次 run_python,用完就不能再算了。所以:
- 每次都用下面的写法读文件。它把每行变成字典,空值也能处理,不用先另外运行一次看结构。
- 一次 run_python 里把要算的全算完:先打印口径字段的取值和行数,再算结果。不要一次只看一点。
- 取完全部数据再算。几个文件可以在同一次里读。
``python import json from collections import defaultdict def load(path): d = json.load(open(path)) k = [c["key"] for c in d["columns"]] return [dict(zip(k, r)) for r in d["rows"]] def num(v): return float(v) if v not in (None, "") else 0.0 rows = load("data/x.json") print(len(rows), rows[0]) g = defaultdict(float) for r in rows: g[r["province"] or "(空)"] += num(r["amount"]) # 换成真实的字段名 for name, v in sorted(g.items(), key=lambda x: -x[1]): print(name, round(v, 2)) ``
- 核对。 回答前逐项看:
- 行数对吗?例如浙江省应该有 11 个地级市。少了要找原因(名称不同、代码变了、口径不同)。
- 有没有重复计算(合计行和明细行一起加了)?
- 单位换算对吗?
- 回答。 见"怎么回答"。
常见的情况
| 情况 | 怎么做 |
|---|---|
| 区县的数据要汇总到城市或省 | 区县代码的前 4 位是城市,前 2 位是省。直辖市的区县直接归到省。用 run_python 按前 4 位分组相加。区县名称有重名,按代码分组,不按名称 |
| 一边是区县,一边是城市 | join ... --on region:city,平台按城市连接。或者分别取,在 run_python 里按城市代码对上 |
| 只有名称没有代码 | 县级用 county-boundary 查代码(county、city、province 都能过滤)。admin-division 是医保系统的区划,多了开发区、市本级等统筹区,数的时候要排除它们。重名时带上省、市再查 |
| 旧的区划代码 | 连接时平台自动换成现行代码。自己对代码时用 region-code-crosswalk |
| 北交所的公司 | 现在的代码是 920 开头。很多数据集里还是 43、83、87 开头的旧代码。用 listed-security-master(exchange = BSE)放在左边连接,或者用 bse-code-crosswalk 对照 |
| 地图上标出一个地区的县、河流、站点 | 空间数据集加 --region <地区> --geometry point,返回中心点经纬度 _lng、_lat。县的名称、面积(area_km2)、中心点、外框在 county-boundary,例如 query county-boundary --region 宁波市 --fields region_code,county,area_km2,center_lng,center_lat |
| 计划单列市(大连、青岛、宁波、厦门、深圳) | 很多金融、保险的统计把它们单列,不算在所在省里。用户要"全省"时,看口径字段,把计划单列市加回去,并在回答里写明 |
| 一个数据集没有要的年份 | 找别的数据集,或者用最近的一年,并在回答里写明用了哪一年 |
怎么回答
- 结论:先回答用户的问题,数字带单位。排名用表格。
- 数据:用了哪些数据集(名称和标识)、哪一年、什么口径(例如"全省合计,含计划单列市")。
- 怎么算的:取了哪些行,怎么连接、汇总,一两句话。连接时把 join 输出的"连接方式"里的说明写进来。
- 限制:对不上的行、缺的年份、近似的地方。
- 最后写明这次一共扣了多少点。
不要做
- 不要心算。排序、合计、比值都来自代码的输出。
- 不要编造数据。查不到、没有授权、数据集没有这一年时,直接说明。
- 不要把合计行和明细行加在一起。
- 不要按名称连接区县。名称有重名,按代码连接。
- 不要把演示数据(数据集说明里写着"演示数据")当成真实数据。
出错时
| 错误码 | 怎么办 |
|---|---|
NO_GRANT | 告诉用户缺哪个数据集的授权,给出脚本提示里的申请地址 |
BAD_REQUEST | 按错误信息改字段标识或过滤值,再试一次 |
BAD_REGION | 地区重名或认不出。按信息里的候选改写代码,或者带上省、市 |
NO_SHARED_KEY | 两个数据集没有共同的键。换一个键,或者分别取再在 run_python 里对上 |
NOT_UNIQUE | 右边按键不唯一。改用 --right-agg |
TIMEOUT | 查询太大。加过滤条件,减少行数 |