single positional indexer is out-of-bounds

Имею вот такой цикл, который должен посчитать прогноз учитывая к какой группе относиться dataframe, но выдает такую ошибку

import pandas as pd
import matplotlib.pyplot as plt

# Импортирую

excel_file = pd.ExcelFile('example.xlsx')
require_cols = [1]
df = pd.read_excel('example.xlsx', usecols=require_cols)
df_min_max = df.aggregate(['min', 'max'])
my_list = df["Data"].tolist()

# Использую print для проверок

# Считаем данные по уравнению регресси y=141.32x + 2476.8
p = []
x = 20
for i in range(3):  # в range указываем на какой период прогнозируем (3 года)
    y = 141.32 * x + 2476.8
    x = x + 1
    p.append(y)

df_nech = pd.DataFrame(p, columns=['Data1'])
print(df_nech)


def grupb(words):
    AAA = []
    'избавиться от A2-A3; A2-A2; A2-A1; A2-A2 и сделать из него множество Аi'
    try:
        for word in words:
            aaa = (str.split(word, sep=";"))
            for i in aaa:
                otvet = (str.split(i, sep="-"))
                AAA.append(otvet[1])
        return (set(AAA))
    except:
        return ([0])


df2 = df["Data"].tail(3).reset_index()
df_posl_3 = pd.DataFrame(df2)
del df_posl_3['index']

# Меняем кол-во интервалов
bins = 9

df_otreski = pd.cut(df["Data"], bins)

# Сопоставляем данные с интервалами
df["Interval"] = pd.cut(df["Data"], bins,
                        labels=["A" + str(x) for x in range(1, bins + 1)])

# Разбиваем на группы

df["Interval"] = df["Interval"].astype(str)
df.loc[1:, "Groups"] = df.loc[1:, "Interval"] + "-" + df["Interval"].shift().loc[1:]

iv = df["Interval"] = pd.cut(df["Data"], bins, labels=["A" + str(x) for x in range(1, bins + 1)])

res = (df
       .dropna(subset=["Groups"])
       .groupby("Interval")
       .agg(Groups=("Groups", lambda x: ';'.join(x.unique())),
            sred=("Data", "mean")))

res['pari'] = [len(grupb([str(x)])) for x in res['Groups']]
# print(res)
#############################
###############################
###############################


# Цикл по исходным данным
f = []
for i, _ in enumerate(df["Data"]):  # по факту просто цикл от 0 до 21
    A = (df.iloc[i, 1])  # нахожу к какой А отнесли эту строку

    words = (res['Groups'][A])  # нахожу в какую группу входит данные с найденной строки
    summa = 0  # сюда прогноз суммирую
    # print(A, 11111111111, words)
    pari = grupb(str.split(words))
    par = (res['pari'][A])
    for j in pari:  # цикл по всем А из группы

        summa += res['sred'][j]
        # print(res['sred'][j], j)
        prog = summa / par
    f.append(prog)

s = pd.Series(f)
df_p = s.shift(1)
# print(df_p)
# print(prog)
# print((f))

# print(df_nech)

# Цикл по данным полученным с помощью уравнения регресси
f1 = []
for n, _ in enumerate(df_nech["Data1"]):
    A1 = (df_nech.iloc[n, 0])  # нахожу к какой А отнесли эту строку

    words1 = (res['Groups'][A1])
    summa1 = 0  # сюда прогноз суммирую
    print(A1, 11111111111, words1)
    pari1 = grupb(str.split(words1))
    par1 = (res['pari'][A1])
    for j in pari1:  # цикл по всем А из группы
        summa1 += res['sred'][j]
        print(res['sred'][j], j)
        prog1 = summa1 / par1
    f1.append(prog1)
    # print(prog1)
# print(f1)

ошибка

Traceback (most recent call last):
  File "/home/kirill/pythonProject/main.py", line 98, in <module>
    A1 = (df_nech.iloc[n, 1])  # нахожу к какой А отнесли эту строку
  File "/home/kirill/pythonProject/venv/lib/python3.8/site-packages/pandas/core/indexing.py", line 873, in __getitem__
    return self._getitem_tuple(key)
  File "/home/kirill/pythonProject/venv/lib/python3.8/site-packages/pandas/core/indexing.py", line 1443, in _getitem_tuple
    self._has_valid_tuple(tup)
  File "/home/kirill/pythonProject/venv/lib/python3.8/site-packages/pandas/core/indexing.py", line 702, in _has_valid_tuple
    self._validate_key(k, i)
  File "/home/kirill/pythonProject/venv/lib/python3.8/site-packages/pandas/core/indexing.py", line 1352, in _validate_key
    self._validate_integer(key, axis)
  File "/home/kirill/pythonProject/venv/lib/python3.8/site-packages/pandas/core/indexing.py", line 1437, in _validate_integer
    raise IndexError("single positional indexer is out-of-bounds")
IndexError: single positional indexer is out-of-bounds

и dataframe

5303
5444
5585

исходные данные разбитые на интервалы [![исходные][1]][1]

моя данные которые нужно сопоставить с этими интервалами [![мои данные][3]][3]

https://yadi.sk/i/6VU9YzHF_cuJLQ это исходные данные

https://yadi.sk/i/d3rfwSUyiuUA_w это то что получаю на выходе, прогноз который нужно посчитать на sheet2 [1]: https://i.stack.imgur.com/VN52v.png [2]: https://i.stack.imgur.com/pZpt3.png [3]: https://i.stack.imgur.com/tjqy5.png


Ответы (1 шт):

Автор решения: NykSu

теперь на другое ругается raise KeyError(key) from err KeyError: 5303.2 –

Посмотрим на кусок вашего кода:

pari1 = grupb(str.split(words1))
par1 = (res['pari'][A1])
for j in pari1:  # цикл по всем А из группы

    summa1 += res['sred'][j]
    prog1 = summa1 / par1
    

Вот здесь, grupb - ваша функция, поэтому нам не ведомо, что она возвращает. Однако вы part1 используете и как значения и как индексы. В них может быть причина. Еще очень странной кажется строка: par1 = (res['pari'][A1]) - т.е. вы это так set, tuple создаёте? или что? и потом делите на этот set,tuple сумму? Мне вот это несколько странно. Код весь не виден, поэтому сказать точно, что у вас тут происходит - сложно, можно лишь догадываться.

→ Ссылка