4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで棒グラフのpeak(山)の検出

Posted at

はじめに

棒グラフをPythonにより描写し,peakが何個存在するかを自動カウントするプログラムを作成したい

前提

今回求めたいpeakを説明する.
peakとは山頂,山,先端などを表し,図の赤い丸の部分のことを言う.
RSSI値(dBm)をx軸の左側から順にみていき,現在の値が一つ前の値よりも大きいかつ,現在の値が1つ次の値よりも大きい時,peakとしている.
peak_qiita.png

使用したデータ

ble_qiita.png

研究で使用しているBLEのRSSIデータの一部抜粋である.今回は504個のデータを使用する.

環境

  • Jupyter Notebook(Anaconda3)
  • Python
  • 使用するデータのcsvファイルとプログラムは同じレイヤーに置く
    jupyter_qiita.png

実装

peak.py

def peak(data_path):
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import csv
    from statistics import variance

    rssi = []
    
    #csvファイルを読み込む
    with open(data_path) as f:
        reader = csv.reader(f)
        data = [row for row in reader]
    
    for i in data:
        try:
            rssi.append(int(i[1]))
        except:
            pass
    
    min_rssi = min(rssi)
    max_rssi = max(rssi)
    
    #RSSIの最小値と最大値の範囲を出力
    print("{}<=RSSI<={}".format(min_rssi,max_rssi))
    
    plt.figure(figsize=(8,6))
    
    #山の数をカウントする
    count=0
    for i in range(min_rssi,max_rssi+1):
        #棒グラフの描写
        plt.bar(i, rssi.count(i), color="blue")
        if rssi.count(i) > rssi.count(i-1):
            if rssi.count(i) > rssi.count(i+1):
                count+=1
            else:
                count+=0
        elif rssi.count(i)>0:
            if rssi.count(i) == rssi.count(i-1):
                if rssi.count(i) > rssi.count(i+1):
                    count+=1
                else:
                    count+=0
        else:
            count+=0
        #print(rssi.count(i))
    print(f"山の数は{count}") 
    print(f"分散は{variance(rssi)}")
    
    #グラフの範囲と書式設定
    plt.xlim(min_rssi, max_rssi)

    plt.ylabel('取得回数(回)', fontfamily='Meiryo', fontsize=18)
    plt.xlabel('RSSI(dBm)', fontfamily='Meiryo', fontsize=18)
    plt.show()

    return (f"{data_path}の山の数は{count}")

実行結果

データから棒グラフを描写し,peakを特定することが出来ました.

kekka_qiita.png

まとめ

Pythonによるpeak検出ができました.研究頑張ります.

4
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?