Краткий ответ:
from scipy.interpolate import interp1d
AgeNum = np.array(Age, dtype=float)
interps = {Coverage[count]: interp1d(
AgeNum, param, kind='cubic', fill_value='extrapolate'
) for count, param in enumerate(Premiums)}
мы просто создаем словарь функций интерполяции с помощью метода scipy кубического сплайна interp1d.
Однако я только что заметил, что вы что-то делаетене очень удачно с вашими графиками - я бы рекомендовал не переопределять протоколы масштабирования, «маскируя» истинные значения банка с помощью тиклабелей.
РЕДАКТИРОВАТЬ:
Вот как я мог бы закодировать это полностью:
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
#Age
Age = ["18","20","25","30","35","40","45","50","55","59"]
#Insurance coverage
Coverage = ["50k","100k","150k","200k"]
#Premiums Data
Cover50k_Annual_Premium = [473.05,501.90,588.45,698.05,842.25,1032.65,1298.05,1696.10,2376.85,3380.65]
Cover100k_Annual_Premium = [946.10,1003.80,1176.90,1396.10,1684.55,2065.30,2596.05,3392.15,4753.65,6761.25]
Cover150k_Annual_Premium = [1419.15,1505.70,1765.30,2094.15,2526.80,3097.95,3894.10,5088.25,7130.50,10141.90]
Cover200k_Annual_Premium = [1892.25,2007.60,2353.75,2792.20,3369.10,4130.60,5192.10,6784.35,9507.30,13522.55 ]
#Matrix
Premiums = np.array([Cover50k_Annual_Premium, Cover100k_Annual_Premium, Cover150k_Annual_Premium, Cover200k_Annual_Premium])
#interpolation
AgeNum = np.array(Age, dtype=float)
interps = {Coverage[count]: interp1d(
AgeNum, param, kind='cubic', fill_value='extrapolate'
) for count, param in enumerate(Premiums)}
# 2d interp
coverages = lambda z, y: interp1d(
x=[50000,100000,150000,200000],
y=[interps[func_val](z) for func_val in Coverage],
kind='cubic',
fill_value='extrapolate'
)(y)
#visualization
fig = plt.figure()
ax = fig.add_subplot(111)
ax.tick_params(direction='in', pad = 5)
ax.plot(AgeNum, Cover50k_Annual_Premium, c='Black', ls= '--', marker='o', label='50k')
ax.plot(AgeNum, Cover100k_Annual_Premium, c='red', ls= '--', marker='o', label='100k')
ax.plot(AgeNum, Cover150k_Annual_Premium, c='blue', ls= '--', marker='o', label='150k')
ax.plot(AgeNum, Cover200k_Annual_Premium, c='green', ls= '--', marker='o', label='200k')
ages = np.linspace(18,59,100)
ax.plot(ages, interps["50k"](ages))
ax.plot(ages, interps["100k"](ages))
ax.plot(ages, interps["150k"](ages))
ax.plot(ages, interps["200k"](ages))
ax.legend(loc='upper left',bbox_to_anchor=(1,1))
plt.tight_layout()
plt.show()
с таким, интерполяции могут быть вызваны с использованиемсловарные ключи:
In [23]:interps["50k"](27)
Out[23]: array(628.96153198)
In [24]:interps["200k"](27)
Out[24]: array(2515.80282111)
In [40]:coverages(27, 125000)
Out[40]: array(1572.3803509)