Pythonで実験データ整理プログラム[CSVの出力]


f:id:wataru_boss:20180527173327p:plain こんにちは。BOSSです。

さて、今回から現在取り組んでいるデータ整理プログラムの途中経過を記しておこうかと思います。

どういうものを作りたいのかというと

第一段階
複数ある実験で得られる生のCSVデータを整理用のtxtファイルに変換し出力

第二段階
GUI設計をしてより使いやすく(第一段階はファイルパスなどはベタ打ち)

第三段階
物性値の入力を行うと必要な物理量に換算し出力

とこんな感じです。現在はまだ構想から着手はじめですので第一段階をさらに細かくステップバイステップで作っていこうと思います。

目次

関連記事

www.kikai-no-boss.com

Python 実験データ整理プログラム[ファイル探索] - 機械学習はじめました。

到達目標

今回は1つのCSVファイルを読み込んでCSVファイルに吐き出すというところまでの進捗をまとめていきます。

f:id:wataru_boss:20180509095815p:plain

これは以前にも出した実験生データ。

これを読み込んで別ファイルに吐き出すのですが、単に吐き出すのではなく赤く囲われたヘッダー部分を切り取って

f:id:wataru_boss:20180518173133p:plain

このようにデータだけのものを別名で出力します。

この理由はあとから試験片の情報など別のヘッダーに書きかえたいからです。

今回これを達成するために勉強したことは以下の内容です。

  • Pandasの使い方

  • Classの使い方

です。前提としてはprint()などの基本モジュールは使え、リストや変数の受け渡しなどは知っているという状態です。

PandasでCSVの読み込み、出力

CSVファイルの読み書きは基本モジュールであるcsvモジュールでも行えますし、愚直にファイル読み込みをしてもよかったのですが。

今回はPandasを勉強してみるかということでそちらを用いました。

といってもファイルの読み込みと書き出しのところだけですが笑

CSVファイルの読み込み

CSVファイルを読み込むにはread_csvメッソドを用います。

これを用いることでCSVファイルの中身をPandas内で処理できるデータフレームというものに変換できます。

データフレームの名前 = pd.read_csv(読み込むCSVファイルパス)

割と簡単ですね。

read_csvメソッドはパス名意外にも色々引数に取ることができるのですが今回もちいたものは以下の通り。

  • skiprows

  • encoding

skiprowsでデータの何行目までをスキップして読み込むかを指定します。

encodingはコーディングを明示的に指定します。書かなくても大丈夫なんですが作ってる最中にエラーが吐き出されて今回はShift_jisを指定しました。

したがって今回用いたCSV読み込みのメソッドは以下のようになりました。

データフレームの名前 = pd.read_csv(読み込むCSVファイルパス, skiprows = スキップしたい行数, encoding = 'Shif_jis' )

CSVファイルへ出力

データフレームからCSVファイルに出力にはto_csvメソッドを用います。

データフレーム名.to_csv(出力CSVファイルのパス)

引数は他にも取れますが、

  • index

  • encoding

を指定。encodingは上記と同様です。

index はTrueでデータの左側に0 1 2 3......とインデックスがつきます。デフォルトはTrueですが今回は邪魔だったのでFalseと指定して消しました。

したがって今回用いたCSV出力メソッドは以下の通りです。

データフレーム名.to_csv(出力CSVファイルのパス, index = False, encoding = 'Shift_jis')

全体の構想

さて、使うメソッドの引数が決まったので必要な入力情報は以下の通り

  • 読み込むCSVファイルのパス

  • 書き出すCSVファイルのパス

  • 読み飛ばす行数の指定

こんなところです。加えて別名で保存をしたいので読み込んだファイル名の最後に_outputを追加する機能を作ります。

また、これから機能をどんどん追加してアップデートしていくのである程度機能を分離していた方が良いと判断。

そこでClassにについて勉強をしたのですが、現在でもあまりしっかりと把握できていないということもあり別記事にてまたClassについては書こうかなと思います。

なので今回はあんまりよくわからないけど使ってみたという感じですね。では、書いたプログラムを示したいと思います。

出来上がったプログラム

import pandas as pd

class new_csv:

    def __init__(self, file_path, rows):
        self.file_path = file_path
        self.rows = rows

    def cut_header(self):
        test_df = pd.read_csv(self.file_path, skiprows=self.rows, encoding="shift_jis")

        output_path = self.file_path[0:-4]
        written_csv = output_path + '_output.csv'
        test_df.to_csv(written_csv,index=False, encoding="shift_jis")

        return


def main():
    print('Input File Path\n')
    file_path = input()
    print('Input skip rows\n')
    rows = int(input())

    file = new_csv(file_path, rows)
    file.cut_header()


if __name__ == '__main__':
    main()

いきなりプログラムを載せていますが、機能としては非常にシンプルです。
まずこの部分で読み込むファイルのパスとスキップする行数を指定します。今回は簡単に入出力を同じディレクトリーとしているので出力先のパス入力は省略しています。

f:id:wataru_boss:20180518230738p:plain

そして、class new_csvを作成。

ここに機能を分離していきます。

内容は非常に簡単で、前述の通りいらないヘッダーを切り取って出力するだけです。

入出力に関しては前述の通りです。

input関数で変数に格納された入力CSVファイルパスとスキップ行数が引数としてcut_headerメソッドに受け渡されています。

そして以下の記述でファイル名を変更しています。

f:id:wataru_boss:20180518231436p:plain

まずスライスを用いて.CSVの部分以外をoutput_pathに格納、さらにoutput_pathの末尾に_output.csvを付け足すことで名前のみ変更しています。

まとめ

今回は1つのCSVファイルを選択しヘッダー以下を読み込みデータフレームを作成、ファイルを別名にして同一ディレクトリーに出力

という内容を実装しました。

まだまだ使い勝手がいいものとは言えません。

なんせ一つずつファイルのフルパスを入力しないといけないので。場合によっては何十もの実験データを扱うには工夫が必要です。

また、出力先のディレクトリーも変更したいと考えています。

と、色々思うところはあるのですがなんせプログラミング自体が初めて2ヶ月弱。ステップバイステップでやっていきます。

たったこれだけの内容ですが結構たくさん勉強しました。

特にclassの扱いはわからないことだらけだったので。

しかし、自分が考えてその通りの結果が得られたというのは非常に嬉しいものですね。

まだまだ簡単な内容ですが、一つずつレベルアップしていけたらなと思います。

またプログラムが進展したときに記事にしたいと思います。