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 шт):
теперь на другое ругается 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 сумму? Мне вот это несколько странно. Код весь не виден, поэтому сказать точно, что у вас тут происходит - сложно, можно лишь догадываться.