Процесс деления с условием избегания бесконечных питонов панд

У меня есть вопрос о том, как я решаю эту проблему. Этот код в основном:

x3 = (x2-x1)/x1

где x1 - значения дня d, где x2 - значение дня d+1, а x3 - значение, которое я вычисляю на основе предыдущих значений

Когда случается, что мое деление выглядит примерно так: (0,5-0)/0, как это происходит со днем ​​2017-09-010 и POS_16_20_и 2017-09-011, например, оно будет бесконечным. Я хотел бы использовать условие с моим делением, что если значение, которое я делю, равно нулю, тогда установите x3=x2, потому что я не хочу бесконечных значений

Я хотел бы заменить его своим последним значением.

Код:

waps_df2 =  waps_df1-waps_df1.shift(1)
waps_df2 = waps_df2.fillna(0)
waps_x = waps_df2.div(waps_df1.shift(1))
waps_ad = waps_x.add(1)
waps_x3 = waps_ad.shift(+1)

Мой фрейм даты:

produktname  POS_00_04  POS_04_08  POS_08_12  POS_12_16  POS_16_20  POS_20_24  
datum_von                                                                      
2017-09-09         0.0        0.0        0.0        0.0       0.00        0.0  
2017-09-10         0.0        0.0        0.0        0.0       0.00        0.0  
2017-09-11         0.0        0.0        0.0        0.0       0.05        0.0  
2017-09-12         0.0        0.0        0.0        0.0       0.06        0.0  
2017-09-13         0.0        0.0        0.0        0.0       0.00        0.0 

Я пытался использовать маски

waps_pos = waps_pos.mask((waps_df1!=0), waps_pos.div(waps_df1.shift(1))

waps_x = np.where(waps_df1.shift(1)>0, waps_pos.div(waps_df1.shift(1), waps_df1)

или же

waps_x = np.where(waps_df1.shift(1)>0, waps_pos.div(waps_df1.shift(1), waps_df1)

1 ответ

Решение
waps_df2 = waps_df1.sub(waps_df1.shift(1)).fillna(0)
print (waps_df2)
            POS_00_04  POS_04_08  POS_08_12  POS_12_16  POS_16_20  POS_20_24
datum_von                                                                   
2017-09-09        0.0        0.0        0.0        0.0       0.00        0.0
2017-09-10        0.0        0.0        0.0        0.0       0.00        0.0
2017-09-11        0.0        0.0        0.0        0.0       0.05        0.0
2017-09-12        0.0        0.0        0.0        0.0       0.01        0.0
2017-09-13        0.0        0.0        0.0        0.0      -0.06        0.0

waps_x = waps_df2.div(waps_df1.shift(1))
print (waps_x)
            POS_00_04  POS_04_08  POS_08_12  POS_12_16  POS_16_20  POS_20_24
datum_von                                                                   
2017-09-09        NaN        NaN        NaN        NaN        NaN        NaN
2017-09-10        NaN        NaN        NaN        NaN        NaN        NaN
2017-09-11        NaN        NaN        NaN        NaN        inf        NaN
2017-09-12        NaN        NaN        NaN        NaN   0.200000        NaN
2017-09-13        NaN        NaN        NaN        NaN  -1.000000        NaN

Вы можете проверить значения инф numpy.isinf и заменить их на waps_df1 от mask:

print (np.isinf(waps_x))
            POS_00_04  POS_04_08  POS_08_12  POS_12_16  POS_16_20  POS_20_24
datum_von                                                                   
2017-09-09      False      False      False      False      False      False
2017-09-10      False      False      False      False      False      False
2017-09-11      False      False      False      False       True      False
2017-09-12      False      False      False      False      False      False
2017-09-13      False      False      False      False      False      False

waps_x = waps_x.mask(np.isinf(waps_x), waps_df1)
print (waps_x)
            POS_00_04  POS_04_08  POS_08_12  POS_12_16  POS_16_20  POS_20_24
datum_von                                                                   
2017-09-09        NaN        NaN        NaN        NaN        NaN        NaN
2017-09-10        NaN        NaN        NaN        NaN        NaN        NaN
2017-09-11        NaN        NaN        NaN        NaN       0.05        NaN
2017-09-12        NaN        NaN        NaN        NaN       0.20        NaN
2017-09-13        NaN        NaN        NaN        NaN      -1.00        NaN
Другие вопросы по тегам