---
title: FastAPIを活用したオープンデータAPI
tags: 
author: [しみず ゆうき](https://www.docswell.com/user/yuukis)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/9J2GXQWQJR.jpg?width=480
description: 2021.9.11 Python Charity Talks in Japan 2021.09
published: September 11, 21
canonical: https://www.docswell.com/s/yuukis/KJLYE1-2021-09-11
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/9J2GXQWQJR.jpg)

【Python Charity Talks in Japan 2021.09】
FastAPI を活用した
オープンデータAPI の作成
2021. 9. 11 しみず ゆうき
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/DEYV8WLYEM.jpg)

おまえ誰よ？
しみず ゆうき
● モバイルアプリ エンジニア
○ Android/iOS
● 山梨県甲府市 出身
● Python は Shingen.py で触れるくらい
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/VJNMQ94R78.jpg)

sli.do で質問を受け付けています！
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE9ND2QZE3.jpg)

はじめに
● 現在、山梨県のオープンデータサイトでは
12,000件を超えるデータが公開されている
● モバイルアプリで利用したい場合、Web API
で提供されていると手軽に試すことができて
嬉しい
● Shingen.py の勉強会で FastAPI を試す機会が
あり、オープンデータ利用に活用できないか
検討した
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE8K35QY7D.jpg)

FastAPI とは
● OpenAPI に基づいて作られてい
る Python フレームワーク
● 作りやすさを意識
● 「早い・速い・簡単」
○
○
○
開発が早い
それなりにパフォーマンスが出る
（速い）
簡単に作れる
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get(&quot;/&quot;)
def read_root():
return {&quot;Hello&quot;: &quot;World&quot;}
@app.get(&quot;/items/{item_id}&quot;)
def read_item(item_id: int, q: Optional[str] = None):
return return {&quot;item_id&quot;: item_id, &quot;q&quot;: q}
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LELZVYX9JR.jpg)

例として、
山梨の温泉施設を返却するAPI
を FastAPI で作成する
ちなみに
山梨は
泉質が多様、景観の良い温泉がとても多いです！
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4JMVGNLVJW.jpg)

県のオープンデータを利用
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJR2ZDKWE9.jpg)

D
P
!
!
F
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PEXD91LV7X.jpg)

PDF でも大丈夫！
PDF をそのままロードして変換後、
FastAPI で返却するよう実装しました
Python 便利ですね
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/3EKXP2L57D.jpg)

chezou/tabula-py
● PDF ファイル内の表を pandas
の DataFrame オブジェクトに
変換するライブラリ
○
CSV、TSV、JSON ファイルに変
換することも可能
● OCR ツールではない
● Java 8 以降が必要
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/L735X431E5.jpg)

main.py - ① PDF 読み込み
def get_data(pdf_path):
previous_df = pd.DataFrame()
dfs = tabula.read_pdf(pdf_path, lattice=True, pages = &#039;all&#039;)
PDFを読み込み、DataFrame オブ
ジェクトを返却する
for df in dfs: # 複数ページの表を結合する
if (check_columns(df, previous_df)):
df = pd.concat([previous_df, df])
previous_df = df
return previous_df
def check_columns(df, previous_df):
difference1 = set(df.keys()) - set(previous_df.keys())
difference2 = set(previous_df.keys()) - set(df.keys())
複数ページにまたがる表の項目名
を比較し、同じ表かどうかを判定
する（上の関数から呼ばれる）
return (len(difference1) == 0 and len(difference2) == 0)
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/87DD2Q4K7G.jpg)

main.py - ② API 作成
app = FastAPI()
pdf_path = &quot;h3012011.pdf&quot;
[get] /
@app.get(&quot;/&quot;)
def read_root():
data = get_data(pdf_path)
json_data = data.to_json(orient = &#039;records&#039;)
return json.loads(json_data)
全件返却する API
@app.get(&quot;/area/{area}&quot;)
def read_item(area: str):
data = get_data(pdf_path)
df_mask = data[&#039;市町村名&#039;] == area
data = data[df_mask]
json_data = data.to_json(orient = &#039;records&#039;)
return json.loads(json_data)
[get] /area/{area}
指定された市町村のみ返却する
API
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VJPX1LM378.jpg)

Docker を使用
tiangolo/uvicorn-gunicorn-fastapi
:python3.8-alpine3.10
上記のイメージをベースに openjdk11 をインストール
したものを使用
VPS
Docker コンテナ
Nginx
(リバースプロキシ)
opendata.yamanashi.dev
/api/onsen
FastAPI
main.py
localhost:xxxxx
CSV
山梨県
Webサイト
PDF
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/2EVLYQ9NJQ.jpg)

https://opendata.yamanashi.dev/api/onsen
DEMO
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/57GX9WZ5EL.jpg)

https://opendata.yamanashi.dev
山梨県オープンデータAPIプロジェクト
● プロジェクト サイト
○
県のオープンデータサイトで公開
されているデータを API で提供
● GitHub
○
○
ソースコードを公開
更新することで自動デプロイ
● DockerHub
○
FastAPI、Tabula が実行可能な
Docker イメージを提供
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4EQ8W3LLJP.jpg)

本プロジェクトが目指すところ
● 他のオープンデータへのAPI展開を容易にする
○ リポジトリを複製し、main.py をカスタマイズすれば OK
● オープンデータAPIサーバの起ち上げを容易にする
○ Docker 環境があればワンライナーで起ち上げ可能
データ利用については
山梨県オープンデータサイト利用規約
に従う必要があります
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/KJ42K1D5E1.jpg)

さいごに
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LE1MXGZ27G.jpg)

まとめ
「FastAPI を活用した オープンデータAPI の作成」
● FastAPI はオープンデータから手軽に API を作成するのに向いている
○
Tabula と組み合わせることで、PDF ファイルも FastAPI に載せることが
可能
● 山梨県オープンデータAPI プロジェクトを起ち上げ
○
API作成・APIサーバ起ち上げを容易にし、オープンデータの利用促進に
繋げたい
18


