2014年11月24日月曜日

pythonで保存したファイルをロードする

以前までで、株価の日時推移データをcsvファイルに保存することが出来ました。
今回はこの保存したファイルをpythonで読み込みを行おうと思います。

今回はファイルを読み込むだけだと思い、簡単だとたかをくくっていたのですが、
意外と難しかったです。
最初はcsvモジュールをインポートして使おうと思ったのですが、
csvモジュールでインポートしたデータの使い方がわからなかったので、やめました。
そこでいろいろ調べていたところ、pythonには、データ処理専用に特化した、
numpyというモジュールがあることがわかったので、これを使おうと思います。

具体的にはnumpyの中にある、loadtxt関数を使います。
最初にコードを示すと、以下の様なコードが出来ました。
import numpy as np

def main():
    data = loadfile()
    print data

def loadfile():
    filepath = "/Users/ユーザー名/Desktop/"
    filename = "ファイル名"
    allfilepath = filepath + filename
##    print allfilepath
    date = "date"
    hajimene = "hajimene"
    takane = "takane"
    yasune ="yadune"
    owarine = "owarine"
    dekidaka ="dekidaka"
    data = np.lib.loadtxt(allfilepath,dtype = {'names':(date,hajimene,takane,yasune,owarine,dekidaka),
    'formats':('S30','i','i','i','i','i')},comments = 'null',delimiter = '\t',skiprows =2)
    return data

if __name__ == '__main__':
    main()

意外と難しかったのは、loadtxt関数の扱い方で、
取り込んだデータをの始値だけの列を出力したいときに、
print data[:,0]
とやっても出力することができず苦戦しました。
これはloadtxt関数の中の、dtypeの部分が関係しているようで、これを入れると、上記のような正規表現で抜き出すことはできなくなるようです。
loadtxt関数のマニュアルでは1次元になるようなことが書いてあったような気がします。

では、実際どう抜きとるかですが、
正規表現を使うよりもずっと楽で、例えば始値の列を抜き出したい場合は、
data["hajimene"]
のようにすると抜き出せます。(namesで指定した文字列)
この引数を入れないと、文字列を同時に取り込むことができないようなので、usecols引数を入れて、文字列部分は除外する必要があります。

また、他の引数の説明ですが、comments='null'は[null]文字が数値として認識されなかったためです。
その行の一文字目が[null]の場合は、そこから後ろもすべて[null]になっているので、nullをコメント認定して、その行をすべてコメント化しました。
また、タブ区切りファイルを作成したので、delimiter = '\t'としました。
行列として読み込んで欲しいのは3行目からなので、skiprows =2としました。

参考

numpy.loadtxt
http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html
csv/tsvファイルの読み書き
http://www.mwsoft.jp/programming/numpy/csv.html
実験データの読み込み(テキストファイル)
http://kaiseki-web.lhd.nifs.ac.jp/documents/Python/textfile.htm
PythonのNumPyでTSVファイルを読み込む方法
http://hydrocul.github.io/wiki/blog/2014/0216-load-tsv-python.html
[python] loadtxtでヘッダの読み飛ばし、文字列が混ざったテーブルの読み込み
http://pacocat.blogspot.jp/2011/12/numpyloadtxt.html

0 件のコメント:

コメントを投稿