计算熊猫的导数?



我正在尝试计算熊猫Series的导数,即(x[n] - x[n-1]) / (t[n] - t[n-1])

如果这个问题是重复的,我很抱歉,我知道已经有很多听起来类似的问题了,但我看到大多数要求导数的人实际上是指有限差分。总结一下:一个有限的差异是x[n] - x[n-1](不是我想要的)。还请注意,pandas.Series.diff计算有限差分,并且文档没有要求计算导数。

下面是一个例子:

>>> s = pd.Series([1, 2, 3, 4], [1, 2, 4, 7])
>>> s.diff() / np.gradient(s.index)
1         NaN
2    0.666667
4    0.400000
7    0.333333
dtype: float64

是否没有单独的函数调用来完成此操作?我也不想重新取样——那太过分了。

注意:

  • np.diff不能工作,因为它的输出比输入短
  • Index没有类似Series.diff的方法

我正在尝试计算熊猫系列的导数,即(x[n] - x[n-1]) / (t[n] - t[n-1])

这个列的有限差分除以索引的有限差分。

>>> s = pd.Series([1, 2, 3, 4], [1, 2, 4, 7])
>>> s.diff() / s.index.to_series().diff()
1         NaN
2    1.000000
4    0.500000
7    0.333333
dtype: float64

请注意,这将得到与使用np.gradient()的解决方案略有不同的答案。Np.gradient()对导数使用双边近似。文档

这里有一个例子显示np.gradient()不仅仅是t[n] - t[n-1]。在求导数的近似值时,它同时考虑了前一个和下一个元素。

>>> np.gradient([1, 2, 1000])
array([  1. , 499.5, 998. ])

通常进行这种非常具体的操作的最佳方法是利用pandas的基础知识并自己编写:

(
pd.DataFrame({'x':[1, 2, 3, 4], 't':[1, 2, 4, 7]})
.assign(xnm1=lambda d: d.x.shift(-1), 
tnm1=lambda d: d.t.shift(-1))
.pipe(lambda d: (d.x - d.xnm1) / (d.t - d.tnm1))
)

最新更新