Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
FastAPI を活用した オープンデータAPI の作成
Search
しみず ゆうき
September 11, 2021
Programming
0
1.1k
FastAPI を活用した オープンデータAPI の作成
2021.9.11
Python Charity Talks in Japan 2021.09
しみず ゆうき
September 11, 2021
Tweet
Share
More Decks by しみず ゆうき
See All by しみず ゆうき
2025年 山梨の技術コミュニティを振り返る
yuukis
0
350
サイトを作ったらNFCタグキーホルダーを爆速で作れ!
yuukis
0
1.1k
Perlで痩せる
yuukis
1
840
Pythonで遊べるLEDボードの紹介
yuukis
0
120
今話題のMCPサーバーをFastAPIでサッと作ってみた
yuukis
0
610
地域ITコミュニティの活性化とAWSに移行してみた話
yuukis
0
560
Gemini API を試した話と山梨でオススメのものを語るLT
yuukis
0
110
山梨のIT勉強会コミュニティを盛り上げるためにアレ作ってみた!
yuukis
0
110
FastAPIで始める やまなし温泉めぐり
yuukis
0
500
Other Decks in Programming
See All in Programming
Understanding Apache Lucene - More than just full-text search
spinscale
0
140
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
7
3.1k
Claude Codeログ基盤の構築
giginet
PRO
7
3.6k
Java 21/25 Virtual Threads 소개
debop
0
270
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
170
AI活用のコスパを最大化する方法
ochtum
0
330
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
110
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
530
AI Assistants for Your Angular Solutions
manfredsteyer
PRO
0
160
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
The free-lunch guide to idea circularity
hollycummins
0
350
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
160
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
270
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
320
The Limits of Empathy - UXLibs8
cassininazir
1
270
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Code Reviewing Like a Champion
maltzj
528
40k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.2k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
110k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
200
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
210
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Transcript
2021. 9. 11 ͠Έͣ Ώ͏͖ 1 ʲPython Charity Talks in
Japan 2021.09ʳ FastAPI Λ׆༻ͨ͠ ΦʔϓϯσʔλAPI ͷ࡞
͓·͑୭Αʁ ͠Έͣ Ώ͏͖ • ϞόΠϧΞϓϦ ΤϯδχΞ ◦ Android/iOS • ࢁསݝߕࢢ
ग़ • Python Shingen.py Ͱ৮ΕΔ͘Β͍ 2
sli.do Ͱ࣭Λड͚͚͍ͯ·͢ʂ 3
͡Ίʹ • ݱࡏɺࢁསݝͷΦʔϓϯσʔλαΠτͰ 12,000݅Λ͑Δσʔλ͕ެ։͞Ε͍ͯΔ • ϞόΠϧΞϓϦͰར༻͍ͨ͠߹ɺWeb API Ͱఏڙ͞Ε͍ͯΔͱखܰʹࢼ͢͜ͱ͕Ͱ͖ͯ خ͍͠ •
Shingen.py ͷษڧձͰ FastAPI Λࢼ͢ػձ͕ ͋ΓɺΦʔϓϯσʔλར༻ʹ׆༻Ͱ͖ͳ͍͔ ݕ౼ͨ͠ 4
FastAPI ͱ • OpenAPI ʹج͍ͮͯ࡞ΒΕ͍ͯ Δ Python ϑϨʔϜϫʔΫ • ࡞Γ͢͞Λҙࣝ
• ʮૣ͍ɾ͍ɾ؆୯ʯ ◦ ։ൃ͕ૣ͍ ◦ ͦΕͳΓʹύϑΥʔϚϯε͕ग़Δ ʢ͍ʣ ◦ ؆୯ʹ࡞ΕΔ 5 from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return return {"item_id": item_id, "q": q}
ྫͱͯ͠ɺ ࢁསͷԹઘࢪઃΛฦ٫͢ΔAPI Λ FastAPI Ͱ࡞͢Δ 6 ͪͳΈʹ ࢁས ઘ࣭͕ଟ༷ɺܠ؍ͷྑ͍Թઘ͕ͱͯଟ͍Ͱ͢ʂ
ݝͷΦʔϓϯσʔλΛར༻ 7
8 PDF !!
PDF Ͱେৎʂ PDF Λͦͷ··ϩʔυͯ͠มޙɺ FastAPI Ͱฦ٫͢ΔΑ͏࣮͠·ͨ͠ 9 Python ศརͰ͢Ͷ
chezou/tabula-py • PDF ϑΝΠϧͷදΛ pandas ͷ DataFrame ΦϒδΣΫτʹ ม͢ΔϥΠϒϥϦ ◦
CSVɺTSVɺJSON ϑΝΠϧʹม ͢Δ͜ͱՄೳ • OCR πʔϧͰͳ͍ • Java 8 Ҏ͕߱ඞཁ 10
main.py - ᶃ PDF ಡΈࠐΈ 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 def get_data(pdf_path): previous_df = pd.DataFrame() dfs = tabula.read_pdf(pdf_path, lattice=True, pages = 'all') for df in dfs: # ෳϖʔδͷදΛ݁߹͢Δ if (check_columns(df, previous_df)): df = pd.concat([previous_df, df]) previous_df = df return previous_df PDFΛಡΈࠐΈɺDataFrame Φϒ δΣΫτΛฦ٫͢Δ ෳϖʔδʹ·͕ͨΔදͷ໊߲ Λൺֱ͠ɺಉ͡ද͔Ͳ͏͔Λఆ ͢Δʢ্ͷ͔ؔΒݺΕΔʣ
main.py - ᶄ API ࡞ 12 app = FastAPI() pdf_path
= "h3012011.pdf" @app.get("/") def read_root(): data = get_data(pdf_path) json_data = data.to_json(orient = 'records') return json.loads(json_data) @app.get("/area/{area}") def read_item(area: str): data = get_data(pdf_path) df_mask = data['ࢢொଜ໊'] == area data = data[df_mask] json_data = data.to_json(orient = 'records') return json.loads(json_data) [get] / શ݅ฦ٫͢Δ API [get] /area/{area} ࢦఆ͞ΕͨࢢொଜͷΈฦ٫͢Δ API
Docker Λ༻ 13 VPS Nginx (ϦόʔεϓϩΩγ) opendata.yamanashi.dev /api/onsen Docker コンテナ
FastAPI localhost:xxxxx main.py ࢁསݝ WebαΠτ CSV PDF tiangolo/uvicorn-gunicorn-fastapi :python3.8-alpine3.10 ্هͷΠϝʔδΛϕʔεʹ openjdk11 ΛΠϯετʔϧ ͨ͠ͷΛ༻
DEMO 14 https://opendata.yamanashi.dev/api/onsen
ࢁསݝΦʔϓϯσʔλAPIϓϩδΣΫτ • ϓϩδΣΫτ αΠτ ◦ ݝͷΦʔϓϯσʔλαΠτͰެ։ ͞Ε͍ͯΔσʔλΛ API Ͱఏڙ •
GitHub ◦ ιʔείʔυΛެ։ ◦ ߋ৽͢Δ͜ͱͰࣗಈσϓϩΠ • DockerHub ◦ FastAPIɺTabula ͕࣮ߦՄೳͳ Docker ΠϝʔδΛఏڙ 15 https://opendata.yamanashi.dev
ຊϓϩδΣΫτ͕ࢦ͢ͱ͜Ζ 16 • ଞͷΦʔϓϯσʔλͷAPIల։Λ༰қʹ͢Δ ◦ ϦϙδτϦΛෳ͠ɺmain.py ΛΧελϚΠζ͢Ε OK • ΦʔϓϯσʔλAPIαʔόͷى্ͪ͛Λ༰қʹ͢Δ
◦ Docker ڥ͕͋ΕϫϯϥΠφʔͰى্ͪ͛Մೳ σʔλར༻ʹ͍ͭͯ ࢁསݝΦʔϓϯσʔλαΠτར༻ن ʹै͏ඞཁ͕͋Γ·͢
͍͞͝ʹ 17
·ͱΊ 18 ʮFastAPI Λ׆༻ͨ͠ ΦʔϓϯσʔλAPI ͷ࡞ʯ • FastAPI Φʔϓϯσʔλ͔Βखܰʹ API
Λ࡞͢Δͷʹ͍͍ͯΔ ◦ Tabula ͱΈ߹ΘͤΔ͜ͱͰɺPDF ϑΝΠϧ FastAPI ʹࡌͤΔ͜ͱ͕ Մೳ • ࢁསݝΦʔϓϯσʔλAPI ϓϩδΣΫτΛى্ͪ͛ ◦ API࡞ɾAPIαʔόى্ͪ͛Λ༰қʹ͠ɺΦʔϓϯσʔλͷར༻ଅਐʹ ܨ͍͛ͨ