Pythonで測定データのピーク値を検出してみる
測定ログデータのピーク値をPythonで検出してみました。
目次
やりたいこと
特定のサンプリング周波数で測定した値を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
一応、準備したデータではうまくいきました。
流用される際には、正しく検出できるか確認してから流用してください。
公開日
広告
作ってみたカテゴリの投稿
- PythonでFizzBuzz問題をやってみた
- PythonでPDFファイルのサムネイル画像を作る
- Pythonでオブジェクトを選択してクロップするツールを作ってみた
- Pythonでデータロガーのログから瞬断を抽出してみる
- Pythonで写真の中の線を抽出してみた
- Pythonで動画から静止部分を抜き出してみた
- Pythonで測定データのピーク値を検出してみる
- Pythonで複数のCSVデータを1つのファイルにまとめてみた
- PythonとExcelでフォルダの使用量を調べてみた
- Sphinx(ablog)の後処理をする
- WordPressのブログを静的サイトに書き換えてみました
- シェルスクリプトでSphinxのビルドの前処理をする
- 数式を中置記法から後置記法(逆ポーランド記法)に変換してみた