значение, не входящее в диапазон в цикле for для python

#python #pandas #numpy #alpha-vantage

#python #pandas #numpy #альфа-преимущество

Вопрос:

Я пытаюсь получить линии MACD, MACD signal и MACD difference для цен на акции с учетом определенных входных данных. ниже приведен пользовательский код, который я использую.

 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 неверен, но я не уверен, почему это неправильно.

Комментарии:

1. Похоже, что это не полный текст ошибки — можете ли вы отредактировать свой пост, чтобы включить полный текст ошибки и трассировки?

2. Похоже short_ema , и long_ema являются экземплярами класса, который переопределяет оператор индексации, и это исключение исходит оттуда. Если бы они были обычными списками, вы бы получили IndexError , а не ValueError .

3. Но основная проблема, похоже, заключается в том, что index она находится за пределами допустимого диапазона для одного из них.

4. Barmar, short_ema и long_ema — это массив значений ema, которые мне нужно вычесть, чтобы получить MACD

Ответ №1:

Проблема, похоже, в том, что короткие и длинные массивы ema / sma в начале находятся в фреймах данных pandas. Чтобы правильно их проиндексировать , вам необходимо использовать .функция iloc. Однако это плохо работает, когда вы используете циклы, поскольку вам нужно преобразовать в массивы numpy, а затем цикл должен работать по назначению.