Pandas 系列:管道风格
R 语言的管道
这回来介绍一下如何利用管道(pipe)风格将 Pandas 相关的代码写得更易读,不过首先让我们看看隔壁 R 语言中管道是怎么用的。假设输入是 x
,经过连续四个函数的处理后得到输出 y
,代码可以按顺序写:
x1 <- func1(x, arg1)
x2 <- func2(x1, arg2)
x3 <- func3(x2, arg3)
y <- func4(x3, arg4)
这回来介绍一下如何利用管道(pipe)风格将 Pandas 相关的代码写得更易读,不过首先让我们看看隔壁 R 语言中管道是怎么用的。假设输入是 x
,经过连续四个函数的处理后得到输出 y
,代码可以按顺序写:
x1 <- func1(x, arg1)
x2 <- func2(x1, arg2)
x3 <- func3(x2, arg3)
y <- func4(x3, arg4)
相信大伙对 NumPy 和 SciPy 里的插值比较熟:已知坐标值 xp
和变量值 fp
,调用函数计算变量在目标坐标 x
上的数值。例如 np.interp
的 API 就是
np.interp(x, xp, fp)
Pandas 的 Series
和 DataFrame
对象也有插值方法 interpolate
,默认做线性插值。但其功能与 NumPy 和 SciPy 不太一样。以一个序列对象 s
为例:
# 缺测部分和有效部分.
invalid = s.isna()
valid = ~invalid
# 对应于xp.
s.index[valid]
# 对应于fp.
s.values[valid]
# 对应于x.
s.index
# 两式大致等价.
s.interpolate(method='index').values
np.interp(s.index, s.index[valid], s.values[valid])
即 Pandas 的插值是要利用序列的有效值当 xp
和 fp
,去填补缺测的部分。所以调用 s.interpolate
时我们不需要传入形如 x
的参数,而是应该在调用前就通过 s.reindex
之类的方法将 x
融合到 s
的索引中。这么说可能有点抽象,下面就以图像直观展示 Pandas 里插值的效果。本文不会涉及到具体的插值算法(最邻近、三次样条……),仅以线性插值为例。