在Python帮助中使用numpy / Scipy改进多项式曲线拟合

时间:2015-06-20 14:21:03

标签: python numpy matplotlib curve-fitting non-linear-regression

我有两个NumPy数组时间,没有获取请求。我需要使用函数来拟合这些数据,以便我可以进行未来的预测。 这些数据是从cassandra表中提取的,该表存储了日志文件的详细信息。所以基本上时间格式是纪元时间,这里的训练变量是get_counts。

from cassandra.cluster import Cluster    
import numpy as np    
import matplotlib.pyplot as plt   
from cassandra.query import panda_factory

session = Cluster(contact_points=['127.0.0.1'], port=9042).connect(keyspace='ASIA_KS')         
session.row_factory = panda_factory    
df = session.execute("SELECT epoch_time, get_counts FROM ASIA_TRAFFIC")    
.sort(columns=['epoch_time','get_counts'], ascending=[1,0])    
time = np.array([x[1] for x in enumerate(df['epoch_time'])])    
get = np.array([x[1] for x in enumerate(df['get_counts'])])    
plt.title('Trend')    
plt.plot(time, byte,'o')    
plt.show()

数据如下: 有大约1000对数据

time -> [1391193000 1391193060 1391193120 ..., 1391279280 1391279340 1391279400 1391279460]

get -> [577 380 430 ...,250 275 365  15]

绘制图像(full size here): Plot image

有人可以帮我提供一个功能,以便我能够正确地适应数据吗?我是python的新手。

编辑*

fit = np.polyfit(time, get, 3)
yp = np.poly1d(fit)
plt.plot(time, yp(time), 'r--', time, get, 'b.')
plt.xlabel('Time')    
plt.ylabel('Number of Get requests')    
plt.title('Trend')    
plt.xlim([time[0]-10000, time[-1]+10000])
plt.ylim(0, 2000)
plt.show()
print yp(time[1400])

拟合曲线如下所示:
https://drive.google.com/file/d/0B-r3Ym7u_hsKUTF1OFVqRWpEN2M/view?usp=sharing

然而,在曲线的后半部分,y的值变为(-ve),这是错误的。曲线必须在其间的某处改变其斜率回到(+ ve)。 任何人都可以建议我如何去做。 将非常感谢帮助。

1 个答案:

答案 0 :(得分:1)

你可以尝试:

<a>

我是Numpy和曲线拟合的新手,但这就是我尝试这样做的原因。