Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中获得一个函数在2个列表(每个列表都有自己的x,y)之间进行插值?_Python_Interpolation - Fatal编程技术网

如何在python中获得一个函数在2个列表(每个列表都有自己的x,y)之间进行插值?

如何在python中获得一个函数在2个列表(每个列表都有自己的x,y)之间进行插值?,python,interpolation,Python,Interpolation,我对python比较陌生,有一个复杂而有趣的问题(IMO),我正在尝试解决,但不知道如何继续 我有一个保险费数据集,包含3个参数: 年龄(从18岁、20岁、25岁、30岁……到59岁,每5步) 覆盖范围(50k、100k、150k、200k) 保费(特定年龄和特定保险范围的保险成本) 想象 #年龄 年龄=[“18”、“20”、“25”、“30”、“35”、“40”、“45”、“50”、“55”、“59”] #保险范围 覆盖范围=[“50000”、“100000”、“150000”、“200

我对python比较陌生,有一个复杂而有趣的问题(IMO),我正在尝试解决,但不知道如何继续

我有一个保险费数据集,包含3个参数:

  • 年龄(从18岁、20岁、25岁、30岁……到59岁,每5步)
  • 覆盖范围(50k、100k、150k、200k)
  • 保费(特定年龄和特定保险范围的保险成本)
想象

#年龄
年龄=[“18”、“20”、“25”、“30”、“35”、“40”、“45”、“50”、“55”、“59”]
#保险范围
覆盖范围=[“50000”、“100000”、“150000”、“200000”]
#保费数据
保险额5万欧元年保费=[473.05501.90588.45698.05842.251032.651298.051696.102376.853380.65]
保额10万欧元年保费=[946.101003.801176.901396.101684.552065.302596.053392.154753.656761.25]
承保金额为150千欧元的年保费=[1419.151505.701765.302094.152526.803097.953894.105088.257130.5010141.90]
保额20万欧元年保费=[1892.252007.602353.752792.203369.104130.605192.106784.359507.3013522.55]
#母体
保费=np.数组([覆盖5万欧元年度保费,覆盖10万欧元年度保费,覆盖15万欧元年度保费,覆盖20万欧元年度保费])
#形象化
地块(覆盖5万吨年溢价,c='黑色',ls='--',马克='o',标签='5万')
地块(覆盖10万吨年地价,c='red',ls='--',marker='o',label='10万')
地块(覆盖15万吨年地价,c='blue',ls='--',marker='o',label='15万')
地块(覆盖20万吨年地价,c='green',ls='--',marker='o',label='20万')
#在所有保费之间插入
#公式:interp=[(i1+i2)/2.0表示zip中的i1、i2(l1、l2)]
内部保费=[(承保5万股年保费+承保10万股年保费+承保15万股年保费+承保20万股年保费)/4.0
承保5万股年保费、10万股年保费、15万股年保费、20万股年保费
邮政编码(承保5万欧元年费、10万欧元年费、15万欧元年费、20万欧元年费)]
plt.plt(interp_premium,c='洋红',ls='-',marker='o',label='interp')
plt.图例(loc='左上角',bbox_至_锚=(1,1))
plt.xticks(列表(范围(0,10)),年龄,旋转=垂直)
plt.show()
国际保险费
#考虑到27岁,找出50k、100k、150k、200k的保费
# ?????
我正试图得到每个保险(50k、100k、150k、200k)在给定年龄(例如27岁)的人的估计保费(插值),但我被卡住了

最后,如果我返回一份在给定的保险范围内,所有保险范围内,一个人的估计保费列表,这样我就可以在保险范围之间进行插值(例如,一个人27岁时的保费是多少,125k的保费是多少)。

简单的回答是:

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的三次样条插值1D方法制作插值函数字典

然而,我刚刚注意到,您在绘图时做了一些不可靠的事情-我建议不要通过使用标签“屏蔽”真实的pot值来覆盖缩放协议

编辑:

下面是我如何完整地编写代码的:

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)
简单的回答是:

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的三次样条插值1D方法制作插值函数字典

然而,我刚刚注意到,您在绘图时做了一些不可靠的事情-我建议不要通过使用标签“屏蔽”真实的pot值来覆盖缩放协议

编辑:

下面是我如何完整地编写代码的:

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)

谢谢你的回复,迈克尔。然而,我得到了一个输出:
{0:,1:,2:,3:}
,我遗漏了一些东西?我刚刚发布了一个附加信息,可能会有所帮助:将字典和密钥对视为函数,然后传递一个参数(如[23]和[24]所示)。你在那里做的是要求整个字典,事实上,我在字典中打包了一组插值函数-通过使用comprehensionWow保持代码干净,感谢您以如此高的精度和闪电般的速度给出了答案!这正是我需要的!也感谢您提供的代码提示。:)这真是太棒了。再次感谢,迈克尔。谢谢你的回复,迈克尔。然而,我得到了一个输出:
{0:,1:,2:,3:}
,我遗漏了一些东西?我刚刚发布了一个附加信息,可能会有所帮助:将字典和密钥对视为函数,然后传递一个参数(如[23]和[24]所示)。你在那里做的是要求整个字典,事实上,我在字典中打包了一组插值函数-通过使用comprehensionWow保持代码干净,感谢您以如此高的精度和闪电般的速度给出了答案!这正是我需要的!也感谢您提供的代码提示。:)这真是太棒了。再次感谢你,迈克尔。这不是一个相关的问题,但是你如何在没有年龄的情况下构思呢?很可能是一个打字错误,但请修复它不是一个相关的问题,但如何在没有年龄的情况下进行绘图?很可能是打字错误,但请修复它