CSV読み込み

ee9king に投稿

仕事上、オシロのデータを吸い上げ時にCSVデータを出力して後から表示することがよくある。単に表示するだけであれば、Excelで読み込んでグラフにしたほうが楽だが、下記のようなデータの場合、Pythonで書けたほうが楽だなぁ、とおもうことがままあったりする。(ほんとにPythonが楽なのかと言うことはさておき)

  • トランジスタのASOプロット
  • ヒューズの溶断プロット

トランジスタのASOプロットは横軸が電圧、縦軸が電流であり、オシロで電圧と電流を測定してそれを表示する。特に電圧は、C-E間或いはFETならD-S間であり、両端電圧を演算する必要がある。もっとも、オシロスコープには演算機能があり特に困らない。次に電流であるが、ホール素子を用いた代表的な電流プローブで測定したものは測定値をそのまま使用しても良い場合とダメな場合がある、ダメな場合は手修正によるデータ加工が必要だ。もっとも大きな問題はスキュー、電圧のキャリブレーションは可能だが電流のそれはない(コイルを使用する簡易の調整はできるが、rise Timeの大小によって明らかに異なる)ため、電流の立ち上がりが変だったりすると、さわれるTrがなぜ1000Wぐらい消費しているみたいな、よくある間違いに陥る

ヒューズの溶断プロットは、ヒューズメーカが持っている熱容量溶断カーブ(メルティングインテグラル)に、電流波形をプロットして、インラッシュ(突入)等で誤溶断しないかをデータで判定するものである。当然、さまざまな波形を観測して大量にプロットして判定するが、データ量が多くなるとちと重い。

で、本題だが、CSVを簡単に読み込ませる方法はあるのだが、うまくいかない例が多い。最初に名称とか日付などのデータが入っている場合は読み飛ばせばいい

import numpy

a=np.loadtxt('test.csv',delimiter=',',skiprows=22)

普通のデータならこれでうまくいくが、データに欠損があるとうまくいかない。オシロの演算機能を使ったりする場合に、すべてのデータが埋まっていないことがある。また、データがない場合、区切り文字で終わっている場合など(実際はスペースが入っており空白ではないのだが)、このような場合は、欠損データをnanあるいは初期値にして読み込む方法がある。

import numpy

a=np.genfromtxt('text.csv',delimiter=',',skip_header=22)

この関数の引数というかパラッメータが、関数ごとに違うというのが、もっともPythonやってわかりづらく、気に入らないところだ。関数の名前も。

これらのやり方では、文字列と数値が混同しているとうまく扱えないので、このような時はpandaを使うのが良いらしいが、読み込まれた後に、数値に変換したりするのがいちいち面倒である。

import numpy
import pandas as pd

a = pd.read_csv('test.csv',header=None,skipinitialspace=True)
d = np.array(a[23:])
curr = d[:,2].astype(np.float)
vv = d[:,3].astype(np.float)

astypeで変換する際に、nanで入れてくれるようだ。読み込み時のskipinitialspaceは区切り文字','のあとにスペースが入っているような場合にそれをスキップすることである、そうしないと数値なのに文字列になってしまう。というわけで、面倒だなぁということを書きたかった。

複数のファイルを読み込む時は、まとめて読み込んだほうが楽だ、でもファイル名がバラバラだと、うまくいかないのでファイル名に規則性もたせて、角トランジスタごとに別フォルダにするなどの工夫を入れたのち、globを使って変数に入れる。

import glob
import numpy as np

asodata=[]
paths=[]
for path in glob.glob('mosfet1/ASO-*.csv'):
    paths.append(path)
    asodata.append( np.loadtxt(path,delimiter=',',skiprows=1) )
aso_num=len(paths)
1回の読み込みが一つのリストになっているので、別々に取り出す。

for i in range(aso_num):
    x=asodata[i][:,0]
    y=asodata[i][:,1]
    if 'max' in paths[i]:
        plt.plot(x,y,color='Black',linewidth=2,label=paths[i])
    else:
        plt.plot(x,y,color='Black',linewidth=2,linestyle='dashed',label=paths[i])

 

やっぱり、めんどうだ。ダイアログ開いて自分で複数選択するようにできひんのか?matlabだと普通にできるじゃねーか!

 

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。