如何使用Interpn在数据帧中进行内插?

2022-04-04 00:00:00 python pandas scipy dataframe interpolation

问题描述

我正在尝试插入数据帧,但没有成功。我正在使用具有距离标头和风组件标头的数据帧。

风分量用20单位差和距离10分开。我希望能够插入到每个单元的1范围内,但我被卡住了。

在此之前我没有使用过Scipy,我在他们的文档中看不到太多的解释(我可以理解)。

我有一个我转换的表to_dict并将其用于数据帧:

data = {'dist': [100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420],
     '-60': [520, 600, 670, 740, 810, 880, 950, 1020, 1100, 1170, 1240, 1310, 1380, 1450, 1520, 1600, 1670, 1740, 1810, 1880, 1950, 2020, 2100, 2170, 2240, 2310, 2380, 2450, 2530, 2600, 2670, 2740, 2810],
     '-40': [440, 500, 570, 630, 690, 760, 820, 880, 950, 1010, 1070, 1140, 1200, 1260, 1330, 1390, 1450, 1510, 1580, 1640, 1700, 1770, 1830, 1890, 1960, 2020, 2080, 2150, 2210, 2270, 2340, 2400, 2460],
     '-20': [380, 430, 490, 550, 600, 660, 720, 770, 830, 880, 940, 1000, 1050, 1110, 1170, 1220, 1280, 1340, 1390, 1450, 1510, 1560, 1620, 1680, 1730, 1790, 1850, 1900, 1960, 2020, 2070, 2130, 2190],
     '0': [320, 370, 420, 480, 530, 580, 630, 680, 730, 780, 830, 890, 940, 990, 1040, 1090, 1140, 1190, 1240, 1300, 1350, 1400, 1450, 1500, 1550, 1600, 1650, 1710, 1760, 1810, 1860, 1910, 1960],
     '20': [280, 320, 370, 420, 470, 510, 560, 610, 650, 700, 750, 790, 840, 890, 930, 980, 1030, 1070, 1120, 1170, 1210, 1260, 1310, 1350, 1400, 1450, 1500, 1540, 1590, 1640, 1680, 1730, 1780],
     '40': [240, 280, 330, 370, 410, 460, 500, 540, 590, 630, 670, 720, 760, 800, 840, 890, 930, 970, 1020, 1060, 1100, 1150, 1190, 1230, 1280, 1320, 1360, 1400, 1450, 1490, 1530, 1580, 1620],
     '60': [210, 250, 290, 330, 370, 410, 450, 490, 530, 570, 610, 650, 690, 730, 770, 810, 850, 890, 930, 970, 1010, 1050, 1090, 1130, 1170, 1210, 1250, 1290, 1330, 1370, 1410, 1450, 1490]}
df = pd.DataFrame(data).set_index(['dist'])
df.columns = df.columns.map(float)
df.columns.name = 'wind'
print(df)

打印此邮件可获得以下信息:

wind  -60.0  -40.0  -20.0   0.0    20.0   40.0   60.0
dist                                                 
100     520    440    380    320    280    240    210
110     600    500    430    370    320    280    250
120     670    570    490    420    370    330    290
130     740    630    550    480    420    370    330
140     810    690    600    530    470    410    370
150     880    760    660    580    510    460    410
160     950    820    720    630    560    500    450
170    1020    880    770    680    610    540    490
180    1100    950    830    730    650    590    530
190    1170   1010    880    780    700    630    570
200    1240   1070    940    830    750    670    610
210    1310   1140   1000    890    790    720    650
220    1380   1200   1050    940    840    760    690
230    1450   1260   1110    990    890    800    730
240    1520   1330   1170   1040    930    840    770
250    1600   1390   1220   1090    980    890    810
260    1670   1450   1280   1140   1030    930    850
270    1740   1510   1340   1190   1070    970    890
280    1810   1580   1390   1240   1120   1020    930
290    1880   1640   1450   1300   1170   1060    970
300    1950   1700   1510   1350   1210   1100   1010
310    2020   1770   1560   1400   1260   1150   1050
320    2100   1830   1620   1450   1310   1190   1090
330    2170   1890   1680   1500   1350   1230   1130
340    2240   1960   1730   1550   1400   1280   1170
350    2310   2020   1790   1600   1450   1320   1210
360    2380   2080   1850   1650   1500   1360   1250
370    2450   2150   1900   1710   1540   1400   1290
380    2530   2210   1960   1760   1590   1450   1330
390    2600   2270   2020   1810   1640   1490   1370
400    2670   2340   2070   1860   1680   1530   1410
410    2740   2400   2130   1910   1730   1580   1450
420    2810   2460   2190   1960   1780   1620   1490

到目前为止一切都很好。 现在我陷入的问题是如何进行内插,这样我就可以从中得到准确的数字。我正在尝试使用interpn,但显然我做错了。以下是我要尝试获得-35的风分量和103的距离的插值图:

arr = np.dstack(np.array_split(df.to_numpy(), 1))
wind = df.columns.to_numpy()
dist = df.index.get_level_values(0).unique().to_numpy()

print(interpn((wind, dist), arr, [float(-35), int(103)]))

我收到以下错误:

ValueError: There are 7 points and 33 values in dimension 0

我试着通读文档,但似乎无法理解,我在其他地方找到的所有示例都是针对图形数据的。

有没有人能帮我弄清楚这件事,我对这种工作还很陌生。谢谢:)


解决方案

不需要转换数据,您已经有了一个2D数组,可以按原样使用它。您搞错了轴:第一个轴(轴0)是数据帧的行,第二个轴(轴1)是列。

arr = df.to_numpy()
dist = df.index.to_numpy()
wind = df.columns.to_numpy()

x, y = np.meshgrid(wind, dist)
print(interpn((dist, wind), arr, [103, -35]))
# array([442.25])

作为替代,您也可以使用itnerp2d,以下是相反的轴:

f = interp2d(wind, dist, arr)
print(f(-35, 103))
#array([442.25])

相关文章