From Web to Plot

pythonプログラムの実例の一つとして、 Internetで入手可能なデータを取り込んで、グラフ化してみます。 東洋経済オンラインがwebで公開している、Covid19の時系列データを 取り込み、グラフ化してみます。

web上のデータをダウンロード

まずはweb上で公開されているcsvデータをローカルファイルにダウンロードしてみます。python3ではurllibモジュールのrequestサブモジュールを使って、指定したURLの内容をプログラムを使って読み込むことができます。 このモジュールをプログラムで利用するために、このモジュールをインポート(import)します。

pythonには豊富な標準ライブラリモジュールが用意されています。また、第三者によって提供されているモジュールも豊富です。Pythonでのプログラム開発では、これらのモジュールをうまく使いこなすことがコツの一つです。文献/web pageを利用して必要なモジュールを探してみましょう。

ここでは、urllib.request モジュールの中の urlopen()関数だけが必要です。 この様な場合には、urlopen関数だけを選択的にインポートすることができます。

次にデータをダウンロードするURLのリストを作っておきます。このリストにdataurlsという名前をつけておきます。

python3にはデータ(オブジェクト)の並びを表現するためにふたつのデータ形, リスト( [,] )とタプル( (,) ) が用意されています。リストはデータを作成した後で、要素を変更(取り替え)することができますが、タプルはその要素を変更(取り替え)することができません。URLのリストはプログラム中で変更する必要はありませんから、dataurlsはURLのタプルとして定義しました。

次に、URLで指定されるcsvファイル(csv:comma separated value,カンマ区切り形式)をローカルファイルにダウンドードする関数 load() を定義します。

defキーワードを使って、関数load()を定義しています。loadの引数はdataurlです。 関数の本体は、:に続く文で定義します。関数本体のプログラム文はdefキーワードに対してインデントされています。同様にwith文の本体(:のあとの文)もwithに対してインデントされていることに気をつけてください。インデントにTABを使うこともできますが、1byte文字の空白' 'を使うことを推奨します。 このpythonでのブロック構造の表現はちょっと特殊ですが、出来上がったプログラムが読みやすくなることを狙って採用されています。

この関数load()dataurl の最後の要素であるファイル名と同じ名前のローカルファイルにデータを保存します。 dataurl の文字列は "/" を区切りとして切り分けられますdataurl.split("/") 。 切り分けたリストの最後の要素[-1] がファイル名 xxxx.csv です。

urlopen()で確立したwebとの接続を inf, 書き込み用(w)にオープンしたバイナリ形式データ(b)のファイル指示子をoutfとして使うことをwith ... as ...,:構文で宣言しています。

この構文(context manager)を使うことで、確実にこれらのフィアル/接続がこのセクション実行後に自動的にcloseされることが保証されます。

あとはデータを読み込んで、data=inf.read(), それをファイルに書き出す、outf.write(data)、だけです。

dataurlsの各要素についてこの関数を呼び出します。

CSVから SQL Dtabaseへの変換

データの検索などの操作はCVSデータをSQL Database(ここではsqlite3データベースを利用)に変換することで、簡単に行えるようになります。 この変換は色々な手法がありますが、今回試してみた結果pandasのdataframeを経由する方法が簡単確実です。

pandasは最近話題のanacond/minicondaなどでも使われているpythonでのデータ処理向けのライブラリです。 dataframeと呼ばれるデータ構造を提供しており、 単純なアレイ構造を超えた取扱を実現しています。ただ、使いこなしにはある程度の練習が必要な様です。ここではdataframe の備えるcvs/sqlへの読み書きの機能だけを使います。

まずdataframe形のデータを使える様に、pandasモジュールをインポートしましょう。sqlite3, os もインポートしておきます。 os.pathモジュールからはsplitext関数だけをインポートしておきます。

次に一つのdataurlについて、先ほどダウンロードした csvファイルを読み込み、sqlデータベースのテーブルとして追加する関数from_cvs_to_sql() 関数を定義します。

sql databaseの確認

作成されたデータベースのschemaをチェックしてみましょう。 sqlite3ではデータベースに含まれるテーブルなどのschme情報は、 sqlite_masterテーブルに存在します。この中のSQL欄をみることで、それぞれのテーブルが持つカラムとそのデータ型を知ることもできますが、sqlite3ではPRAGMA機能を使って、それらの情報を取り出すこともできます。

この様に、csvに含まれるデータから、SQL テーブルの各コラムのデータ型も適切に選択されていることがわかります。

データのプロット

作成されたデータベースから、茨城県の2021年の日毎の陽性者数の推移をグラフにしてみます。グラフのプロットにはmatplotlibモジュールのpyplotサブモジュールを使います。 また、日付データを適切に取り扱うためにdatetimeモジュールも使います。

Dataframe を使って、同様のことができるか確認してみる。

Dataframeを使って同様のグラフを書かせてみた。 loc()メソッドを使うと、SQLのselect相当のことが可能。 StringIOを使うことで、中間のcsvファイルを生成せずにDataFrameに変換ができる。