Неправильное значение интерполяции при больших количествах точек
У меня есть датасет с значениями цены биткоина с 01.01.2021 до 01.04.2021 с шагом в один день. Регулярными выражениями обрабатываю данные, чтоб python мог с ними работать.
def data_clean(path):
crypto = pd.read_csv(path)
crypto['Цена'] = crypto['Цена'].str.replace(r'\.', '', regex=True).str.replace(r'\,', '.', regex=True)
crypto['Откр.'] = crypto['Откр.'].str.replace(r'\.', '', regex=True).str.replace(r'\,', '.', regex=True)
crypto['Макс.'] = crypto['Макс.'].str.replace(r'\.', '', regex=True).str.replace(r'\,', '.', regex=True)
crypto['Мин.'] = crypto['Мин.'].str.replace(r'\.', '', regex=True).str.replace(r'\,', '.', regex=True)
crypto['Дата'] = crypto['Дата'].str.replace(r'\.', '-', regex=True)
crypto['Макс.'] = pd.to_numeric(crypto['Макс.'])
crypto['Мин.'] = pd.to_numeric(crypto['Мин.'])
crypto['Цена'] = pd.to_numeric(crypto['Цена'])
crypto['Откр.'] = pd.to_numeric(crypto['Откр.'])
return crypto
И записываю данный DataFrame в переменную
btc = data_clean('./btc-data.csv')
Я хочу узнать значение цены биткоина в середине 7 дня. Для этого я использую интерполяционный полином Лагранжа.
def lagranzh(crypto, point):
answer = 0
x = [i for i in range(len(crypto['Дата'].tolist()))] #Номер дня(0 - 01.01.2021, 1 - 02.01.2021 и т.д.)
y = [i for i in crypto['Цена'].tolist()]
for j in range(len(x)):
numenator = 1
denominator = 1
for i in range(len(x)):
if i != j:
numenator *= (point - x[i])
denominator *= (x[j] - x[i])
answer += y[j] * numenator / denominator
return answer
При вызове данных принтов
print(lagranzh(btc, 7))
print(lagranzh(btc, 7.5))
print(lagranzh(btc, 8))
Методом проб пришел к выводу, что если в функции lagranzh в условиях циклов поставить не len(x), а число < 30, то результат будет близким к верному. Почему из-за большого количества данных интерполяция даёт неправильный результат?
