本文重点
- lagrange插值
- isnull(), notnull()函数
1. lagrange插值是什么
已知过
这
个点, 那么可以构造一个过这些点的,次数不超过
的多项式函数
.
要估计点的y值,即为
,这就是插值。
2. Scipy
Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。
3. Scipy的lagrange插值实现
Scipy中有一个子模块interpolate,子模块中包含lagrange插值函数。
lagrange(x, w)函数只有2个参数,x和w,分别需要输入对应的一组x点和y点。
这个函数返回的是一个多项式函数,lagrange(x, w)(n)就可以计算n点的插值。
4. isnull() notnull()函数
如果数据中有1个缺失值,我们希望用lagrange插值去填补,那么首先要找到这个缺失值,这就用到了pandas的isnull()函数。pandas不同对象都有isnull(),目前我用到的有:
- pandas.DataFrame.isnull() 不需要参数,返回的是一个由Bool组成的DataFrame.
- pandas.isnull(obj) 其中obj为标量或类数组。复习了一下,没有方向只有数值大小的数就是标量。返回一个或者系列的Bool.
- notnull()和isnull()相同。
5. 案例学习
# 导入的要处理数据为data(多行多列,是pandas的DataFrame)
# 构造一个函数,传入一列的数据,和这列数据中缺失值的位置,然后算出插值
# 默认k=5,使用空值前后的5个数值进行计算
def ployinterp_column(s, n, k = 5):
# 首先找到空值前后的5个数据
y = s[list(range(n - k, n)) + list(range(n + 1, n + k + 1))]
# 这些数据中不能有空值
# 案例是时间序列数据,所以如果为空就直接去掉了,没有再补充前面或后面的数据
# y[a] a是一列Bool数组,可以直接对y进行筛选
y = y[y.notnull()]
# 这里y是s的一部分,所以y也是一个DataFrame,要转化成list才能进行计算
# 用pd.array(y)转化成数组也是可以的
return lagrange(y.index, y)(n)
# 找到缺失值,并用lagrange插值填补
# data.columns可以返回data的列标签,但我更喜欢data.shape()返回行数列数
for i in range(data.shape[1]):
for j in range(data.shape[0]):
if pd.isnull(data[i][j]):
data[i][j] = ployinterp_column(data[i], j)