Векторизация, удаление выбросов с помощью панд - PullRequest
0 голосов
/ 04 июля 2018

Каждый столбец (c) в кадре данных содержит временные ряды значений, которые содержат некоторые экстремальные выбросы, цель которых состоит в том, чтобы удалить их и заменить их на ранее увиденное значение.

Приведенный ниже код отлично работает для этой цели, но он очень медленный, так как мне нужно выполнить эту операцию для 7 отдельных столбцов и 59 кадров данных. Есть ли способ векторизовать эту операцию или ускорить ее другим способом?

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

for c in df.columns:
    if c == "date":
        continue
    for i in range(len(dfn)):
        if dfn[c].iloc[i] > 5*np.mean(dfn[c]):
            dfn[c].iloc[i] = dfn[c].iloc[i-1]
    end_df = end_df.append(dfn)

Пример ввода замены удаления выброса:

[10, 28, 39, 48193, 14]

Пример вывода замены удаления выброса:

[10, 28, 39, 39, 14]

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете отфильтровать ваш фрейм данных по желаемому условию (в этом случае оно будет в 5 раз больше среднего) и заменить на nan. Затем вы можете использовать встроенную pandas функцию fillna для замены предыдущим видимым значением.

Ваш код будет

import numpy as np

for c in df.columns:
    if c == "date":
        continue
    df.loc[df[c] > 5 * df[c].mean(), c] = np.nan
    df[c].fillna(method='ffill', inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...