Pythonで測定データのピーク値を検出してみる

測定ログデータのピーク値をPythonで検出してみました。

目次

  1. やりたいこと
  2. 作ったプログラム
  3. 試してみた

やりたいこと

特定のサンプリング周波数で測定した値を1行ずつ記録したデータがあります。このデータに複数のピーク値(最大値ではない)があるのですが、そのピーク値とピーク値が現れる位置を調べてみます。

作ったプログラム

import csv
import sys

fn = sys.argv[1]

with open(fn, mode='r', newline='', encoding='utf-8') as fi:
    csv_reader = csv.reader(fi)
    data_array = [row for row in csv_reader]

for i in range(len(data_array)-2):
    try:
        first = float(data_array[i][0])
        second = float(data_array[i+1][0])
        thired = float(data_array[i+2][0])
    except:
        print('not float data : ' + str(i) + ', ' + data_array[i][0] + ', ' + data_array[i+1][0] + ', ' + data_array[i+2][0])
    else:
        if first <= second and second >= thired:
            print('peak : ' + str(i+1) + ', ' + str(second))

測定データのログファイルを、スクリプトの引数として指定します。

3つ分の連続するデータを取り出して、数値に変換します。数値に変換できた場合は、中央の値が両側の値より大きいかどうか比較をします。

試してみた

こういうCSVデータを用意しました。ファイル名はsin.csvです。

sin
0
0.001
0.001999999
0.002999996
0.003999989
0.004999979
0.005999964
0.006999943
0.007999915
0.008999879
0.009999833
0.010999778
0.011999712
0.012999634
0.013999543
0.014999438
0.015999317
0.016999181
以降省略

上記のプログラムをtest.pyという名前で保存して、実行してみます。

$ python test.py sin.csv
not float data : 0, sin, 0, 0.001
peak : 1572, 0.999999979
peak : 7855, 1.0

一応、準備したデータではうまくいきました。

流用される際には、正しく検出できるか確認してから流用してください。

広告

作ってみたカテゴリの投稿