用代码读企划:从政府CSV到可用API的实务检验

IT政策提案
用代码读企划:从政府CSV到可用API的实务检验

どうも〜おかむーです!今天来聊聊政府公开数据和工程实践,带点程序员视角,轻松又实务。

  • 这些政府CSV真的比PDF好用很多,但仍有编码、字段不统一的问题
  • Japan Dashboard、e-Stat、各省厅CSV能做出可复现的指标链条,不过需要清洗与API化
  • 政策目标要跟数据绑定,代码/Schema 才能把承诺变成可验证的事实

結論

总体来说,近年来日本各机关在「把数据放成CSV」上进步明显(参考:digital.go.jp、e-stat、notice.go.jp的CSV资源),但要把这些数据变成能被政策验证和持续监控的基础设施,还差在:统一schema、稳定API、版本化与机读元数据。要解决这些问题,既要技术实现(编码/接口/验证),也要政策设计(把KPI跟数据源绑定)。

报告正文

现状观察 — 具体数据源举例

これ見てくださいよ:

  • https://notice.go.jp/docs/status_notice.csv:政府公告状态CSV,说明政府尝试提供机读列表,这是好事情!
  • digital.go.jp 的 Japan Dashboard(https://www.digital.go.jp/resources/japandashboard):把统计整合成可视化面板,但背后数据有时还是分散在各省厅CSV或PDF
  • e-Stat Dashboard(https://dashboard.e-stat.go.jp/):国家统计的集中入口,API化做得最好的一部分
  • 省厅CSV例子:病院列表CSV(xxxxxx_hospital.csv)、车辆销售(内阁府CSV)等,数据量、字段各异

问题点(技术视角)

  • 编码乱象:部分CSV看样子有Shift_JIS或混合编码,抓取时容易出现mojibake(搜索结果第3项片段就有乱码痕迹)
  • Schema不统一:不同CSV中同义字段(如都道府县编码、经纬度)命名不同或数据格式不一致
  • 元数据缺失:很多CSV缺乏明确的更新时间、バージョン、ライセンス字段,难以做数据治理
  • API缺乏一致性:虽有Japan Dashboard与e-Stat API,但并非所有必要数据都可通过稳定REST/GraphQL取得

技术验证与示例代码

エンジニア的に言うと,这些问题都能用一套可重复的ETL+Schema验证流程解决。下面是示例:

Python抓取并修正编码、验证经纬度的示例:

import requests

import chardet

import pandas as pd

url = 'https://notice.go.jp/docs/status_notice.csv'

r = requests.get(url)

enc = chardet.detect(r.content)['encoding']

df = pd.read_csv(pd.compat.StringIO(r.content.decode(enc)))

基本清洗

if 'lat' in df.columns and 'lon' in df.columns:

df = df.dropna(subset=['lat','lon'])

df = df[(df['lat'].between(20,46)) & (df['lon'].between(122,153))]

print(df.head())

要点说明:要先探编码(chardet),再read_csv。经纬度范围校验是简单但常用的数据质量规则。要するに=也就是,先把数据变“可验”再上指标。

API化建议(简要)

  • 暴露OpenAPI/Swagger,返回JSON-LD并附带Schema.org/GeoCoordinates
  • 提供分页、过滤、ETag/Last-Modified以便前端/爬虫高效同步
  • 公布Data Dictionary(字段说明、单位、编码表)与样例数据

示例:用FastAPI把CSV包装成REST接口的示意

from fastapi import FastAPI

import pandas as pd

app = FastAPI()

df = pd.read_csv('status_notice.csv')

@app.get('/api/notices')

def list_notices(q: str = None, limit: int = 100):

res = df

if q:

res = res[res['title'].str.contains(q)]

return res.head(limit).to_dict(orient='records')

指标与政策绑定的实践

政策承诺(比如区域医疗资源均衡、减排目标、车辆销售结构)需要与具体数据表建立一对一的链路:

  • 为每项政策声明定义一个可量化的KPI(明确表、字段、计算公式)
  • 在数据发布页面同时提供“政策→数据→代码”三联:数据源CSV、计算脚本(Notebook)、可视化配置(Dashboard)
  • 实施CI:每次源数据更新后自动跑指标并发布版本差异

举例:把医院CSV和医疗资源KPI绑定

  • 数据源:xxxxxx_hospital.csv(含经纬度、医院类型、診療時間)
  • KPI示例:每万人人均门诊点数、急救覆盖半径
  • 自动化:在更新当天触发Notebook计算并更新Japan Dashboard相关图表

可行的改进路线(工程与政策)

  • 采用DCAT/JSON-LD发布Data Catalog,强制元数据字段(更新頻度、ライセンス、連絡先)
  • 对重要数据集提供官方API并保证SLA;次要数据也至少提供版本化CSV+ETag
  • 建立共同的自治体schema(共通的地理编码、ID规则),用Lookup表桥接历史数据
  • 推动“政策承诺必须含数据链路”规则:预算/施策公开时同时提交用于评估的Notebook

まとめ

結論をひとことで言うと:CSV化は前進だけど、それだけじゃ足りない!API化、Schema、元数据与自动化指标链是把承诺变成可验证政策的关键。エンジニア的に言うと、API一本とSchema一套能把很多政治话语变成数据事实!

おかむーから一言

数据就是社会治理的接口,代码把承诺变成可复现的事实。技术不是魔法,但它能帮我们把政治的“说法”变成可以检验的“做法”,这才有意思!