【问题标题】:How can I avoid maximum recursion depth?如何避免最大递归深度?
【发布时间】:2020-04-13 08:57:41
【问题描述】:

我第一次尝试使用递归函数,但出现错误“调用 Python 对象时超出了最大递归深度”。

我最初尝试编写 Ahrens 移动平均线。我在另一个平台上找到了它的代码,我正在尝试用 Python 编写它。

这是另一个脚本语言的原始代码:

    IF BarIndex < Period2 THEN
    AFRV2 = Seriesv2
    ELSE
    AFRV2 = AFRV2[1] + ((Seriesv2 - ((AFRV2[1] + AFRV2[Period2]) / 2)) / Period2)

# where [1] is the previous element

这是我的尝试:

def AhrensAverage(TimeSeries, period):
    for index, rows in TimeSeries.iterrows():
        if index < period:
            AFRV2 = rows
        else:
            AFRV2 = AFRV2 + ((rows.iloc[-1] - ((AFRV2 + AhrensAverage(TimeSeries, period)) / 2)) / period)

当使用由一列组成的 DataFrame 调用此函数时,我收到上面的错误消息。 正如您可能知道的那样,我仍在使用 Python 进行学习,我的问题是我是否“正确”地使用了函数递归,还是由于我的代码的其他部分导致的错误?

感谢您的帮助!

这是 DataFrame 的前 30 个元素。

0   114.4050
1   114.9425
2   115.7075
3   114.5175
4   113.4825
5   114.3150
6   115.5950
7   116.0200
8   119.1650
9   129.3700
10  131.8000
11  131.7325
12  130.6075
13  131.0800
14  131.0575
15  131.2150
16  130.4275
17  129.8875
18  130.5400
19  131.1250
20  130.9675
21  130.2025
22  129.8875
23  129.8425
24  129.1225
25  126.4025
26  127.3000
27  128.3350
28  128.2225
29  128.7625

【问题讨论】:

  • 递归调用中问题的大小似乎没有变小。 AhrensAverage(TimeSeries, period) 打电话给AhrensAverage(TimeSeries, period)
  • 一个危险信号如下:当你调用AhrensAverage(TimeSeries, period)时,它在执行else子句时递归调用AhrensAverage(TimeSeries, period)。不可避免地,具有相同参数的相同函数会被无限频繁地调用。
  • 感谢您抽出宝贵时间帮助我!
  • 我误解了原始代码。它不像我想的那样使用递归函数。无论如何,谢谢你。如果其他人正在寻找 Ahrens 移动平均线,我将提供我的代码。

标签: python pandas moving-average


【解决方案1】:

如果其他人正在寻找 Ahrens 移动平均线,这是我的代码:

def AhrensMovingAverage(source, period):
    afr = []
    for index, rows in source.iterrows():
        if index < Period:
            afr.append(rows)
        else:
            afr.append(afr[-1] + ((rows.iloc[-1] - ((afr[-1]+ afr[-Period]) / 2)) / Period))
    return afr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多