Jos*_*omo 6 python math statistics numpy pandas
我有一个如下所示的数据集。在此数据集中,有不同颜色的温度计,并且给定“真实”温度或参考温度,它们根据某些测量方法“方法 1”和“方法 2”测量的结果有多么不同。
我在计算所需的两个重要参数时遇到困难,即平均绝对误差(MAE)和平均符号误差(MSE)。我想为每个方法使用非 NaN 值并打印结果。
我能够达到可以返回索引和总和的两列系列的程度,但这种情况下的问题是我需要除以求和的方法值的数量,该数量根据有多少个 NaN 而变化是连续的。我不想仅仅因为其中有 NaN 就跳过整行。
| 数字 | 日期 | 温度计 | 真实温度 | 方法一 | 方法二 |
|---|---|---|---|---|---|
| 0 | 2021 年 1 月 1 日 | 红色的 | 0.2 | 0.2 | 0.5 |
| 1 | 2021 年 1 月 1 日 | 红色的 | 0.6 | 0.6 | 0.3 |
| 2 | 2021 年 1 月 1 日 | 红色的 | 0.4 | 0.6 | 0.23 |
| 3 | 2021 年 1 月 1 日 | 绿色的 | 0.2 | 0.4 | 南 |
| 4 | 2021 年 1 月 1 日 | 绿色的 | 1 | 1 | 0.23 |
| 5 | 2021 年 1 月 1 日 | 黄色的 | 0.4 | 0.4 | 0.32 |
| 6 | 2021 年 1 月 1 日 | 黄色的 | 0.1 | 南 | 0.4 |
| 7 | 2021 年 1 月 1 日 | 黄色的 | 1.3 | 0.5 | 0.54 |
| 8 | 2021 年 1 月 1 日 | 黄色的 | 1.5 | 0.5 | 0.43 |
| 9 | 2021 年 1 月 1 日 | 黄色的 | 1.5 | 0.5 | 0.43 |
| 10 | 2021 年 1 月 1 日 | 蓝色的 | 0.4 | 0.3 | 南 |
| 11 | 2021 年 1 月 1 日 | 蓝色的 | 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)
Run Code Online (Sandbox Code Playgroud)
但目前的输出是这样的,它没有指定它属于哪个色温计,我希望它以一种易于将其与其所属的方式关联起来的方式打印出来。另外,正如我所提到的,这还没有说明如何除以给定行中的值/方法的数量来计算 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
Run Code Online (Sandbox Code Playgroud)
我将不胜感激你对此的帮助。谢谢!
我想我现在明白了,请告诉我这是否是您想要的
梅:
df['MAE'] = df[['M1_ABS_Error','M2_ABS_Error']].mean(axis = 1)
df
Run Code Online (Sandbox Code Playgroud)
产生
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
Run Code Online (Sandbox Code Playgroud)
对于 MSE(有符号错误)
df["MSE"]= df[['Method_1','Method_2']].mean(axis = 1)- df['True_Temperature']
Run Code Online (Sandbox Code Playgroud)
产生
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
Run Code Online (Sandbox Code Playgroud)
目前还不完全清楚你想要什么,但这里有点猜测,这就是你想要的吗?如果您groupby按颜色并应用于mean每个组内的`ABS 列
data.groupby('Thermometer', sort = False)[['M1_ABS_Error','M2_ABS_Error']].mean()
Run Code Online (Sandbox Code Playgroud)
你明白了
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
Run Code Online (Sandbox Code Playgroud)
is the average of the这里以左上角第一个数字‘0.066667 M1_ABS_Error red’为例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)))
Run Code Online (Sandbox Code Playgroud)
要得到
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
Run Code Online (Sandbox Code Playgroud)