Как я могу определить пиковые точки (выбросы) из моего панды DataFrame - PullRequest
0 голосов
/ 24 июня 2018

У меня есть кадр данных pandas с несколькими значениями скорости, который представляет собой постоянно движущиеся значения, но это данные датчика, поэтому мы часто получаем ошибки в середине, в некоторых точках скользящее среднее, кажется, тоже не помогает, так чтокакие методы можно использовать для удаления этих выбросов или пиковых точек из данных?

Пример:

data points = {0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9}

в этих данных Если я вижу, что точки 4, 4, 5, 6 являются полностью выпадающимизначения, прежде чем я использовал скользящее среднее с 5-минутной рамкой окна, чтобы сгладить эти значения, но все же я получаю много типов бликов, которые я хочу удалить, может кто-нибудь предложить мне какую-либо технику, чтобы избавиться отэти точки.

У меня есть изображение, которое более четкое представление о данных: enter image description here

, если вы видите здесь, как данные показывают некоторые выпадающие точки, которые ядолжны удалить?Любая идея, какой возможный способ избавиться от этих точек?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Я действительно думаю, что z-счёт с использованием scipy.stats.zscore () - это то, что нужно. Посмотрите на связанную проблему в этой записи . Там они сосредотачиваются на том, какой метод использовать до удаления потенциальных выбросов. На мой взгляд, ваша задача немного проще, поскольку, судя по предоставленным данным, было бы довольно просто определить потенциальные выбросы без необходимости преобразования данных. Ниже приведен фрагмент кода, который делает именно это. Просто помните, что то, что выглядит и не похоже на выбросы, будет полностью зависеть от вашего набора данных. И после удаления некоторых выбросов, которые раньше не выглядели как выбросы, вдруг сделают это сейчас. Посмотрите:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import stats

# your data (as a list)
data = [0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9]

# initial plot
df1 = pd.DataFrame(data = data)
df1.columns = ['data']
df1.plot(style = 'o')

# Function to identify and remove outliers
def outliers(df, level):

    # 1. temporary dataframe
    df = df1.copy(deep = True)

    # 2. Select a level for a Z-score to identify and remove outliers
    df_Z = df[(np.abs(stats.zscore(df)) < level).all(axis=1)]
    ix_keep = df_Z.index

    # 3. Subset the raw dataframe with the indexes you'd like to keep
    df_keep = df.loc[ix_keep]

    return(df_keep)

Исходные данные:

enter image description here

Тестовый прогон 1: Z-счет = 4:

enter image description here

Как видите, данные не были удалены, поскольку уровень был установлен слишком высоко.

Тестовый прогон 2: Z-оценка = 2:

enter image description here

Теперь мы куда-то добираемся. Два выброса были удалены, но все еще остаются некоторые сомнительные данные.

Тестовый прогон 3: Z-оценка = 1,2:

enter image description here

Это выглядит действительно хорошо. Остальные данные теперь распределяются более равномерно, чем раньше. Но теперь точка данных, выделенная исходной точкой данных, начинает выглядеть как потенциальный выброс. Итак, где остановиться? Это будет зависеть от вас!

РЕДАКТИРОВАТЬ: Вот и все для легкого копирования и вставки:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import stats

# your data (as a list)
data = [0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9]

# initial plot
df1 = pd.DataFrame(data = data)
df1.columns = ['data']
df1.plot(style = 'o')

# Function to identify and remove outliers
def outliers(df, level):

    # 1. temporary dataframe
    df = df1.copy(deep = True)

    # 2. Select a level for a Z-score to identify and remove outliers
    df_Z = df[(np.abs(stats.zscore(df)) < level).all(axis=1)]
    ix_keep = df_Z.index

    # 3. Subset the raw dataframe with the indexes you'd like to keep
    df_keep = df.loc[ix_keep]

    return(df_keep)

# remove outliers
level = 1.2
print("df_clean = outliers(df = df1, level = " + str(level)+')')
df_clean = outliers(df = df1, level = level)

# final plot
df_clean.plot(style = 'o')
0 голосов
/ 24 июня 2018

Вы можете сократить значения выше определенного квантиля следующим образом:

import numpy as np
clean_data=np.array(data_points)[(data_points<=np.percentile(data_points, 95))]

В пандах вы используете df.quantile, вы можете найти его здесь

Или вы можете использовать подход Q3 + 1.5 * IQR для устранения выбросов, как вы бы это сделали через коробочный график

...