Subscribed unsubscribe Subscribe Subscribe

stuff

あれこれ

matplotlib: CSV ファイルの読み込み

  • matplotlib グラフ描画のための csv ファイルの読み込み方について。
  • この記事で棒グラフを書いた。こんどはデータファイルを外部から読み込みたい
  • numpy.genfromtxt, numpy.loadtxt, pandas.read_csv を使ってみる
  • まとめ:全部あまり変わらない気もする。敢えて言えば numpy.genfromtxt

f:id:yashima1:20170219012510p:plain:h250   f:id:yashima1:20170219005817p:plain:h250

name = ['S1','S2','S3','S4','S5','S6','S7','S8','S9','S10']
value = [9.77,2.36,2.52,2.08,8.88,2.34,2.13,9.75,5.39,2.09]
stdev = [0.14,0.61,0.60,0.28,0.17,0.65,0.48,0.87,0.52,0.23]

numpy.genfromtxt を使う

import numpy as np

## データの読み込み
# 1) 数値のみ (dtype=np.float)
data = np.genfromtxt('data.csv',delimiter=',',skip_header=1)

# 2) 数値+文字列(dtype="string") 
data = np.genfromtxt('data.csv',delimiter=',',dtype="string",skip_header=1)

# データの分解
name = data[:,0]
value = data[:,1].astype(np.float)    # string を float に変換
stdev = data[:,2].astype(np.float)
  • dtype=None にするとそれぞれの要素は string や float で読み込めるのだが、np.void型になる。ここから column をどう取り出せばいいのかがわからん。ので使わない。
  • よって dtype=“string"として全部文字列で引き出す。もちろん数回に分けてそれぞれdtypeを分けてもいいのだけど、このように後から np.array のデータ型を変える方がラクな気がする
  • dtype 未入力 or dtype=“float” とすると、文字が読み込まれないのでダメ(数字のみのデータならあり)

numpy.loadtxt を使う

import numpy as np

# 1) 数値のみ
data1 = np.loadtxt('data.txt',delimiter=',',skiprows=1)

# 2) 数値+文字列(全部 string として読み込む)
data2 = np.loadtxt('data.txt',dtype="string",delimiter=',',skiprows=1))

# データの分解は上記 np.genfromtxt と同様
  • ここではほとんどnp.genfromtxtと同じ?
  • np.genfromtxtdtype=None で違う型が取り出せるが、loadtxt ではできない。これがnp.genfromtxtの利点かもしれないが、その後の numpy.void を使いこない私からすればあまり変わらない
  • 読み込みスピードは pandas.read_csvに比べて 15倍遅い(STOP USING numpy.loadtxt())らしいので、使わなくてよいならば使わないほうが無難?

pandas.read_csv を使う

import pandas as pd

# データの読み込み: DataFrame 型
data = pd.read_csv("name.csv")    # header がない場合は header=None

# データの分解:DataFrame をもっと聞きなれる np.array に変えてみる
name = np.array(data.iloc[:,0])
value = np.array(data.iloc[:,1])
stdev = np.array(data.iloc[:,2])
  • column の data type が全部一緒ならばそれぞれ string / float として渡されるので変換する必要はなし

まとめ

全部に共通して (1) データファイルを読み込む (2) 使いやすいように np.float in np.ndarray に変換する という意味では手間は同じだった(np.void が使いこなせれば np.genfromtxt のほうが簡単かもしれない)。どれかを優先して選ぶ理由は私には特にないが、敢えて言えば、 import pandas しなくてすむほうがいいから numpy を使い、そして速さやその拡張性から np.genfromtxt のほうがいいかな。というわけで np.genfromtxt をとりあえず使うことにする。

参考