理赔案件地区分析
按就诊机构所在的省、城市、区县统计理赔案件的件数、费用和案件状态,区县可以汇总到城市。
- 官方技能,由智元数据编写和维护
- 只调用智元数据的 REST 接口
- 1 个取数脚本,只用 Python 3 自带的库
- API Key 从环境变量 WI_API_KEY 读取
- 依赖的数据集
- 4
- 一次对话
- 约 6.7 点
- 安装次数
- 4
- 近 7 天调用
- 29
01怎么用
三步,让你的 Agent 用上这些数据
安装和设置只做一次。以后直接向你的 Agent 提问就行。
01
发安装语句
复制页头的安装语句,发给 你的 Agent。它会下载技能,装进自己的技能目录。可以在页头切换你用的 Agent。
02
设置 API Key
在终端里运行下面的命令,再启动 你的 Agent。
export WI_API_KEY=你的 API Key
创建 API Key03
直接提问
02对话示例
每一步做了什么、花了多少点
这次对话调用了 3 次接口,读了 1 个技能文件,运行了 1 次分析代码。调用和点数是真实运行的结果,回答由我们整理。
浙江省各地级市的理赔案件各有多少件?医疗总费用合计多少?哪个城市最多?
- 读取
SKILL.md· 问题和这个技能有关,智能体读入技能正文 第 1 次调用:运行命令取数据3.5 点
python3 scripts/wi.py join health-claim medical-institution --right-where "region_code = 330000" --left-fields claim_no,accident_date,total_amount,claimed_amount,status,disease_category,hospital_days --right-fields hospital_name,level,district_code --limit 1000 --save data/claims-1.json
POST /api/v1/join
查看输出
已保存到 data/claims-1.json:1000 行,字段 claim_no, accident_date, total_amount, claimed_amount, status, disease_category, hospital_days, hospital_name, level, district_code。 文件是 JSON:columns 是字段,rows 是行,每行是一个列表,顺序和 columns 相同。 扣 3.5 点(预占 3.5,释放 0.0),可用点数 9794.5。 还有下一页:--cursor 30138:3526
第 2 次调用:运行命令取数据0.6 点
python3 scripts/wi.py query admin-region --fields region_code,region_name,level --limit 1000 --save data/regions.json
POST /api/v1/datasets/admin-region/query
查看输出
已保存到 data/regions.json:368 行,字段 region_code, region_name, level。 文件是 JSON:columns 是字段,rows 是行,每行是一个列表,顺序和 columns 相同。 扣 0.6 点(预占 1.2,释放 0.6),可用点数 9793.9。
第 3 次调用:运行命令取数据2.6 点
python3 scripts/wi.py join health-claim medical-institution --right-where "region_code = 330000" --left-fields claim_no,accident_date,total_amount,claimed_amount,status,disease_category,hospital_days --right-fields hospital_name,level,district_code --limit 1000 --cursor 30138:3526 --save data/claims-2.json
POST /api/v1/join
查看输出
已保存到 data/claims-2.json:641 行,字段 claim_no, accident_date, total_amount, claimed_amount, status, disease_category, hospital_days, hospital_name, level, district_code。 文件是 JSON:columns 是字段,rows 是行,每行是一个列表,顺序和 columns 相同。 扣 2.6 点(预占 3.5,释放 0.9),可用点数 9791.3。
运行分析:按区县代码前4位汇总浙江省各地级市的理赔案件件数、医疗总费用合计与平均、申请赔付合计、状态分布0 点
运行分析 · Python 33 行
查看代码和输出
import json, globfrom collections import defaultdictdef 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"]]rows = [r for p in sorted(glob.glob("data/claims-*.json")) for r in load(p)]names = {r["region_code"]: r["region_name"] for r in load("data/regions.json")}print("总案件数", len(rows))g = defaultdict(lambda: {"n":0,"total":0.0,"claimed":0.0,"status":defaultdict(int),"dist":set()})for r in rows: dc = r["district_code"] if not dc: print("空区县", r["claim_no"]); continue city = dc[:4]+"00" x = g[city]; x["n"]+=1 x["total"]+=float(r["total_amount"] or 0) x["claimed"]+=float(r["claimed_amount"] or 0) x["status"][r["status"]]+=1 x["dist"].add(dc)tot_n=0; tot_amt=0.0for code,x in sorted(g.items(), key=lambda kv:-kv[1]["total"]): tot_n+=x["n"]; tot_amt+=x["total"] st=x["status"] print(code, names.get(code,"(无此代码)"), "| 件数", x["n"], "| 总费用", round(x["total"],2), "| 平均", round(x["total"]/x["n"],2), "| 申请赔付", round(x["claimed"],2), "| 区县数", len(x["dist"]), "| 已结案",st.get("已结案",0),"审核中",st.get("审核中",0),"已拒付",st.get("已拒付",0),"已撤案",st.get("已撤案",0))print("合计件数", tot_n, "合计总费用", round(tot_amt,2), "全省平均", round(tot_amt/tot_n,2))print("状态合计", {k:sum(x["status"].get(k,0) for x in g.values()) for k in ["已结案","审核中","已拒付","已撤案"]})print("按件数排名前三:", [(names.get(c,c), x["n"]) for c,x in sorted(g.items(), key=lambda kv:-kv[1]["n"])[:3]])print("按总费用排名前三:", [(names.get(c,c), round(x["total"],2)) for c,x in sorted(g.items(), key=lambda kv:-kv[1]["total"])[:3]])
总案件数 1641 330900 舟山市 | 件数 210 | 总费用 1496929.11 | 平均 7128.23 | 申请赔付 1193653.87 | 区县数 15 | 已结案 169 审核中 28 已拒付 8 已撤案 5 330500 湖州市 | 件数 167 | 总费用 1121743.61 | 平均 6717.03 | 申请赔付 891487.15 | 区县数 16 | 已结案 137 审核中 15 已拒付 11 已撤案 4 330700 金华市 | 件数 155 | 总费用 1089917.84 | 平均 7031.73 | 申请赔付 878790.99 | 区县数 11 | 已结案 119 审核中 18 已拒付 13 已撤案 5 330300 温州市 | 件数 175 | 总费用 1072045.11 | 平均 6125.97 | 申请赔付 883531.74 | 区县数 14 | 已结案 142 审核中 16 已拒付 5 已撤案 12 330600 绍兴市 | 件数 154 | 总费用 960733.32 | 平均 6238.53 | 申请赔付 745098.39 | 区县数 10 | 已结案 122 审核中 13 已拒付 9 已撤案 10 331000 台州市 | 件数 168 | 总费用 898593.62 | 平均 5348.77 | 申请赔付 707305.53 | 区县数 12 | 已结案 137 审核中 19 已拒付 6 已撤案 6 330800 衢州市 | 件数 159 | 总费用 844193.73 | 平均 5309.39 | 申请赔付 663706.63 | 区县数 13 | 已结案 123 审核中 15 已拒付 13 已撤案 8 330200 宁波市 | 件数 115 | 总费用 835224.26 | 平均 7262.82 | 申请赔付 668915.22 | 区县数 10 | 已结案 94 审核中 9 已拒付 7 已撤案 5 330400 嘉兴市 | 件数 111 | 总费用 743567.96 | 平均 6698.81 | 申请赔付 593242.09 | 区县数 11 | 已结案 89 审核中 12 已拒付 7 已撤案 3 330100 杭州市 | 件数 115 | 总费用 711341.17 | 平均 6185.58 | 申请赔付 557654.18 | 区县数 9 | 已结案 93 审核中 11 已拒付 5 已撤案 6 331100 丽水市 | 件数 112 | 总费用 626448.26 | 平均 5593.29 | 申请赔付 508105.0 | 区县数 8 | 已结案 93 审核中 8 已拒付 8 已撤案 3 合计件数 1641 合计总费用 10400737.99 全省平均 6338.05 状态合计 {'已结案': 1318, '审核中': 164, '已拒付': 92, '已撤案': 67} 按件数排名前三: [('舟山市', 210), ('温州市', 175), ('台州市', 168)] 按总费用排名前三: [('舟山市', 1496929.11), ('湖州市', 1121743.61), ('金华市', 1089917.84)]
结论
浙江省(按就诊机构所在地)共 1,641 件理赔案件,医疗总费用合计 10,400,737.99 元(约 1,040 万元),平均每件 6,338.05 元。
舟山市在件数和医疗总费用两项上都是第一:210 件、总费用 1,496,929.11 元。
各地级市明细(按医疗总费用从高到低)
| 排名 | 地级市 | 案件数 | 医疗总费用合计(元) | 平均(元/件) | 申请赔付合计(元) | 已结案 | 审核中 | 已拒付 | 已撤案 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 舟山市 | 210 | 1,496,929.11 | 7,128.23 | 1,193,653.87 | 169 | 28 | 8 | 5 |
| 2 | 湖州市 | 167 | 1,121,743.61 | 6,717.03 | 891,487.15 | 137 | 15 | 11 | 4 |
| 3 | 金华市 | 155 | 1,089,917.84 | 7,031.73 | 878,790.99 | 119 | 18 | 13 | 5 |
| 4 | 温州市 | 175 | 1,072,045.11 | 6,125.97 | 883,531.74 | 142 | 16 | 5 | 12 |
| 5 | 绍兴市 | 154 | 960,733.32 | 6,238.53 | 745,098.39 | 122 | 13 | 9 | 10 |
| 6 | 台州市 | 168 | 898,593.62 | 5,348.77 | 707,305.53 | 137 | 19 | 6 | 6 |
| 7 | 衢州市 | 159 | 844,193.73 | 5,309.39 | 663,706.63 | 123 | 15 | 13 | 8 |
| 8 | 宁波市 | 115 | 835,224.26 | 7,262.82 | 668,915.22 | 94 | 9 | 7 | 5 |
| 9 | 嘉兴市 | 111 | 743,567.96 | 6,698.81 | 593,242.09 | 89 | 12 | 7 | 3 |
| 10 | 杭州市 | 115 | 711,341.17 | 6,185.58 | 557,654.18 | 93 | 11 | 5 | 6 |
| 11 | 丽水市 | 112 | 626,448.26 | 5,593.29 | 508,105.00 | 93 | 8 | 8 | 3 |
| — | 全省合计 | 1,641 | 10,400,737.99 | 6,338.05 | 8,291,491.19 | 1,318 | 164 | 92 | 67 |
几点补充:
- 件数排名前三:舟山 210、温州 175、台州 168;杭州、宁波各 115 件,反而靠后。
- 平均单件费用最高的是宁波 7,262.82 元、舟山 7,128.23 元;最低是衢州 5,309.39 元、台州 5,348.77 元。
- 全省状态分布:已结案 1,318 件(80.3%)、审核中 164 件(10.0%)、已拒付 92 件(5.6%)、已撤案 67 件(4.1%)。
口径与算法
- 地区按就诊机构所在地计算:理赔案件本身没有地区字段,通过
hospital_code连接医疗机构(medical-institution),取机构region_code = 330000(浙江省)的机构,再按机构district_code前 4 位 +00汇总到地级市,城市名称用 admin-region 按代码对上。 - 数据来自 health-claim + medical-institution 两张表,共取 2 页(1,000 + 641 = 1,641 件),合计与分组均由代码计算得出。
- 本次用到的是演示数据,不代表真实理赔情况。
限制
- 约 3% 的理赔案件其就诊机构编码在医疗机构表中匹配不到,这些案件无法归入任何地区,未包含在上述 1,641 件内,因此不是全省的完整口径。
- 部分城市的区县代码数量看起来多于实际行政区数(演示数据中存在非标准/历史区县代码),已按代码前 4 位归入对应地级市,不影响市级合计。
本次共扣 6.7 点(join 3.5 + 2.6,admin-region 查询 0.6),剩余 9,791.3 点。
界面为示意,窗口标题跟着页头选的 Agent 变。
03依赖的数据集
这些数据集都要有授权
技能用到的数据集都要有授权才能查询。缺授权时,Agent 会告诉你缺哪一个。
保险市场
医疗药械
区域底数
区域底数县级行政区划边界
county-boundary
一行是一个县级行政区的边界,包含区划代码、名称、所在城市和省、面积、中心点和外框。共 2850 行,覆盖全国的县级行政区。香港、澳门、台湾各是一行,没有分到县。边界取自公开的 2023 年初县级行政区划矢量图层,不是官方发布的边界,没有审图号,不能用来确定权属和界线。用来在地图上画出一个县的范围,按县汇总点和线,或者把县级统计数据画成分级的地图。
2,850 行 · 16 个字段登录后查看授权
04技能内容
装进 Agent 的,全在这里
SKILL.md 可以看预览,也可以看原文。参考文件由平台按当前数据生成,需要时才读。
- 常驻约 232 token
- name 和 description,Agent 一直带着
- 触发后约 2,284 token
- 用到这个技能时读入 SKILL.md 正文
- 按需约 12,434 token
- 需要时才读参考文件、运行脚本
SKILL.md
116 行 · 约 2,516 token · 触发后读入--- name: case-area description: 按地区分析健康险理赔案件(演示数据 health-claim):某个省、城市或区县有多少件理赔案件,医疗总费用、申请赔付金额合计和平均多少,已结案、审核中、已拒付、已撤案各占多少,疾病大类怎么分布,各城市、各区县之间比较和排名。理赔案件本身没有地区字段,本技能经就诊机构(medical-institution)连到省和区县,区县按代码汇总到城市。用户问"上海的理赔案件怎么样""浙江各市的理赔案件""某个区的拒付率"时使用。只用于理赔案件;别的数据按地区查询、汇总,用 data-query。通过 REST 接口取数,需要环境变量 WI_API_KEY。 ---
理赔案件地区分析
按地区统计理赔案件。理赔案件(health-claim)没有地区字段。一个案件的地区是它的就诊机构所在的地区:
- 理赔案件的
hospital_code连到医疗机构(medical-institution)的hospital_code。这是登记的关联,join自动用它。 - 医疗机构的
region_code是省级代码(例如440000),region_name是省的全称(例如"广东省")。 - 医疗机构的
district_code是区县代码,6 位。前 4 位加00是城市代码,前 2 位加0000是省代码。
理赔案件和医疗机构都是演示数据,不是真实数据。回答里要写明这一点。
开始前
- 所有命令都在本技能的目录里运行:
python3 scripts/wi.py ...。一次一条命令。 - 脚本从环境变量
WI_API_KEY读取 API Key。没有设置时,请用户先设置,不要猜。 describe、links、plan不扣点。query、join扣点,脚本会打印扣了多少。- 下面的命令已经写好了字段。字段的含义见
references/datasets.md。做过的例子见references/examples.md。 - 一次回答最多运行 6 次 run_python。计划好再算,一次把要算的都算完。
第 1 步:确定地区的级别和代码
| 用户说的地区 | 怎么得到代码 | 第 2 步的过滤条件 |
|---|---|---|
| 省、自治区、直辖市(例如"广东""上海") | 直接写省代码,前 2 位加 0000,例如广东 440000、上海 310000。不确定时查 admin-region(level = 省) | --right-where "region_code = 440000" |
| 城市(例如"杭州市") | python3 scripts/wi.py query admin-region --where "region_name = 杭州市" --fields region_code,region_name,level,parent_code | 城市代码是 330100 时:--right-where "district_code >= 330100" --right-where "district_code < 330200" |
| 区县(例如"萧山区") | python3 scripts/wi.py query county-boundary --where "county = 萧山区" --fields region_code,county,city,province。重名时加 --where "city = 杭州市" | --right-where "district_code = 330109" |
| 一个城市的全部区县 | python3 scripts/wi.py query county-boundary --region 杭州市 --fields region_code,county | 同城市 |
- 直辖市(北京、天津、上海、重庆)按省处理。它们的区县代码前 4 位是
1101、3101这样的"市辖区",不要当成另一个城市。 admin-region只有省和地级市,名称写全称("杭州市",不写"杭州")。
第 2 步:取这个地区的理赔案件
用 join 把理赔案件连到医疗机构,在右边(医疗机构)写地区的过滤条件。只取要用的字段,保存成文件:
python3 scripts/wi.py join health-claim medical-institution --right-where "region_code = 330000" --left-fields claim_no,accident_date,total_amount,claimed_amount,status,disease_category,hospital_days --right-fields hospital_name,level,district_code --limit 1000 --save data/claims-1.json
- 最后一行写"还有下一页:--cursor C"时,把同一条命令加上
--cursor C,存成data/claims-2.json,直到没有下一页。一个省约 1,500 件,要取 2 页。 - 只问一个城市或区县时,换成第 1 步表里的过滤条件,通常 1 页就够了。
- 用户还限定了时间、状态时,加在左边:
--left-where "accident_date >= 2024-01-01"、--left-where "status = 已拒付"。一个条件写一个--where。 disease_category(疾病大类)是 AI 扩增字段,由模型从诊断摘要判定。回答里用到它时写明这一点。要看某个案件为什么判成这一类,用python3 scripts/wi.py lineage health-claim disease_category --record <案件号>。
第 3 步:用代码算
一次 run_python 读全部文件,把要算的都算完。区县汇总到城市时,按 district_code 的前 4 位分组。城市的名称用 admin-region 查(一次取全部 368 行,再按代码对上):
python3 scripts/wi.py query admin-region --fields region_code,region_name,level --limit 1000 --save data/regions.json
import json, glob
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"]]
rows = [r for p in sorted(glob.glob("data/claims-*.json")) for r in load(p)]
names = {r["region_code"]: r["region_name"] for r in load("data/regions.json")}
print("案件数", len(rows))
g = defaultdict(lambda: {"n": 0, "total": 0.0, "claimed": 0.0, "status": defaultdict(int)})
for r in rows:
city = r["district_code"][:4] + "00"
x = g[city]
x["n"] += 1
x["total"] += float(r["total_amount"] or 0)
x["claimed"] += float(r["claimed_amount"] or 0)
x["status"][r["status"]] += 1
for code, x in sorted(g.items(), key=lambda kv: -kv[1]["n"]):
refused = x["status"]["已拒付"]
print(code, names.get(code, "(没有这个代码)"), x["n"], "件", round(x["total"], 2), "元", round(x["claimed"], 2), "元",
"拒付", refused, "件", round(refused / x["n"] * 100, 2), "%")- 只看一个地区时,不用分组,直接算合计、平均、各状态的件数和占比。
- 按疾病大类分时,按
disease_category分组。空值单独算一组。 - 字段的键用 join 输出里的字段标识(
total_amount、district_code),不带数据集的前缀。
怎么回答
- 结论:先回答问题。件数、金额带单位(元),比例写百分数。比较、排名用表格。
- 口径:地区按就诊机构所在地算。写明用了哪些数据集(理赔案件、医疗机构),是演示数据。
- 怎么算的:取了哪个地区、几页、多少件,区县怎么汇总到城市。一两句话。
- 限制:约 3% 的理赔案件的就诊机构编码在医疗机构里找不到,这些案件不能分到地区。用到疾病大类时,写明它是 AI 扩增字段。案件只有几件时,写明比例没有统计意义。
- 演示数据里一部分区县代码在真实的区划里没有。按城市、省统计不受影响。按区县列出时写代码,查不到名称的写"(没有名称)"。
- 最后写明这次一共扣了多少点。
不要做
- 不要心算。合计、平均、占比、排名都来自代码的输出。
- 不要用
query health-claim --region。理赔案件不是空间数据,没有地区字段,只能经就诊机构连。 - 不要按名称对区县。区县名称有重名,按代码对。
- 不要把城市汇总的结果说成全省的结果,也不要漏掉第 2 页。
- 不要把这些演示数据当成真实的理赔情况。
不属于本技能
- 一个案件的费用是否正常、有没有过度诊疗:用 health-claim-audit(理赔审核助手)。
- 保单的情况:用 policy-lookup(保单查询助手)。
- 别的数据按地区查询和汇总,例如人口、保费收入、降水、地图上的区县:用 data-query(数据查询)。
出错时
| 错误码 | 怎么办 |
|---|---|
NO_GRANT | 告诉用户缺哪个数据集的授权,给出脚本提示里的申请地址 |
BAD_REQUEST | 按错误信息改字段标识或过滤值,再试一次 |
BAD_REGION | 地区重名或认不出。按信息里的候选改写代码,或者带上省、市 |
LINK_UNAVAILABLE | 运行 python3 scripts/wi.py links health-claim 看现在能用的关联,再用 --link 选就诊机构那一条 |
INSUFFICIENT_CREDITS | 点数不够。告诉用户去工作台的"点数"页查看 |
05版本
发布后不修改,旧版本保留
数据或说明有变化时,平台发布新版本。旧版本仍然可以查看和下载。