Python 计算四舍五入的比例列表

Python 计算四舍五入的比例列表,python,numpy,math,scipy,finance,Python,Numpy,Math,Scipy,Finance,所需: [10,20,-30] -> [1,2,-3] [19,-14,15] -> [2,-1,2] [-1.09,-0.92,0.02] -> [-109,-92,2] [501.6545,-1857.1,897.543] -> [5,-19,9] 每个输入集中最接近零的数字应该是输出中的一位数字。比例必须保持近似恒定,舍入误差可接受 背景:使用尽可能小的订单,将要购买的证券数量从一个模型转换为100个整数 我可以用一种非pythonic的方式强制执行此操作,但我正

所需:

[10,20,-30] -> [1,2,-3]
[19,-14,15] -> [2,-1,2]
[-1.09,-0.92,0.02] -> [-109,-92,2]
[501.6545,-1857.1,897.543] -> [5,-19,9]
每个输入集中最接近零的数字应该是输出中的一位数字。比例必须保持近似恒定,舍入误差可接受

背景:使用尽可能小的订单,将要购买的证券数量从一个模型转换为100个整数


我可以用一种非pythonic的方式强制执行此操作,但我正在寻找Python函数上的指针。我的背景是Java。

在Python中,您将使用
numpy
进行此类计算。我建议采用如下算法:

def process(array):
    order_of_magnitude = np.floor(np.log10(np.min(np.abs(array))))
    return np.round(array*10**(-order_of_magnitude))
array = np.array(your_list)
说明:

  • 查找数组中最小元素的数量级(不考虑符号)
  • 按此比例缩放每个元素(或向上)
  • 四舍五入
  • 为此,您需要安装
    numpy
    。例如,使用
    pip
    或通过linux发行版

    将列表转换为numpy数组,如下所示:

    def process(array):
        order_of_magnitude = np.floor(np.log10(np.min(np.abs(array))))
        return np.round(array*10**(-order_of_magnitude))
    
    array = np.array(your_list)
    

    忽略您的示例,我实现了需求

    每个输入集中最接近零的数字应该是输出中的一位数字。比例必须保持近似恒定,舍入误差可接受

    该算法通过最接近零的值的绝对值对数据进行标准化,并将结果乘以9以保持最小的数字1,从而将后续舍入误差降至最低

    def normalize(l):
        import numpy as np
        m = np.min(np.abs(l))
        return np.round(l / m * 9).astype(int)
    

    以下是基于@user8408080答案的正确答案

    import numpy as np
    def process(array):
        order_of_magnitude = np.floor(np.log10(np.min(np.abs(array)))).astype(int).item()
        return np.round(np.asarray(array)*10**(-order_of_magnitude)).astype(int)
    

    “一位数”始终为1是否可以接受?那么你应该能够很容易地解决这个问题。@JanChristofterasa最小的数字不能是1,因为比例会发生剧烈的变化,输出必须是整数。它不应该是
    [-1.09,-0.92,-0.02]->[-109,-92,-2]
    ?@user8408080这个代码可以回答这个问题,提供有关此代码为什么和/或如何回答此问题的其他上下文可以提高其长期价值。我不确定为什么乘以9,但它会产生错误的结果。删除9会使比例最小为1,正如您在评论中所建议的那样,但也会产生不正确的结果。您用于生成示例的算法会产生巨大错误,只需检查
    [19,-14,15]
    ,就会产生
    [2,-1,2]
    。这将产生更好的结果。无论哪种方式都会产生巨大的错误。你的例子是书面收益率[9 18-27][9-9 9][490-414 9][9-33 16]如果不乘以9,我们得到的[12-3][1-11][54-46 1][1-4 2]都是错误的。这正是我们首先乘以9的原因,为了最大限度地减少错误,我在一个满足要求的新答案中发布了基于您的代码。Python拒绝将数组提升为浮点指数,因此我将其转换为nparray。我还将答案转换为整数。谢谢你的帮助,我永远也想不到Pythonic解决方案。@KevinRethwisch这很有趣,因为我没有收到任何关于将数组rasing为浮点指数的警告。您使用的是哪个numpy和python版本?不管怎样,我很高兴能帮上忙!这很奇怪,因为指数可以是十进制数。以下是我的版本:Python 2.7.16 Numpy 1.16。2@KevinRethwisch哦,这些都是相当古老的版本。我强烈建议您不要再使用Python2了,尤其是因为您似乎是Python初学者。由于向后兼容的原因,该软件不再受支持,仅安装在某些Linux发行版上。例如,当您在终端中执行
    python
    时,它可能会让基于Debian的系统非常恼火,这些系统调用python2。在这种情况下,只需键入
    python3
    ,就可以使用受支持的python版本。另外,如果您使用的是pip,那么——在这些发行版上——您必须使用
    pip3
    。顺便说一句,我使用的是Arch