【问题标题】:MAD results differ in pandas, scipy, and numpy在 pandas、scipy 和 numpy 中,MAD 结果不同
【发布时间】:2020-05-22 08:41:17
【问题描述】:

我想计算由

定义的MAD (median absolute deviation)
MAD = median(|x_i - mean(x)|)

获取号码列表x

x = list(range(0, 10)) + [1000]

但是,使用numpypandas 和手工实现的结果存在显着差异:

from scipy import stats
import pandas as pd
import numpy as np

print(stats.median_absolute_deviation(x, scale=1)) # prints 3.0

print(pd.Series(x).mad()) # prints 164.54

print(np.median(np.absolute(x - np.mean(x)))) # prints 91.0

怎么了?

【问题讨论】:

  • pd.Series().mad() 为您提供平均绝对偏差,而不是您期望的中值绝对偏差。
  • 哦该死的。 :) 其他人呢?
  • scipy.stats 的实现是正确的。您的手工实现需要根据 Mykola 的回答进行更改。
  • 最后一个应该是np.median(np.absolute(x - np.median(x)))。而且第一个公式也是错误的。

标签: python pandas numpy scipy


【解决方案1】:

中值绝对偏差定义为:

median(|x_i - median(x)|

Pandas 中的 mad 方法返回平均绝对偏差。

测试:

x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1000]

stats.median_absolute_deviation(x, scale=1)
# 3.0

np.median(np.absolute(x - np.median(x)))
# 3.0

x = pd.Series(x)
(x - x.median()).abs().median()
# 3.0

【讨论】:

  • 感谢您的回答。你是对的,虽然我认为命名有点令人困惑(至少对我来说)。 scipy 呢?
  • Scipy 必须没问题。
【解决方案2】:

在 pandas 中,MAD 实际上是“均值绝对偏差”而不是“中值绝对偏差”。

您可以在此处找到 pandas 中使用的公式:https://www.skytowner.com/explore/pandas_dataframe_mad_method

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 2018-11-05
    • 2015-09-14
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2020-06-08
    • 2013-01-19
    • 2016-07-05
    相关资源
    最近更新 更多