使用Pandas

时间:2017-12-19 15:51:25

标签: python pandas scipy

我有一个稀疏数据集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()

naive interpolation

如何以0到360度之间填充的方式插入此数据? pandas Series.interpolate文档似乎没有内置任何内容,scipy文档也没有内置任何内容。 {3}}文档。

2 个答案:

答案 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。您可以使此代码更适合您的特定应用程序。

Interpolation using a closed curve.

答案 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()

repeating data

然后我可以从内插数据创建一个新系列,索引从0到360,看起来它给了我我想要的东西:

f44final = f44expanded[np.arange(0,360)]
f44final.plot()

final plot

我怀疑有更好的方法可以做到这一点,所以如果您知道答案,请随时添加答案。