コロナ感染者が増えている。
神奈川県の特設ページからだと神奈川全体の事を見るのは良いけど、おらが町はどうなっと?
というと、結構手間がかかる。
私の住む町は神奈川県平塚保健福祉事務所管内というかなり大雑把なくくりで十把一絡げ状態ですね はい。
http://www.pref.kanagawa.jp/index.html
http://www.pref.kanagawa.jp/osirase/1369/
でも、せっかくCSVで提供してくれているので、それを使って身近な感染者数をチェックしたい。
今回の手順
1、神奈川県のページからCSVをwgetで貰ってくる
2、qというコマンドを使い色々抽出
3、joinコマンドでくっつける
4、gnuplotでグラフ化
今回インストールしたツール
1、[q]
インストール
rpm -ivh https://github.com/harelba/packages-for-q/raw/master/rpms/q-text-as-data-1.5.0-1.noarch.rpm
2、[gnuplot]
インストール
yum install gnuplot
1、元になるSCVを貰ってきて加工
cd /root/gnuplot #ディレクトリを作って移動
wget http://www.pref.kanagawa.jp/osirase/1369/data/csv/patient.csv #元ファイル頂きます。
iconv -f cp932 -t utf8 patient.csv >jp.csv #元ファイルはがっつり日本語なので文字化け解消のおまじない。
で、引っ張ったはいいものの、awkとかで加工しててもうまくいかないのでイライラ。
もっと楽にできないものか、と探していたら有りましたよ。 その名も、、、
q (キュー)。 短っ!
コマンドがマジでqだけだから検索しても詳細が全然でなくて結局イライラ。
でもすごく便利なのでやりたいことをシンプルに。
-日付当たりの該当者を出す。
-地元エリアの該当者を出す。
q -H -d ',' "select 発表日,sum(1) from jp.csv group by 発表日" >date.csv #発表日で抽出アンドおまとめ
q -H -d ',' "select 発表日,居住地,sum(1) from jp.csv group by 発表日,居住地" |grep 平塚 >hira.csv #発表日と居住地を抽出して地域でGrep。
date.csvの結果:全件数から日付,数
が出てきた。
2020-04-03,31
2020-04-04,20
2020-04-05,27
2020-04-06,6
2020-04-07,18
2020-04-08,64
2020-04-09,28
2020-04-10,20
hira.csvの結果:全件数から日付,居住地,数
が出てきた。
2020-04-03,神奈川県平塚保健福祉事務所管内,3
2020-04-05,神奈川県平塚保健福祉事務所管内,3
2020-04-08,神奈川県平塚保健福祉事務所管内,10
2020-04-09,神奈川県平塚保健福祉事務所管内,1
一発で両方出せればいいのだければ、ちょっとよく解らないので別々に摘出。
そのため、二つのCSVをjoinコマンドなるものでうまい事結合。
前半の-1 1はファイル1の2列目、後半の1.2もファイル1の列目?
よく解らないけどとにかくガチャガチャやってたら想定通りの出力になったから良しとする。
値が無いのは0に指定。
join -t, -a 1 -a 2 -1 1 -2 1 -o 0 1.2 2.3 -e '0' date.csv hira.csv >join.csv
結果:全件数から日付,神奈川の数,平塚管内の数
が出てきた。
2020-04-03,31,3
2020-04-04,20,0
2020-04-05,27,3
2020-04-06,6,0
2020-04-07,18,0
2020-04-08,64,10
2020-04-09,28,1
2020-04-10,20,0
ぶっちゃけグラフ化しなくてもこれで事足りる。
2、グラフにしてみる
まずは地元の感染状況のみを出力するべく、色々と設定
#gnuplot
>set datafile separator "," #CSVの時はカンマ区切りなので必須
>set title "Hiratsuka Covid" #タイトル
>set grid #グリッド線
>set xlabel "date" #x軸ラベル
>set ylabel "Hiratsuka " #y軸ラベル
>set yrange [0:20] #y軸目盛
>set xdata time #x軸は日付ですよ。
>set timefmt "%Y-%m-%d" #元ファイルの日付の書き方
>set format x "%m/%d" #表示する時の表記方法4/1的な。
>plot "hira.csv" using 1:3 with linespoints; #hira.csvの1列目と3列目を使って線とポインタで表示。
で、出たのがこんな感じ。(超質素。)
+マークが該当日なので8日に10人であとは時々2-3人てとこですね。
今度は神奈川県の総数と比較する。
>set datafile separator ","
>set title "Hiratsuka Covid"
>set grid
>set xlabel "date"
>set ylabel "Hiratsuka "
>set y2label "Kanagawa" #第2軸のラベル
>set ytics nomirror #横軸がダブらないようにする
>set y2tics nomirror #横軸がダブらないようにする
>set yrange [0:20]
>set y2range [0:100] #第2軸のレンジ
>set xdata time
>set timefmt "%Y-%m-%d"
>set format x "%m/%d"
>plot "join.csv" using 1:2 with linespoint axis x1y2 title "Kanagawa", "join.csv" using 1:3 with boxes axis x1y1 title "Hiratsuka" #axisを使ってy軸の振り分けを行う。Hiratsuka側はboxesで棒グラフになる
左軸が平塚管内の人数で棒グラフ、右軸が神奈川県内の人数で線グラフ
あれ、X軸が2週間になってる。(自動調整)
期間を短くすれば1週間ごとになるけど、長期的な流れをざっくり見るのであれば良しとする。
8日と11日に神奈川全体で増えてますね。
3、グラフのアウトプット
グラフをpng形式でアウトプットする方法はそのまま画像保存ではなく一度専用ターミナルに移動
今回は日付でファイル名を付けて、保存。
replotをしないとset outputだけだとファイル生成されないので注意
#gnuplot
>set terminal png #pngモードに入る
>set output "`date`.png" #日付をファイル名にしてアウトプットする宣言
>replot #前回アウトプットしたグラフを呼び出してpngファイルにする
>set terminal x11 #ターミナルを元に戻す
>replot #念のため合ってるか確認
全体を1スクリプト化もできそうだけど、途中でterminal移動が入るので、2工程でも良しとする!