Translate

pythonでループ回路の結果のデータをcsvにそれぞれ保存する方法【超絶初心者なので注意】

csvファイルを使ったループ回路が完成したというわけではなく、処理した結果を保存するためのプロセスが今度は必要になります。

そこで今回は、計算処理をした後にどのようにそれぞれのcsvファイルの生データから得られた計算結果をそれぞれ保存するかについて例を紹介したいと思います。

pythonのループ回路のデータ保存はnp.zerosが使える


pythonのループ回路を行った結果をそれぞれ保存するためには、ループ回路内に計算処理した結果をどこか別の空欄の配列に保存するといった処理が求められます。そしてこの空欄の配列はループ回路の外にある必要があります。

pythonには空欄の配列を作るのに有用なモジュールが存在します。それがnumpyに入っているzerosモジュールです。これを使用することで任意の行と列の配列を作ることが出来ます。

import glob
import numpy as np
a = np.zeros((0,1), dtype = float)
csv_file = glob.glob("*csv")

前回のglobモジュールを使ったコードに空欄の配列を生成するnp.zerosを加えたコードがこんな感じです。

ループ回路を作るまえの部分でこのコードを入れておくとよいでしょう。

コードの概要としては、「aという名前の配列は、0行1列の空欄の配列を意味します」といったことをnp.zerosの行で表現しています。またdtypeはその空欄の配列がどういったデータ型の種類とするのかを定義しています。

データ解析の場合には、小数点以下の情報も必要なことがおおいので、とりあえずは小数点を許容するデータ型のfloat型にしておくのが良いでしょう。

forループを使ってループ回路を作り、空の配列に保存する処理を作る

np.zerosを使って空の配列を作った後は、forループを作って、実際の計算処理をするか箇所と、ループ外の空の配列を保存するためのコードを作成しましょう。

コードはとりあえずこんな感じです。



import glob
import numpy as np
a = np.zeros((0,1), dtype = float)
csv_file = glob.glob("*csv")
    for f in csv_file
    data = np.genfromtxt( f, delimiter=",", dtype='float')
    #この行以降で実際の解析処理のコードを作る
    #(今回は一行目と二行目の足し算をし最大値を抽出する計算を例に作成)
   data1 = data[:,0]
    data2 = data[:,1] 
    #それぞれの行を定義

    data3 = data1+data2
    #計算処理

    data_max = max(data3)
    #最大値を抽出

    result = np.array(data_max)
    #データ型を変更(これをしないとエラーを起こして止まる)

    a = np.r_[a,result]
  #aの空の配列に結果を追記する
  #以下読み込んだcsvの数だけループ

np.savetxt("results.csv",a,delimiter = ",")  

あくまでも一例ですが、甘味が作った時はこんな感じの構成でうまく動きました。ここでは始めて出てきたモジュールがいくつか登場しています。

np.genfromtxt()
max()
np.array()
np.r_[]
np.savetxt()

これらのモジュールについても簡単に触れておきます。

np.genfromtxt()はnumpyのcsvファイルの読み取り用のモジュール

np.genfromtxtはnumpyのcsv読み取りに際に使うモジュールです。
このモジュールを動かすのに最低限必要な情報としては、csvファイル名、区切りの形式です。

今回のコードではfと記載されいますが、これは「csv_fileのリストのf番目のファイル名」という意味になります、また区切りの形式に関しては、今回はdelimiter = ","としていますが、これはcsvファイルを表すカンマ区切りであるを指定しています。

これらの他にも列を指定した読み込みやヘッダーを飛ばした読み込みがありますが、これはまた別の回に紹介したいと思います。

max()はデータ内の最大値を抽出するモジュール

max()モジュールはその名前の通り、指定したデータ内の最大値を返すモジュールになっています。

今回の場合には、data1とdata2という異なる列のそれぞれの行を加算した結果の配列である、data3の最大値を取得するために、data_max = max(data3)と書かれています。

np.arrayはnumpyに適応した配列にするための処理

最終的にうまくaと名前のついた空の配列に結合するためには、データは配列になっていなければならないようです。

この処理をしないで、配列を結合させようとすると、

”all the input array dimensions except for the concatenation axis must match exactly”

こんなエラーが出てしまいます。要約すると結合する次元を揃えなさいと言われています。

そこでresult = np.array(data_max)という処理を加えると配列になるので、aの空の配列に追加できるようになります。

正直ここに関しては、まだ勉強中なので自信はありません。間違っていたらすみません。


np.r_[]は配列を結合するためのモジュール

np.r_[]は配列を結合する上で重要になるモジュールです。結合するためのモジュールにはいろいろとありますが、np.r_[]のモジュールはデフォルトで下の行に配列を結合させてくれるので便利です。

今回のコードは a = np.r_[a,result]という感じになっていますが、このコードの意味としては、「aという配列は、aという配列の末尾の行にresult の配列を加えたものです」という感じになります。

もともとループ外にあるaという配列は、ループ処理が繰り返されることによりどんどんresultの結果を末尾の行に追記していくことになります。この処理により、ループ内の結果をループ外に保存し、最終的にそれぞれのcsvファイルの処理の結果を取り出すことが出来ます。

np.savetxtはその名前の通り、csvに出力するためのモジュール

すべてのcsvファイルの計算結果が集約されたaの配列は最終的にcsvファイルに出力することによって、エクセルデータとして取り出すことが出来ます。

np.savetxtはnumpyに備わっているcsv出力のためのモジュールです。今回のコードは、np.savetxt("result.csv",a,delimiter = ",")となっていて、これは「result.csvというファイル名で、aの配列を、カンマ区切りのcsvファイルで出力します」という意味になります。

ループ回路は一度作ってしまえば応用が利く

ループ回路が一度できてしまえば、かなりデータ処理は楽になります。また応用がかなり効くので、他の計算用のコード書いた時にもコピペして調整しちゃれば使いまわせます。

甘味はまだ初心者なので、多分効率的なコードは書けませんが、他のおなじような初心者の参考になってくれると幸いです。