Удалить значения, возникающие между большими процентными сдвигами - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть временной ряд df, состоящий из ежедневных пунктов Процентных ставок в столбце A (IR или Процентная ставка) и относительного изменения от одного дня к следующему в столбце B (Rel Shift).

DF выглядит примерно так:

                   IR      Shift
May/30/2019        5.9%    1.67% 
May/29/2019        6%      1.69%      
**May/28/2019      5.9%   -292%**
May/27/2019        20.2%  -1.4%
May/26/2019        20.5%   2.5% 
**May/25/2019      20%     292%** 
May/24/2019        5.1%    -

Моя форма df 4000x2, и эти большие процентные изменения сохраняются на протяжении всего df.Другими словами, ставки резко возрастают, выравниваются, а затем в какой-то момент снова снижаются… или наоборот.Таким образом, в приведенном выше IR значение изменилось на 292%, выровнялось, а затем уменьшилось на 292%

Цель - преобразовать значения, лежащие между скачками выше> 50%, в np.nan, включая дату, когда произошел скачок, - эффективно удаливэти точки данных, чтобы я мог придать им более разумные данные - в диапазоне 5% -6% ....

Так что DF должен выглядеть примерно так:

                    IR      Shift
May/30/2019        5.9%    1.67% 
May/29/2019        6%      1.69%      
May/28/2019        np.nan
May/27/2019        np.nan
May/26/2019        np.nan
May/25/2019        np.nan    
May/24/2019        5.1%    -

Это то, что у меня есть для цикла -

for i in df1:
    if df1['col_B'][i] > .50:
        df1['col_A'][i] = np.nan

1 Ответ

0 голосов
/ 27 сентября 2019

Чтобы иметь некоторую не очищенную область также после «диапазона очистки», я расширил ваш DataFrame на одну строку, поэтому он содержит:

           Day     IR  Shift
0  May/30/2019   5.9%  1.67%
1  May/29/2019     6%  1.69%
2  May/28/2019   5.9%  -292%
3  May/27/2019  20.2%  -1.4%
4  May/26/2019  20.5%   2.5%
5  May/25/2019    20%   292%
6  May/24/2019   5.1%     2%
7  May/23/2019   5.0%      -

А теперь, как решить проблему:

Сначала определите функцию, определяющую начало и конец «диапазона очистки», на основе 2 вспомогательных столбцов, которые вскоре будут созданы:

def detect(row):
    if row.Shft1 < -50:
        detect.retVal = True
    elif row.Shft2 > 50:
        detect.retVal = False
    return detect.retVal

Затем вычислите эти 2 вспомогательных столбца:

df['Shft1'] = df.Shift.apply(lambda x: 0.0 if x == '-' else float(x.rstrip('%')))
df['Shft2'] = df.Shft1.shift(fill_value=0)

Фактические вычисления включают следующий код:

detect.retVal=False
df.IR.mask(df.apply(detect, axis=1), np.nan, inplace=True)

Считывание приведенного выше кода начинается с df.apply(detect, axis=1).Эта инструкция вычисляет маску, указывая строки, в которых значение IR должно быть очищено (заменено на NaN ).

Затем перейдите к самой функции mask.Он применяется к столбцу df.IR, используя только вычисленную маску, таким образом очищая указанные строки.

И последний шаг - удалить оба вспомогательных столбца:

df.drop(columns=['Shft1', 'Shft2'], inplace=True)

В результате получается:

           Day    IR  Shift
0  May/30/2019  5.9%  1.67%
1  May/29/2019    6%  1.69%
2  May/28/2019   NaN  -292%
3  May/27/2019   NaN  -1.4%
4  May/26/2019   NaN   2.5%
5  May/25/2019   NaN   292%
6  May/24/2019  5.1%     2%
7  May/23/2019  5.0%      -
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...