hotaruの蛍雪日記

競プロとゲームをしています

Python NumPyでCSV形式の時系列データを読み込む

Python NumPyでCSV形式の時系列データを読み込む

PythonCSV形式の時系列データを読み込みたい。

時系列データとは

ある物体のX座標、Y座標を計測したCSV形式の時系列データの例を次のコードブロックに示す。 行は計測した時間、列は各計測値に対応する。

#time,x,y
0,0,0
1,2,3
2,4,6
3,6,9

読み込むスクリプト

NumPyの関数numpy.loadtxtで読み込む。 各計測値のすべての時間のデータを1次元np.ndarray配列にする。 ある変数に、各計測値のすべての時間のデータが入っていると扱いやすいと思う。 変数の形式はnp.ndarrayから変換してもよいが、後からプロットしたり操作するのでnp.ndarray形式が都合がいいだろう。 各データをある変数に入れる処理をスマートにするため、読み込んだ行列形式のデータを転置してunpackした。

import numpy as np

path = "data.csv"
data = np.loadtxt(path, delimiter=",")

time, x, y = data.T

print(x)
# [0. 2. 4. 6.]

CSV形式の時系列データを読み込む他の方法

標準ライブラリcsvモジュール

  • csv.readerなどを使う方法。
  • numpy.loadtxtと比べてコードが長くなり面倒。

Pandas

  • Pandasread_csvなどを用いてpandas.DataFrameとして読み込む
  • 統計やりたいならこれだろう
  • オーバーヘッドがでかそうなイメージ

おまけ

フォーマッタはblackとする。 データを各変数に変換するとき、次のコードブロックのように計測値が多すぎてフォーマットされてしまうとき。

# フォーマット前
time, aaaaaaaaaa,bbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeeeee,ffffffffff,gggggggggg= data.T
# フォーマット後
(
    time,
    aaaaaaaaaa,
    bbbbbbbbbb,
    cccccccccc,
    dddddddddd,
    eeeeeeeeee,
    ffffffffff,
    gggggggggg,
) = data.T

次のコードブロックのように、フォーマットをOFFにするとよい。

# fmt: off
time, aaaaaaaaaa,bbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeeeee,ffffffffff,gggggggggg= data.T
# fmt: on