在数据帧中插入NaN单元格非常容易:
[98]on
:df
Output[98]:
neg neu位置平均值
250 0.508475 0.527027 0.641292 0.558931
500南南
1000 0.650000 0.571429 0.653983 0.625137
2000年楠楠
3000 0.619718 0.663158 0.665468 0.649448
4000南南
6000南南
8000南南
万楠楠
20000南南
三万南南
50000楠楠
[12行x 4列]
[99]on:df.插值(方法='最近',轴=0)
Output[99]:
neg neu位置平均值
250 0.508475 0.527027 0.641292 0.558931
500 0.508475 0.527027 0.641292 0.558931
1000 0.650000 0.571429 0.653983 0.625137
2000 0.650000 0.571429 0.653983 0.625137
3000 0.619718 0.663158 0.665468 0.649448
4000南南
6000南南
8000南南
万楠楠
20000南南
三万南南
50000楠楠
[12行x 4列]
我还希望它使用给定的方法来外推插值范围之外的NaN值。我怎样才能做到最好
外推数据帧DataFrames
DataFrames可以外推,但是,pandas中没有简单的方法调用,需要另一个库(例如scipy.optimize)
外推
一般来说,外推需要对外推的数据做出某些假设。一种方法是通过曲线拟合一些通用参数化方程到数据,以找到最能描述现有数据的参数值,然后使用这些参数值计算超出此数据范围的值。这种方法的困难和限制性问题是,当选择参数化方程时,必须对趋势作出一些假设。这可以通过使用不同的方程式进行反复试验来获得所需的结果,或者有时可以从数据源中推断出来。问题中提供的数据确实不够大,数据集不足以获得拟合良好的曲线;然而,这足以说明问题
以下是使用3阶多项式外推数据帧的示例
f(x)=ax3+bx2+cx+d(等式1)
此通用函数(func())对每列进行曲线拟合,以获得唯一的列特定参数(即a、b、c、d)。然后,使用这些参数化方程外推NaNs的所有索引的每列数据
将熊猫作为pd导入
从cStringIO导入StringIO
从scipy.optimize导入曲线\u拟合
df=pd.读取表格(字符串(“”)
neg neu位置平均值
0楠楠楠楠楠
250 0.508475 0.527027 0.641292 0.558931
500南南
1000 0.650000 0.571429 0.653983 0.625137
2000年楠楠
3000 0.619718 0.663158 0.665468 0.649448
4000南南
6000南南
8000南南
万楠楠
20000南南
三万南南
50000南“”),sep='\s+'))
#进行原始插值
df.插值(方法='nearest',xis=0,inplace=True)
#显示结果
打印('插值数据:')
打印(df)
打印()
#函数以曲线拟合数据
def func(x、a、b、c、d):
返回a*(x**3)+b*(x**2)+c*x+d
#初始参数猜测,只是为了启动优化
猜测=(0.5,0.5,0.5,0.5)
#创建数据副本以删除用于曲线拟合的NAN
fit_df=df.dropna()
#用于存储每个列的函数参数的位置
col_params={}
#曲线拟合每列
对于fit_df.列中的列:
#获取x&;Y
x=fit_df.index.astype(float).values
y=fit_df[col]。数值
#曲线拟合列并获取曲线参数
参数=曲线拟合(func,x,y,guess)
#存储优化参数
col_params[col]=params[0]
#外推每列
对于df.列中的列:
#获取列中NAN的索引值
x=df[pd.isnull(df[col])].index.astype(float).values
#用拟合函数外推这些点
df[col][x]=func(x,*col_参数[col])
#显示结果
打印('外推数据:')
打印(df)
打印()
print('使用这些列函数推断数据:')
对于col_参数中的col:
打印('f{}(x)={:0.3e}x^3+{:0.3e}x^2+{:0.4f}x+{:0.4f})。格式(col,*col_参数[col]))
外推结果
插值数据:
neg neu位置平均值
0楠楠楠楠楠
250 0.508475 0.527027 0.641292 0.558931
500 0.508475 0.527027 0.641292 0.558931
1000 0.650000 0.571429 0.653983 0.625137
2000 0.650000 0.571429 0.653983 0.625137
3000 0.619718 0.663158 0.665468 0.649448
4000南南
6000南南
8000南南
万楠楠
20000南南
三万南南
50000楠楠
外推数据:
neg neu位置平均值
0 0.411206 0.486983 0.631233 0.509807
250 0.508475 0.527027 0.641292 0.558931
500 0.508475 0.527027 0.641292 0.558931
1000 0.650000 0.571429 0.653983 0.625137
2000 0.650000 0.571429 0.653983 0.625137
3000 0.619718 0.663158 0.665468 0.649448
4000 0.621036 0.969232 0.708464 0.766245
6000 1.197762 2.799529 0.991552 1.662954
8000 3.281869 7.191776 1.702860 4.058855
10000 7.767992 15.272849 3.041316 8.694096
20000 97.540944 150.451269 26.103320 91.365599
30000 381.559069 546.881749 94.683310 341.042883
50000 1979.646859 2686.936912 467.861511 1711.489069
使用以下列函数外推数据:
f_neg(x)=1.864e-11x^3+-1.471e-07x^2+0.0003x+0.4112
f_neu(x)=2.348e-11x^3+-1.023e-07x^2+0.0002x+0.4870
f_平均值(x)=1.542e-11 x^3+-9.016e-08 x^2+0.0002 x+0.5098
f_pos(x)=4.144e-12 x^3+-2.107e-08 x^2+0.0000 x+0.6312
avg列的绘图
如果没有更大的数据集或不知道数据源,此结果可能完全错误,但应举例说明推断数据帧的过程。可能需要使用func()中的假定方程式来获得正确的外推。此外,没有尝试使代码高效
更新:
如果您的索引是非数字的,如DatetimeIndex,请参阅此答案以了解如何推断它们