Фильтрация выбросов из DataFrame - PullRequest
0 голосов
/ 09 июня 2018

У меня большая проблема с фильтрацией моих данных.Я много читал здесь о stackoverflow и других страницах и руководствах, но я не смог решить свою конкретную проблему ... Первая часть моего кода, где я загружаю свои данные в python, выглядит следующим образом:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from arch import arch_model


spotmarket = pd.read_excel("./data/external/Spotmarket_dhp.xlsx", index=True)

r = spotmarket['Price'].pct_change().dropna()

returns = 100 * r
df = pd.DataFrame(returns)

Таблица Excel содержит 43 000 значений в одном столбце и включает почасовые цены.Я использую эти данные для расчета процентного изменения от часа к часу, и проблема в том, что иногда происходят большие изменения между 1000 и 40000%.Фрейм данных выглядит следующим образом:

df
Out[12]: 
              Price
1         20.608229
2         -2.046870
3          6.147789
4         16.519258
             ...
43827    -16.079874
43828     -0.438322
43829    -40.314465
43830   -100.105374
43831    700.000000
43832    -62.500000
43833 -40400.000000
43834      1.240695
43835     52.124183
43836     12.996778
43837    -17.157795
43838    -30.349971
43839      6.177924
43840     45.073701
43841     76.470588
43842      2.363636
43843     -2.161042
43844     -6.444781
43845    -14.877102
43846      6.762918
43847    -38.790036
[43847 rows x 1 columns]

Я хочу исключить эти выбросы.Я пробовал разные способы, такие как вычисление mean и std и исключил все значения, которые + и - в три раза больше std от mean.Он работает для небольшой части данных, но для полных данных среднее значение и стандартное отклонение равны NaN.У кого-нибудь есть идея, как я могу отфильтровать свой фрейм данных?

Ответы [ 2 ]

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

возможно, вам следует сначала отбросить все значения, которые дают эти колебания, а затем создать фрейм данных.Одним из способов является использование filter()

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

Мне кажется, нужен фильтр по процентилям на quantile:

r = spotmarket['Price'].pct_change() * 100

Q1 = r.quantile(.25)
Q3 = r.quantile(.75)
q1 = Q1-1.5*(Q3-Q1)
q3 = Q3+1.5*(Q3-Q1)

df = spotmarket[r.between(q1, q3)]
...