Удаление значений, обусловленных большими значениями другого столбца - PullRequest
0 голосов
/ 27 сентября 2019

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

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

                   IR      Shift
May/24/2019        5.9%    - 
May/25/2019        6%      1.67%      
May/26/2019        5.9%    -1.67
May/27/2019        20.2%   292%
May/28/2019        20.5%   1.4% 
May/29/2019        20%    -1.6% 
May/30/2019        5.1%   -292%
May/31/2019        5.1%     0%

Я хотел бы удалить все значения в столбце A, которые происходят между большими относительными сдвигами,> +/- 50%.

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

                      IR      Shift
May/24/2019        5.9%    - 
May/25/2019        6%       1.67%      
May/26/2019        5.9%    -1.67
May/27/2019        np.nan   292%
May/28/2019        np.nan   1.4% 
May/29/2019        np.nan  -1.6% 
May/30/2019        5.1%    -292%
May/31/2019        5.1%      0%

Это то, к чему я так далеко ... я был бы признателен за помощь

 for i, j in df1.iterrows():
      if df1['Shift'][i] > .50 :
          x = df1['IR'][i]
      if df1['Shift'][j] < -.50 :
          y = df1['IR'][j]
      df1['IR'] = np.where(df1['Shift'].between(x,y), df1['Shift'], 
      np.nan)                                                                                                                                  

Ошибка ValueError: Значение истинности Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Ответы [ 3 ]

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

Вы также можете np.where функционировать от numpy следующим образом:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Date':[datetime(2019,5,24), datetime(2019,5,25), datetime(2019,5,26), datetime(2019,5,27), datetime(2019,5,28),datetime(2019,5,29),datetime(2019,5,30)], 'IR':[0.059,0.06,0.059,0.202, 0.205, 0.2, 0.051], Shift':[pd.np.nan, 0.0167, -0.0167, 2.92, 0.014, -0.016, -2.92]})                                                                                                                                                                                                       

df['IR'] = np.where(df['Shift'].between(df['Shift']*0.5, df['Shift']*1.5), df['Shift'], np.nan)                                                                                                                                  

In [8]: df                                                                                                                                                                                                                               
Out[8]: 
        Date      IR   Shift
0 2019-05-24     NaN     NaN
1 2019-05-25  0.0167  0.0167
2 2019-05-26     NaN -0.0167
3 2019-05-27  2.9200  2.9200
4 2019-05-28  0.0140  0.0140
5 2019-05-29     NaN -0.0160
6 2019-05-30     NaN -2.9200

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

Использование df.at для доступа к одному значению для пары меток строки / столбца.

import numpy as np
import pandas as pd
from datetime import datetime

df = pd.DataFrame({'Date':[datetime(2019,5,24), datetime(2019,5,25), datetime(2019,5,26), datetime(2019,5,27), datetime(2019,5,28),datetime(2019,5,29),datetime(2019,5,30),datetime(2019,5,31)], 'IR':[5.9,6,5.9,20.2, 20.5, 20, 5.1, 5.1], 'Shift':[pd.np.nan, 1.67, -1.67, 292, 1.4, -1.6, -292, 0]})

print("DataFrame Before :")
print(df)

count = 1
while (count < len(df.index)):
    if (abs(df.at[count-1, 'Shift'] - df.at[count, 'Shift']) >= 50):
        df.at[count, 'IR'] = np.nan
    count = count + 1

print("DataFrame After :")
print(df)

Вывод программы:

DataFrame Before :
        Date    IR   Shift
0 2019-05-24   5.9     NaN
1 2019-05-25   6.0    1.67
2 2019-05-26   5.9   -1.67
3 2019-05-27  20.2  292.00
4 2019-05-28  20.5    1.40
5 2019-05-29  20.0   -1.60
6 2019-05-30   5.1 -292.00
7 2019-05-31   5.1    0.00

DataFrame After :
        Date    IR   Shift
0 2019-05-24   5.9     NaN
1 2019-05-25   6.0    1.67
2 2019-05-26   5.9   -1.67
3 2019-05-27   NaN  292.00
4 2019-05-28   NaN    1.40
5 2019-05-29  20.0   -1.60
6 2019-05-30   NaN -292.00
7 2019-05-31   NaN    0.00
0 голосов
/ 27 сентября 2019

Вот попытка.Могут быть и более «правильные» способы сделать это, но я не знаком со всеми встроенными функциями панд.

df = pd.DataFrame({'Date':[datetime(2019,5,24), datetime(2019,5,25), datetime(2019,5,26), datetime(2019,5,27), datetime(2019,5,28),datetime(2019,5,29),datetime(2019,5,30)], 'IR':[0.059,0.06,0.059,0.202, 0.205, 0.2, 0.051], 'Shift':[pd.np.nan, 0.0167, -0.0167, 2.92, 0.014, -0.016, -2.92]})

>>>df
        Date     IR   Shift
0 2019-05-24  0.059     NaN
1 2019-05-25  0.060  0.0167
2 2019-05-26  0.059 -0.0167
3 2019-05-27  0.202  2.9200
4 2019-05-28  0.205  0.0140
5 2019-05-29  0.200 -0.0160
6 2019-05-30  0.051 -2.9200

df['IR'] = [pd.np.nan if abs(y-z) > 0.5 else x for x, y, z in zip(df['IR'], df['Shift'], df['Shift'].shift(1))]
>>>df
        Date     IR   Shift
0 2019-05-24  0.059     NaN
1 2019-05-25  0.060  0.0167
2 2019-05-26  0.059 -0.0167
3 2019-05-27    NaN  2.9200
4 2019-05-28    NaN  0.0140
5 2019-05-29  0.200 -0.0160
6 2019-05-30    NaN -2.9200
...