使い方
- 「新規」ボタンを押して、諸々を入力、CSV を指定して「保存」ボタンでアップロード
- アプリにより、CSV 各列が数値なら Y 軸、でなければ X 軸に割りあて、グラフを表示
- 必要に応じて、「設定」タブからグラフ種別や軸の割りあて、表示名を編集して更新
- URL を登録しておくと、定期的に出典の更新状況が確認され、自動的にアップデート
- ナビバー(ないしバーガー)の「組合せ」から CSV 間で列のかけ合わせが可能
背景
感染症に関して、厚生労働省が情報を公開してくれていますが、7日移動平均などを任意に分析するには、CSV から情報を読み取る必要があります。
そこで、CSV のデータを読み出して、例えば累計から1日ごとの数値を算出するなど任意に整形し、グラフを作成してくれるツールを作りました。
新規学習事項
- Django
- Bootstrap
- Plotly
工夫点
- 「曜日ごと」と「7日移動平均」
Y 軸がひとつかつ X 軸が日付のとき、「曜日ごと」と「7日移動平均」を plot する。
- CSV 間の列かけ合わせ
陽性者数 ÷ 検査数 ≒ 陽性率 など。
- タブ化
CRUD の遷移をスムーズにするため、CRU をまとめた感じのタブ表示にしました。
- サンプル画像
一覧ページにサンプル画像を表示。
Heroku と Cloudinary を連携することで実装しました。
苦労点
- Django フォームの複数設置
タブ表示を採用した結果、1ページにフォームが混在することになり formset を使用しましたが、management_form を設定する必要があることを知るまでに時間を費やしてしまいました。
また、各タブ(実質1ページ内)の form・formset それぞれに submit を用意したことが原因と思われるエラーが発生したため、ForeignKey に指定したモデルのフォームを非表示で追加することで対処しました。
- OS の違い
Heroku へデプロイしたところ 500 エラーに遭遇し調べたところ、原因は、ブラウザサイズ等を基に plot エリアを伸縮させようと、pywin32 を使ったことでした。
Heroku のサーバ OS は windows でなく、そもそもブラウザサイズ等の概念をサーバ OS に求めたことが原因でした。
一方で、Plotly がブラウザの横幅に追従できていることから、別の手段を模索し、JavaScript にあたりをつけて実装にこぎつけました。
- Heroku へのファイル保存
また、Heroku ではアップロードしたファイルが定期的に削除されることがわかり、やむなく CSV の内容をそのまま TextField に保存することで対応しました。
- gunicorn の実行回数
1時間おきに URL のヘッダー情報 Last-Modified をチェックのうえ更新する処理を自動化し、logs を監視していたところ、続けて2回実行されていることが判明しました。
wsgi の設定が不適切なのではないかと調べまわった結果、Procfile の gunicorn により、デフォルトでは wsgi が2回呼び出されることがわかり、本来望ましくないかも知れませんが、これを1回に制限することで対応しました。
- 情報源の仕様変更・追加
一部の全国版データへの都道府県データ追加に伴って、列「Prefecture」が追加された一方、機関ごとの検査数では各機関がそれぞれ列に対応付けされてきた。
このため、仕様が混在することとなり、各都道府県をそれぞれ列に対応付けた。
また、追加された一部データにおいて、4桁以上の数値が「桁区切りカンマ」付き数字文字列となっていることから、pd.read_csv 時に thousands=',' を指定して対応した。