god*_*lla 4 python graph matplotlib polynomial-math
我试图读取数据并使用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]
Run Code Online (Sandbox Code Playgroud)
提前致谢
jon*_*one 11
一种简单的方法是查看"相对于x的y变化率",称为导数.这通常适用于连续(平滑)函数,因此您可以通过使用已建议的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)
Run Code Online (Sandbox Code Playgroud)

你会看到当情节从"向上趋势"(正向渐变)转变为"向下趋势"(负向渐变)时,导数(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也应该可以工作,而不需要插值,但是我展示了上面所以你可以得到这个想法.有关微分/微积分的完整数学描述,请查看维基百科.