【Python】データ解析に必要な 読み込み→処理→書き出し の一連の流れ

【Python】関数の定義と呼び出し(def, return)

データ解析ではしばしばデータファイルを読み込んでから、データに対して何か処理をして、その処理結果をファイルに書き出します。この一連の流れを身に付けることは、データ解析で必要なプログラミング技術の肝を押さえたことになります!
この記事では、Pythonを使った読み込み→データの処理→書き込みの一連の流れをサンプルコードとともに具体的に解説していきます。

ファイルを読み込む方法書き出す方法がわからない方はリンク先をまず読むことをおすすめします。

動作環境
macOS Catalina(10.15.3), python3.7.6, Atomエディタ1.44.0

読み込み→処理→書き出し の一連の流れ

ここでご紹介するのは、(1)京都の各月の平均気温が入力されたデータファイル(AvrgTmp_Kyoto2018.dat)を読み込んで、(2)1月と8月の気温差を計算し、(3)その結果をファイルに書き出すプログラムです。
以下にサンプルコードを紹介します。

サンプルコード

import re

infile = open('AvrgTmp_Kyoto2018.dat')

for line in infile:
    if not re.match('#', line):
        blocks = line.rstrip('\n').split(' ')
        month = blocks[0]
        aveTmp = blocks[1]
        if int(month) == 1:
            aveTmp_1 = aveTmp
        elif int(month) == 8:
            aveTmp_8 = aveTmp
infile.close()

delTmp = float(aveTmp_8) - float(aveTmp_1)

outfile = open('deltaTmp_1vs8_Kyoto2018.dat', 'w')
outfile.write('# Inputfile is AvrgTmp_Kyoto2018.dat\n')
outfile.write('# calculation : delTmp = aveTmp(Aug.) - aveTmp(Jan.)\n')
outfile.write('# aveTmp(Aug.) = %s [deg], aveTmp(Jan.) = %s [deg]\n'%(aveTmp_8, aveTmp_1))
outfile.write('# The calculation result is as follows.\n')
outfile.write(str(delTmp))
outfile.close()

コードの解説

以上のサンプルコードは、ファイルを読み込む方法書き出す方法でご紹介した読み込みと書き込みで用いたコードを並べているだけにすぎません。
少しだけ違っている点があるので、それらについて解説していきます。

if int(month) == 1:

一月の平均気温を取り出すために、記述しています。
ここで、なぜint(month)としてmonthをInt型に変換しているかというと、読み込んで得られた引数monthはString(文字列)型だからです。
単純にmonth == 1とすると、左辺と右辺で型が異なるのでエラーを吐きます。

delTmp = float(aveTmp_8) - float(aveTmp_1)

8月と一月の平均気温の差分を計算しています。
上でも書いたように、aveTmp_8aveTmp_1はString型(文字列)なので、そのままでは計算ができません。
なので、float型(実数)に変換して計算をします。
実数どうしの差分なので、delTmpは実数型になります。

※PythonはC言語やJavaなどの他の言語と違い、変数と型の定義をしないで記述できてしまうので、それぞれの引数が何の型になっているかは意識しておく必要があります。

outfile.write(str(delTmp))

気温の差分をファイルに書き込みしています。
ここでstr(delTmp)としている理由は、write文ではString型(文字列)しか記述できないからです。' 'で囲むか、このようにstr()で文字列に変換しています。

outfile.write('# aveTmp(Aug.) = %s [deg], aveTmp(Jan.) = %s [deg]\n'%(aveTmp_8, aveTmp_1))

初めての人はよくわからないと思います。
これは、二つある%s%(aveTmp_8, aveTmp_1)のそれぞれの値を代入しています。
%sはString(文字列)を代入するという意味です。
float型の場合は%f、Int型の場合は%iと記述します。詳しくは、また別の記事で紹介しますね。

プログラムを実行しよう

上記のサンプルコードを実行してみましょう。
ターミナルを開いて、cdでcwdをDesktop/Dr.code/python/data-analysis/InOutput にして、実行します。
(→やり方がわからない方はプログラムを実行する方法を参考にしてください。)

出力結果

ターミナルで以下のように記述します。Enterキーを押してもターミナル上には特に何も表示されませんが、Desktop/Dr.code/python/data-analysis/InOutputdeltaTmp_1vs8_Kyoto2018.datというファイルが生成されていると思います。

python InOutput.py
# Inputfile is AvrgTmp_Kyoto2018.dat
# calculation : delTmp = aveTmp(Aug.) - aveTmp(Jan.)
# aveTmp(Aug.) = 29.5 [deg], aveTmp(Jan.) = 3.9 [deg]
# The calculation result is as follows.
25.6

MEMO
write文でたくさんコメント文を書いているのは、後でどんな処理をどうやって行ったかを確認できるようにするためです。ここでは載せてませんが、いつ、誰がこの解析を行ったかも記述すると良いと思います。