我有一个稀疏数据集f44
,由度数和ssi(dbm)值的轴承组成:
ssi
deg
4.0 -69
59.0 -73
162.0 -73
267.0 -61
319.0 -75
我重新编号f44
以包含0-359中所有缺失的索引:
f44i = f44.reindex(np.arange(0,360))
当我插入(使用二次方)并绘制图形时,显然结果不会在第一个/最低轴承和最高轴承之间进行插值:
f44i = f44i.interpolate(method='quadratic')
f44i.plot()
如何以0到360度之间填充的方式插入此数据? pandas Series.interpolate
文档似乎没有内置任何内容,scipy
文档也没有内置任何内容。 {3}}文档。
答案 0 :(得分:1)
我使用scipy
插补到闭合曲线上,有另一种解决此问题的方法。首先,我将您的数据从(deg,ssi)转换为 psuedo 笛卡尔坐标(x,y),假设deg
是极角,ssi
是(负)径向距离。然后,您可以使用定义的方法here将闭合曲线插入到一组(x,y)点上。
import numpy as np
import pandas
import matplotlib.pyplot as plt
from scipy import interpolate
dic = {'deg': [4.0, 59.0, 162.0, 267.0, 319.0],
'ssi': [-69, -73, -73, -61, -75]}
f44 = pandas.DataFrame(data=dic)
'''
Now, lets do the following. Convert your data from (deg, ssi) to (x,y)
where x = ssi* cosd(deg), y=ssi*sind(deg). Now we need to interpolate a closed
curve onto these set of cartesian points.
'''
f44['x'] = -f44['ssi']*np.cos( np.deg2rad(f44['deg']))
f44['y'] = -f44['ssi']*np.sin( np.deg2rad(f44['deg']))
x = f44.as_matrix(columns=[f44.columns[2]])[:,0]
y = f44.as_matrix(columns=[f44.columns[3]])[:,0]
x = np.r_[x, x[0]]
y = np.r_[y, y[0]]
tck, u = interpolate.splprep([x, y], s=0, per=True)
xi, yi = interpolate.splev(np.linspace(0, 1, 1000), tck)
# Save interpolated data to new dataframe.
f44i = pandas.DataFrame(data = {'x':xi, 'y':yi})
f44i['deg'] = np.rad2deg( np.arctan2(f44i['y'],f44i['x']))
f44i['ssi'] =-np.sqrt( f44i['x']**2 + f44i['y']**2)
for i,l in enumerate(f44i['deg']):
if l < 0:
f44i['deg'][i] = 360 + f44i['deg'][i]
fig, ax = plt.subplots(1, 1)
ax.plot(f44i['deg'], f44i['ssi'], '.', markersize=0.5)
ax.plot(f44['deg'], f44['ssi'], '.', color='red')
plt.show()
现在我们得到一条如下所示的曲线。 (从伪笛卡尔坐标重新转换为您首选的(deg,ssi)坐标)。另外,我创建了一个新的数据框来替换您创建的f44i
。您可以使此代码更适合您的特定应用程序。
答案 1 :(得分:0)
我不相信这是最好的方法,但似乎有效。如果有更好的方法,请添加一些东西。
由于我只对0-360度感兴趣,我可以复制-360-0和360-720的数据集,将原始数据集向左和向右扩展,如下所示:
import numpy as np
# Create left side
f44il = f44i.copy()
f44il.index = np.arange(-360,0)
# Create right side
f44ir = f44i.copy()
f44ir.index = np.arange(360,720)
插值和绘制结果看起来很有希望(第三个命令以不同的颜色显示0-360):
f44expanded = pd.concat([f44il, f44i, f44ir]).interpolate(method='quadratic')
f44expanded.plot()
f44expanded[np.arange(0,360)].plot()
然后我可以从内插数据创建一个新系列,索引从0到360,看起来它给了我我想要的东西:
f44final = f44expanded[np.arange(0,360)]
f44final.plot()
我怀疑有更好的方法可以做到这一点,所以如果您知道答案,请随时添加答案。