我正在尝试读取数据并将其绘制到使用python(标准线图)的图形上。有人可以建议我如何以编程方式对图表中的某些点是上升趋势还是下降趋势进行分类?哪一种是实现此目标的最佳方法?当然这是一个已解决的问题,并且存在数学方程式可以识别此问题?

这是一些具有上升趋势和下降趋势的示例数据

x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
y = [2,5,7,9,10,13,16,18,21,22,21,20,19,18,17,14,10,9,7,5,7,9,10,12,13,15,16,17,22,27]

提前致谢

最佳答案

一种简单的方法是查看“y相对于x的变化率”,即导数。这通常与连续(平滑)函数配合使用效果更好,因此您可以通过已建议的n阶多项式对数据进行插值来对数据进行实现。一个简单的实现如下所示:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
from scipy.misc import derivative

x = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,\
              16,17,18,19,20,21,22,23,24,25,26,27,28,29,30])
y = np.array([2,5,7,9,10,13,16,18,21,22,21,20,19,18,\
              17,14,10,9,7,5,7,9,10,12,13,15,16,17,22,27])

# Simple interpolation of x and y
f = interp1d(x, y)
x_fake = np.arange(1.1, 30, 0.1)

# derivative of y with respect to x
df_dx = derivative(f, x_fake, dx=1e-6)

# Plot
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)

ax1.errorbar(x, y, fmt="o", color="blue", label='Input data')
ax1.errorbar(x_fake, f(x_fake), label="Interpolated data", lw=2)
ax1.set_xlabel("x")
ax1.set_ylabel("y")

ax2.errorbar(x_fake, df_dx, lw=2)
ax2.errorbar(x_fake, np.array([0 for i in x_fake]), ls="--", lw=2)
ax2.set_xlabel("x")
ax2.set_ylabel("dy/dx")

leg = ax1.legend(loc=2, numpoints=1,scatterpoints=1)
leg.draw_frame(False)

您会看到,当图从“上升趋势”(正梯度)过渡到“下降趋势”(负梯度)时,导数(dy/dx)从正变为负。过渡发生在dy/dx = 0处,如绿色虚线所示。对于scipy例程,您可以查看:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.misc.derivative.html

http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

NumPy的diff/gradient也应该起作用,并且不需要插值,但是我已经展示了上面的内容,所以您可以理解。有关微分/微积分的完整数学描述,请参阅维基百科。

关于python - 识别图的上升趋势或下降趋势,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24134894/

10-13 08:16