JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

Pandasでログ統計処理スクリプト(その1)

特にブログに書くことがなくネタ切れであります。今回はコンテストでもなく移動運用でもなく自作ネタでもない、ソフトウエアの話題にしましょうか。

長年無線運用をやっていて交信ログがある程度の量になってくると、交信統計というのをやってみたくなるものです。例えば、バンド・モードごとやDX/国内エリア別の交信数の統計は運用スタイルやアクティビティを反映するものなので分析するとなかなか興味深いものです。

Turbo HAMLOGやCTestWinなどのログソフトでも統計分析が可能ですが、細かいところには手が届いていません。例えば、移動局と固定局の割合を調べたり、記念局の交信数を調べること(簡単には)できないようになっています。ログデータを解析するのはさほど難しくないので、PerlRuby, Pythonなどの文字列解析が得意なスクリプト言語に親和性のある方は、自分で解析スクリプトを作るのが良いかと思いますし、当局もRubyPythonの勉強がてら分析スクリプトを自分で作っています。

実際にプログラミングしたり開発環境を調べているとデータ分析用のライブラリとして有名なPandasを使うとなかなか便利だということに気が付きました。PandasはPythonで動作するデータ解析支援ライブラリで、科学技術数値データを扱うときに便利です。今回は交信ログの解析に使うので、かなりもったいない使い方ではありますが、後に述べるようにメソッドが充実しているので、こちらのプログラミングが非常に楽になります。せっかくですから最新プログラミングツールを無線活動に活用してみましょう。では例を少しお見せしたいと思います。

データはTurbo HAMLOGのCSV形式とします。CTestWinが出力するHAMLOG形式でもOKです。ご自分の交信ログからCSV形式でログを変換してみてください。他のログソフトでも少しカスタマイズすれば使えます。

次にPythonの開発環境を手に入れてください。WindowsMacでも良いですが、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から直接出力したものだとちょっと異なるかもしれませんので、カラム名などを適当にアレンジしてみてください。

・・・つづく・・・