Как правильно написал @filbranden в своем комментарии - когда любое из ваших реальных значений равно нулю, ваш код возвращает inf
из-за нулевого деления. Взгляните на мой простой тест с различными реальными и прогнозируемыми значениями для вычисления MAPE. Вот pandas.DataFrame
с именем data
:
data = pd.DataFrame(
{
'real_1': [100, 100, 100, 100, 100],
'real_2': [100, 100, 100, 100, pd.np.nan],
'real_3': [100, 100, 100, 100, 0],
'pred_1': [110, 130, 120, 105, 100],
'pred_2': [110, 130, 120, pd.np.nan, 100],
'pred_3': [110, 130, 120, 105, pd.np.nan],
}
)
print(data)
real_1 real_2 real_3 pred_1 pred_2 pred_3
0 100 100.0 100 110 110.0 110.0
1 100 100.0 100 130 130.0 130.0
2 100 100.0 100 120 120.0 120.0
3 100 100.0 100 105 NaN 105.0
4 100 NaN 0 100 100.0 NaN
Я использовал вашу MAPE(a, b)
функцию для вычисления MAPE.
for real_val_col in ['real_1', 'real_2', 'real_3']:
for pred_val_col in ['pred_1', 'pred_2', 'pred_3']:
real_val = data[real_val_col]
pred_val = data[pred_val_col]
print(f'- MAPE for {real_val_col} and {pred_val_col}: {MAPE(real_val, pred_val):.2f} %')
А вот и результат теста. Вы можете видеть, что MAPE равен inf
во всех случаях, когда программе приходилось делить не пропущенное значение на ноль.
- MAPE for real_1 and pred_1: 13.00 %
- MAPE for real_1 and pred_2: 15.00 %
- MAPE for real_1 and pred_3: 16.25 %
- MAPE for real_2 and pred_1: 16.25 %
- MAPE for real_2 and pred_2: 20.00 %
- MAPE for real_2 and pred_3: 16.25 %
- MAPE for real_3 and pred_1: inf %
- MAPE for real_3 and pred_2: inf %
- MAPE for real_3 and pred_3: 16.25 %