【问题标题】:value not in range in for loop for pythonpython的for循环中的值不在范围内
【发布时间】:2020-11-25 05:21:15
【问题描述】:

在给定特定输入的情况下,我正在尝试获取股票价格的 MACD、MACD 信号和 MACD 差异线。下面是我正在使用的自定义代码。

def create_MACD(long_term,short_term,dataframe,signal_ema_length):
    
    
    #obtain the SMA data that we need to obtain the MACD ema values
    short_sma = create_sma(short_term,dataframe)
    long_sma = create_sma(long_term,dataframe)

    #create the EMAs that will be subtracted to obtain the MACD line
    short_ema = create_ema(short_term,2,dataframe)
    long_ema = create_ema(long_term,2,dataframe)
    
    #calculate length of MACD array and starting indicies for line and signal
    length = len(dataframe)
    
    
    #calculate the starting index of the line 
    start_line = long_term
    
    #calculate the starting index of the signal line
    start_signal = long_term+signal_ema_length
    
    #create the smoothing variables for the signal line
    smoothing = 2/(signal_ema_length+1)
    smoothing_minus = 1-smoothing
    
    #calculate number of iterations for macd and macd signal
    num_iters_macd = len(dataframe)-long_term
    num_iters_signal = num_iters_macd - signal_ema_length
    
    #create the MACD dataframe change dataframe to array for iterations
    macd = np.zeros(length)
    macd_signal = np.zeros(length)
    array = dataframe.to_numpy()
    
    
    #for loop for MACD data
    for i in range(num_iters_macd):
        index = start_line+i
        macd[index] = short_ema[index]-long_ema[index]
        
    #for loop for MACD signal
    for i in range(num_iters_signal):
        index = start_signal+i
        macd_signal[index] = macd[index]*smoothing + macd_signal[index-1]*smoothing_minus
        
    #create sma of first X days of MACD
    sma_MACD = sum(macd[:signal_ema_length])/signal_ema_length
    
    #insert the first value into the MACD signal array 
    macd_signal[start_signal-1] = macd[start_signal-1]*smoothing +sma_MACD*smoothing_minus
    
    #create array for MACD difference
    macd_diff = np.zeros(length)
    
    #create starting index for MACD difference
    start_diff = start_signal
    num_iters_diff = num_iters_signal
    for i in range(num_iters_diff):
        index = i+start_diff
        macd_diff[index] = macd[index]-macd_signal[index]
    
    #send all array's to pandas dataframe
    MACD_line = pd.DataFrame(data=macd)
    MACD_signal = pd.DataFrame(data=macd_signal)
    MACD_difference = pd.DataFrame(data=macd_diff)

    return MACD_line, MACD_signal, MACD_difference


macd_av,signal_av,diff_av = create_MACD(26,12,price,9)


我得到的错误是

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
    354                 try:
--> 355                     return self._range.index(new_key)
    356                 except ValueError as err:

ValueError: 26 is not in range

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
<ipython-input-20-a1e7f9a89bbb> in <module>
----> 1 macd_av,signal_av,diff_av = create_MACD(26,12,price,9)

<ipython-input-19-78834be35c60> in create_MACD(long_term, short_term, dataframe, signal_ema_length)
     35     for i in range(num_iters_macd):
     36         index = start_line+i
---> 37         macd[index] = short_ema[index]-long_ema[index]
     38 
     39     #for loop for MACD signal

~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2900             if self.columns.nlevels > 1:
   2901                 return self._getitem_multilevel(key)
-> 2902             indexer = self.columns.get_loc(key)
   2903             if is_integer(indexer):
   2904                 indexer = [indexer]

~/opt/anaconda3/envs/tensorflow/lib/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
    355                     return self._range.index(new_key)
    356                 except ValueError as err:
--> 357                     raise KeyError(key) from err
    358             raise KeyError(key)
    359         return super().get_loc(key, method=method, tolerance=tolerance)

KeyError: 26

我已经测试了自定义 SMA 和 EMA 函数,因此它们可以输出正确的数组。我知道这个错误意味着我的 for 循环范围不正确,但我不确定为什么这是错误的。

【问题讨论】:

  • 看起来这不是错误的全文 - 您可以编辑您的帖子以包含错误的全文和回溯吗?
  • 看起来short_emalong_ema 是重新定义索引运算符的类的实例,而这个异常来自那里。如果它们是普通列表,你会得到IndexError,而不是ValueError
  • 但基本问题似乎是index 超出了其中一个的有效范围。
  • Barmar、short_ema 和 long_ema 是我需要减去以获得 MACD 的 ema 值的数组

标签: python pandas numpy alpha-vantage


【解决方案1】:

问题似乎是开头的短和长 ema/sma 数组在 pandas 数据帧中。要正确索引这些,您需要使用 .iloc 函数。但是,当您使用循环时,这并不能很好地工作,因为您需要转换为 numpy 数组,然后循环应该按预期工作。

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 2013-07-15
    • 2023-03-18
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多