需要帮助改进此Python函数以确定平均绝对偏差(MAD)

需要帮助改进此Python函数以确定平均绝对偏差(MAD),python,function,Python,Function,我正在尝试构建我自己的纯Python函数来确定平均绝对偏差,并希望获得一些关于如何增强此代码的建议。如上所述,它目前被限制为四个值,但我希望能够让函数接受任意数量的值。提前谢谢 def what_is_mad(list_of_nums): xbar = what_is_mean(list_of_nums) for num in list_of_nums: value1 = list_of_nums[0] value2 = list_of_nums[

我正在尝试构建我自己的纯Python函数来确定平均绝对偏差,并希望获得一些关于如何增强此代码的建议。如上所述,它目前被限制为四个值,但我希望能够让函数接受任意数量的值。提前谢谢

def what_is_mad(list_of_nums):
    xbar = what_is_mean(list_of_nums)
    for num in list_of_nums:
        value1 = list_of_nums[0]
        value2 = list_of_nums[1]
        value3 = list_of_nums[2]
        value4 = list_of_nums[3]
        test = abs(value1 - xbar) + abs(value2 - xbar) + abs(value3 - xbar) + abs(value4 - xbar)
        mad = test / xbar
    return int(mad)

what_is_mad(2, 2, 4, 4)

这将循环遍历列表,每次汇总一个绝对偏差,然后进行mad计算。

对于优化的解决方案,有一种方法可以实现这一点

xbar = mean(list_of_nums)
test=0
for num in list of nums:
    test = test + abs(num - xbar)
mad = test/xbar
return int(mad)

这可以使用python内置的求和操作和列表理解在几行代码中完成

mad_in = [1,2,3,4...]

mad_out = pandas.Series(mad_in).mad()

您的代码中计算平均绝对偏差的公式是错误的。您应该计算所有绝对偏差,将它们相加,然后除以总和列表中元素的数量,而不是平均值。如果您是说纯python不使用任何库,那么这段代码就可以了

def what_is_mad(*list_of_nums):
    count = len(list_of_nums)
    mean = sum(list_of_nums) / count
    mad = sum((abs(num - mean) for num in list_of_nums)) / count
    return mad
您可以使用列表理解并用更少的行数编写代码。但它会创建另一个列表,这将占用存储空间,因此不会进行优化


否则,你可以使用numpy、scipy或pandas,它们有内置函数来计算MAD

for循环不是每次都计算相同的值吗?为什么要费心处理循环,然后硬编码这些值呢?OP说他们在构建一个纯python函数。有没有想过熊猫函数是C加速的?我知道一些pandas是。我不确定,但我想这可能是出于他们纯粹的Python函数想法。我在运行建议的代码时收到了这个错误。我想这和之前的一个函数有关,这个函数是用来确定平均值的,我现在用这个函数来确定MAD。如果这有道理的话。该错误是零除错误。@Tweep,您的错误没有通过,但您肯定可以使用均值函数。我只是用速记写的,因为你的公式是错误的,所以你得到的除法误差为零。你不是创建了一个额外的列表来保存abs偏差值吗?这只是浪费空间。您可以使用简单的for循环并节省空间。@GayalKuruppu我编辑过以删除列表,现在使用生成器避免在内存中创建列表。虽然OP担心效率,但我认为他们会使用第三方库,这比在python列表上操作效率更高。nums列表前面的*是什么?它允许您将任意数量的位置参数传递给What_is_mad,以便您可以按照您在问题中指定的方式调用它,即。what_是_mad2,2,4,4,而不是传递一个列表或元组what_是_mad2,2,4,4。有关详细信息,请参阅。@jodag您正在调用一个数字列表,并希望它是*args。如果他有成千上万的输入,他将如何传递*args?最简单的方法是列出一个清单。你不是把事情复杂化了吗?Gayal,你的意思是写mad=dev/lenlist\u of\u summes,因为在这个代码块的任何地方都没有定义测试。@Tweep现在就试试吧。谢谢你,盖尔@GayalKuruppu你对列表理解不正确。你应该仔细阅读生成器表达式。生成器表达式不需要额外的空间。@jodag我没有说任何关于生成器表达式的内容,只说了您当时在代码中使用的列表理解,而不是生成器表达式。
xbar = sum(list_of_nums)/len(list_of_nums)
dev = 0
for num in list_of_nums:
    dev = dev + abs(num - xbar)
mad = dev/len(list_of_nums)
print(mad)