我正在尝试读取数据并使用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]
提前致谢
答案 0 :(得分:11)
一种简单的方法是查看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的差异/渐变也应该有效,而且不需要插值,但我展示了上述内容,因此你可以得到这个想法。有关微分/微积分的完整数学描述,请查看维基百科。