由于与作者用的版本不同的问题,这本书里面很多代码方式对模块的新版本不适用了,以下作一些记录与修改。
有关书中4-1用拉格朗日法进行插补,会有几处warning和报错,
网上大部分小伙伴都在解决过滤异常值的告警问题,其实真正有问题的是这里:
仅针对课本里出现的问题,正常的索引都是从0开始,但是当n<k的时候,索引就为负的了。老版本时会自动未申明的索引值赋值为none,但是新版本时不好使了,会直接报错。具体可查阅报错信息后的官网链接:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
解决方法:
def ployinterp_column(s, n, k=5):
if n-k < 0:
y = s.reindex(range(n-k, len(s)))[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))] # 取数
else:
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回插值结果
重新运行则会出来正确的结果。但是课本中的数据忽略了另一个问题,当空值出现在末尾,n+k超过了行数,也会报错,最后代码修改为下面这种:
def ployinterp_column(s, n, k=5):
y = s.reindex(range(n-k, n + 1 + k))[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))] # 取数
y = y[y.notnull()] #剔除空值
return lagrange(y.index, list(y))(n) #插值并返回插值结果
最后插个题外话,最终结果第一行出来是负的了,显然是不合理的,不知道是不是拉格朗日天然的缺陷,旁征博引了网络上的各路小伙伴,其中一位的解答感觉有帮助:
http://blog.sina.com.cn/s/blog_13bb711fd0102x9xl.html