Exemplo n.º 1
0
def detect_burr(data,
                pv,
                left=None,
                right=None,
                method=0,
                minimum_peak_distance=100):
    titles = data.columns
    titleList = titles.values.tolist()
    if pv in titleList:
        pvn = titleList.index(pv)
        sta = DisplayData.showStatistic(data)
        print("statistic data:")
        print(sta)
        # use boxplot define threshold
        iqr = sta.loc['75%'][titles[pvn]] - sta.loc['25%'][titles[pvn]]
        if left is None:
            left = sta.loc['25%'][titles[pvn]] - 1.5 * iqr
        if right is None:
            right = sta.loc['75%'][titles[pvn]] + 1.5 * iqr
        print('min edge:', left, 'max edge:', right)
        burrdata = data[((data[titles[pvn]]) < left) |
                        ((data[titles[pvn]]) > right)]
        LoadData.df2other(burrdata, 'csv', 'newfile.csv')
        y = data[titles[pvn]].values
        if method == 0:
            # find_peaks by scipy signal
            peaks, _ = signal.find_peaks(y, height=right)
            plt.plot(y, 'b', lw=1)
            plt.plot(peaks, y[peaks], "+", mec='r', mew=2, ms=8)
            plt.plot(np.zeros_like(y) + right, "--", color="gray")
            plt.title("find_peaks min_height:%7f" % right)
            plt.show()
        if method == 1:
            detect_peaks(y, mph=right, mpd=minimum_peak_distance, show=True)
        if method == 2:
            print('Detect peaks with minimum height and distance filters.')
            # thres=right/max(y)
            indexes = peakutils.peak.indexes(np.array(y),
                                             thres=right / max(y),
                                             min_dist=minimum_peak_distance)
            print('Peaks are: %s' % (indexes))
            plt.plot(y, 'b', lw=1)
            for i in indexes:
                plt.plot(i, y[i], "+", mec='r', mew=2, ms=8)
            plt.plot(np.zeros_like(y) + right, "--", color="gray")
            plt.title("peakutils.peak thres:%f ,minimum_peak_distance:%d" %
                      (right, minimum_peak_distance))
            plt.show()
    else:
        print("Wrong PV name, not in ", titleList)