Pandasでログ統計処理スクリプト(その1)
特にブログに書くことがなくネタ切れであります。今回はコンテストでもなく移動運用でもなく自作ネタでもない、ソフトウエアの話題にしましょうか。
長年無線運用をやっていて交信ログがある程度の量になってくると、交信統計というのをやってみたくなるものです。例えば、バンド・モードごとやDX/国内エリア別の交信数の統計は運用スタイルやアクティビティを反映するものなので分析するとなかなか興味深いものです。
Turbo HAMLOGやCTestWinなどのログソフトでも統計分析が可能ですが、細かいところには手が届いていません。例えば、移動局と固定局の割合を調べたり、記念局の交信数を調べること(簡単には)できないようになっています。ログデータを解析するのはさほど難しくないので、PerlやRuby, Pythonなどの文字列解析が得意なスクリプト言語に親和性のある方は、自分で解析スクリプトを作るのが良いかと思いますし、当局もRubyやPythonの勉強がてら分析スクリプトを自分で作っています。
実際にプログラミングしたり開発環境を調べているとデータ分析用のライブラリとして有名なPandasを使うとなかなか便利だということに気が付きました。PandasはPythonで動作するデータ解析支援ライブラリで、科学技術数値データを扱うときに便利です。今回は交信ログの解析に使うので、かなりもったいない使い方ではありますが、後に述べるようにメソッドが充実しているので、こちらのプログラミングが非常に楽になります。せっかくですから最新プログラミングツールを無線活動に活用してみましょう。では例を少しお見せしたいと思います。
データはTurbo HAMLOGのCSV形式とします。CTestWinが出力するHAMLOG形式でもOKです。ご自分の交信ログからCSV形式でログを変換してみてください。他のログソフトでも少しカスタマイズすれば使えます。
次にPythonの開発環境を手に入れてください。WindowsやMacでも良いですが、Unix(Linux)のほうがいろいろと便利です。Pythonはバージョン2と3があるのですが、2でもOKですが、できれば3を選んでください。
次に、IPythonを用意してください。Pythonのインタラクティブツールで、これがあると割と便利です。IPythonも(できれば)バージョン3を選んでください。次にライブラリのPandasも必要となります。これらツールとライブラリはPIPで入手できます。すでにインストールされているライブラリはシェル上でこのようにして確認できます。
~$ pip3 list
pandasがこのリストに含まれていなかったら、
~$ pip3 install pandas
としてお使いの環境にPandasをPython3用にインストールしてください。
次に、以下のスクリプトをlogstat.pyという名前のファイルにセーブします。そのスクリプトと同ディレクトリにHAMLOGのcsvファイルを置いておきます。
# logstat.py import sys import re import pandas as pd from datetime import datetime, timedelta columns_list = ['call', 'datetime', 'time', 'urrst', 'myrst', 'freq', 'mode', 'jcc', 'gl', 'qsl', 'name', 'qth', 'urnr', 'mynr', 'rem3'] log = pd.read_csv(sys.argv[1], names=columns_list)
シェル上で、ipython3を実行します。
~$ ipython3 Python 3.5.2 (default, Sep 10 2016, 08:21:44) Type "copyright", "credits" or "license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]:
となるので、先のスクリプトとCSVログファイル(2012WPXCW.csv)を指定して実行します。
In [1]: run logstat.py 2012WPXCW.csv In [2]:
となると成功。次にインタラクティブモードでログデータをいろいろ見てみましょう。log.head()はログデータ(2次元データフレーム)の先頭5行を表示するメソッド。
In [2]: log.head() Out[2]: call datetime time urrst myrst freq mode jcc gl qsl name qth \ 0 HS7AT 12/05/26 04:04U 599 599 21.0 CW NaN NaN J NaN NaN 1 R9UT 12/05/26 04:13U 599 599 21.0 CW NaN NaN J NaN NaN 2 E21EIC 12/05/26 04:14U 599 599 21.0 CW NaN NaN J NaN NaN 3 NH2T 12/05/26 04:15U 599 599 21.0 CW NaN NaN J NaN NaN 4 PT5T 12/05/26 04:16U 599 599 21.0 CW NaN NaN J NaN NaN urnr mynr rem3 0 1 137 8 1 2 96 8 2 3 236 8 3 4 559 8 4 5 471 8 In [3]:
このように正しくCSVファイルを読み込んでpandasのデータフレームにおさめられていることがわかります。なお、これはCTestWinから出力させたCSVファイルの例で、HAMLOGから直接出力したものだとちょっと異なるかもしれませんので、カラム名などを適当にアレンジしてみてください。
・・・つづく・・・