python - 如何使用 pandas/numpy/python 数学库计算平均绝对误差 (MAE) 和平均有符号误差 (MSE)?

标签 python pandas numpy math statistics

我有一个如下所示的数据集。在这个数据集中,有不同颜色的温度计,给定一个“真实”或引用温度,它们根据一些测量方法“方法 1”和“方法 2”测量的差异有多大。
我在计算我需要的两个重要参数时遇到问题 平均绝对误差 (MAE) 和平均有符号误差 (MSE) .我想为每种方法使用非 NaN 值并打印结果。
我能够得到一个点,我可以返回索引和总和的两列系列,但在这种情况下,问题是我需要除以求和的方法值的数量,这取决于那里有多少 NaN排成一排。而且我不想仅仅因为其中有一个 NaN 就跳过一整行。


数字
日期
温度计
真实温度
方法一
方法二


0
1/1/2021
红色的
0.2
0.2
0.5

1
1/1/2021
红色的
0.6
0.6
0.3

2
1/1/2021
红色的
0.4
0.6
0.23

3
1/1/2021
绿色
0.2
0.4
NaN

4
1/1/2021
绿色
1
1
0.23

5
1/1/2021
黄色
0.4
0.4
0.32

6
1/1/2021
黄色
0.1
NaN
0.4

7
1/1/2021
黄色
1.3
0.5
0.54

8
1/1/2021
黄色
1.5
0.5
0.43

9
1/1/2021
黄色
1.5
0.5
0.43

10
1/1/2021
蓝色
0.4
0.3
NaN

11
1/1/2021
蓝色
0.8
0.2
0.11


我的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('default'

data = pd.read_csv('data.txt', index_col=0)
data

data["M1_ABS_Error"]= abs(data["True_Temperature"]-data["Method_1"])
data["M2_ABS_Error"]= abs(data["True_Temperature"]-data["Method_2"])

MAE_Series=data[['Name', 'M1_ABS_Error', 'M2_ABS_Error' ]]
MAE_Series.sum(axis=1, skipna=True)
但是目前输出是这样的,它没有指定它属于哪个颜色温度计,我希望以一种易于将它与它所属的方式关联的方式打印出来。此外,正如我所提到的,这还没有说明如何除以给定行中的值/方法的数量来说明 NaN。 :
0       4.94
1       3.03
2      11.88
3       3.28
4       8.14
5       7.80
6       2.76
7       2.71
我很感激你在这方面的帮助。谢谢!

最佳答案

编辑
我想我现在明白了,如果这是你想要的,请告诉我
梅:

df['MAE'] = df[['M1_ABS_Error','M2_ABS_Error']].mean(axis = 1)
df
产生

    date      Thermometer      True_Temperature    Method_1    Method_2    M1_ABS_Error    M2_ABS_Error    MAE
--  --------  -------------  ------------------  ----------  ----------  --------------  --------------  -----
 0  1/1/2021  red                           0.2         0.2        0.5              0              0.3   0.15
 1  1/1/2021  red                           0.6         0.6        0.3              0              0.3   0.15
 2  1/1/2021  red                           0.4         0.6        0.23             0.2            0.17  0.185
 3  1/1/2021  green                         0.2         0.4      nan                0.2          nan     0.2
 4  1/1/2021  green                         1           1          0.23             0              0.77  0.385
 5  1/1/2021  yellow                        0.4         0.4        0.32             0              0.08  0.04
 6  1/1/2021  yellow                        0.1       nan          0.4            nan              0.3   0.3
 7  1/1/2021  yellow                        1.3         0.5        0.54             0.8            0.76  0.78
 8  1/1/2021  yellow                        1.5         0.5        0.43             1              1.07  1.035
 9  1/1/2021  yellow                        1.5         0.5        0.43             1              1.07  1.035
10  1/1/2021  blue                          0.4         0.3      nan                0.1          nan     0.1
11  1/1/2021  blue                          0.8         0.2        0.11             0.6            0.69  0.645
和 MSE(签名错误)
df["MSE"]= df[['Method_1','Method_2']].mean(axis = 1)- df['True_Temperature']
产生
    date      Thermometer      True_Temperature    Method_1    Method_2    M1_ABS_Error    M2_ABS_Error    MAE     MSE
--  --------  -------------  ------------------  ----------  ----------  --------------  --------------  -----  ------
 0  1/1/2021  red                           0.2         0.2        0.5              0              0.3   0.15    0.15
 1  1/1/2021  red                           0.6         0.6        0.3              0              0.3   0.15   -0.15
 2  1/1/2021  red                           0.4         0.6        0.23             0.2            0.17  0.185   0.015
 3  1/1/2021  green                         0.2         0.4      nan                0.2          nan     0.2     0.2
 4  1/1/2021  green                         1           1          0.23             0              0.77  0.385  -0.385
 5  1/1/2021  yellow                        0.4         0.4        0.32             0              0.08  0.04   -0.04
 6  1/1/2021  yellow                        0.1       nan          0.4            nan              0.3   0.3     0.3
 7  1/1/2021  yellow                        1.3         0.5        0.54             0.8            0.76  0.78   -0.78
 8  1/1/2021  yellow                        1.5         0.5        0.43             1              1.07  1.035  -1.035
 9  1/1/2021  yellow                        1.5         0.5        0.43             1              1.07  1.035  -1.035
10  1/1/2021  blue                          0.4         0.3      nan                0.1          nan     0.1    -0.1
11  1/1/2021  blue                          0.8         0.2        0.11             0.6            0.69  0.645  -0.645
原答案
不完全清楚你想要什么,但在这里有点猜测,这就是你想要的吗?如果您 groupby按颜色和申请 mean到每个组内的`ABS 列
data.groupby('Thermometer', sort = False)[['M1_ABS_Error','M2_ABS_Error']].mean()
你得到这个

        M1_ABS_Error    M2_ABS_Error
Thermometer     
red     0.066667    0.256667
green   0.100000    0.770000
yellow  0.700000    0.656000
blue    0.350000    0.690000
例如,这里左上角的第一个数字 '0.066667 is the average of the M1_ABS_错误column for those Thermometers that are红色`。与其他人相似。在每个颜色/列中跳过 NaN
获得 MSE(这通常意味着均方误差,所以我认为这就是你所追求的)你可以做
import numpy as np
data["M1_Sqr_Error"]= (data["True_Temperature"]-data["Method_1"])**2
data["M2_Sqr_Error"]= (data["True_Temperature"]-data["Method_2"])**2
data.groupby('Thermometer', sort = False)[['M1_Error','M2_Error']].apply(lambda v: np.sqrt(np.mean(v)))
要得到

        M1_Error    M2_Error
Thermometer     
red     0.115470    0.263881
green   0.141421    0.770000
yellow  0.812404    0.769909
blue    0.430116    0.690000

关于python - 如何使用 pandas/numpy/python 数学库计算平均绝对误差 (MAE) 和平均有符号误差 (MSE)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66426928/

相关文章:

python - 遍历 Python 中的列表列表

python - Pygithub - 组织存储库 - 访问拉取请求详细信息

Python:如何将大文本输出格式化为 'prettier' 和用户定义

python - 我如何 'force' python 使用特定版本的模块?

python - 获取字典映射值到引用 ID

python - 按获得的平均值对矩阵进行排序

python - 在 Pandas 中绘制(并保存)多个数据帧中的特定单元格

python - 如何将范围(从两列)分解为行

python - numpy:将 argsort 应用于数组

python - 如何在现有 Excel 工作表下方写入数据框而不丢失数据透视表工作表中的 Excel 切片器?