使用历史数据样本估计未来增长
Estimate future growth using sample of historical data
我有过去几年我们数据库增长(在大小方面)的历史记录。我试图找出最好的 way/graph 可以根据历史记录向我展示数据库的未来增长,当然,如果我们添加一个新的 table 并且它也会增长,这将无济于事,但我只是在寻找一种方法来估计它。我对 Python 或 R
中的想法持开放态度
以下是多年来数据库的大小(以 TB 为单位):
3.895 - 2012
6.863 - 2013
8.997 - 2014
10.626 - 2015
将一些 numpy 和 scipy 粘合在一起,您可以使用使用数据的连续近似值的一阶和二阶导数进行适当的近似。
可能有更好的方法来做到这一点,但这对我有用。
import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt
import matplotlib
x = np.array([2012, 2013, 2014, 2015])
y = np.array([3.895, 6.863, 8.997, 10.626])
# interpolate to approximate a continuous version of hard drive usage over time
f = scipy.interpolate.interp1d(x, y, kind='quadratic')
# approximate the first and second derivatives near the last point (2015)
dx = 0.01
x0 = x[-1] - 2*dx
first = scipy.misc.derivative(f, x0, dx=dx, n=1)
second = scipy.misc.derivative(f, x0, dx=dx, n=2)
# taylor series approximation near x[-1]
forecast = lambda x_new: np.poly1d([second/2, first, f(x[-1])])(x_new - x[-1])
forecast(2016) # 11.9
xs = np.arange(2012, 2020)
ys = forecast(xs)
# needed to prevent matplotlib from putting the x-axis in scientific notation
x_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False)
plt.gca().xaxis.set_major_formatter(x_formatter)
plt.plot(xs, ys)
d <- data.frame(x= 2012:2015,
y = c(3.895, 6.863, 8.997, 10.626))
您可以将拟合(及其投影)可视化:我在这里比较加法模型和多项式模型。不过,我不确定我是否相信加法模型的置信区间:
library("ggplot2"); theme_set(theme_bw())
ggplot(d,aes(x,y))+ geom_point() +
expand_limits(x=2018)+
geom_smooth(method="lm",formula=y~poly(x,2),
fullrange=TRUE,fill="blue")+
geom_smooth(method="gam",formula=y~s(x,k=3),colour="red",
fullrange=TRUE,fill="red")
二次关系如此接近,我有点震惊。
summary(m1 <- lm(y~poly(x,2),data=d))
## Residual standard error: 0.07357 on 1 degrees of freedom
## Multiple R-squared: 0.9998, Adjusted R-squared: 0.9994
## F-statistic: 2344 on 2 and 1 DF, p-value: 0.0146
预测:
predict(m1,newdata=data.frame(x=2016:2018),interval="confidence")
## fit lwr upr
## 1 11.50325 8.901008 14.10549
## 2 11.72745 6.361774 17.09313
## 3 11.28215 2.192911 20.37139
这些数字是你编造的,还是真实数据?
forecast()
包对于更复杂的方法会更好。
转念一想,你真正想用的是 Gaussian Process.
import numpy as np
import sklearn.gaussian_process
import pandas as pd
import matplotlib
np.random.seed(1)
X = np.atleast_2d([2012, 2013, 2014, 2015]).T
y = np.array([3.895, 6.863, 8.997, 10.626])
x_new = np.atleast_2d(np.linspace(2012, 2018, 1000)).T
gp = sklearn.gaussian_process.GaussianProcess()
gp.fit(X, y)
y_pred, MSE = gp.predict(x_new, eval_MSE=True)
sigma = np.sqrt(MSE)
df = pd.DataFrame(dict(prediction=y_pred, se=sigma), index=x_new)
df.plot(yerr='se')
虽然基础很强,但 Python 需要更好的可视化库。甚至让 x 轴显示整数(而不是使用科学记数法)也是不必要的困难。
我有过去几年我们数据库增长(在大小方面)的历史记录。我试图找出最好的 way/graph 可以根据历史记录向我展示数据库的未来增长,当然,如果我们添加一个新的 table 并且它也会增长,这将无济于事,但我只是在寻找一种方法来估计它。我对 Python 或 R
中的想法持开放态度以下是多年来数据库的大小(以 TB 为单位):
3.895 - 2012
6.863 - 2013
8.997 - 2014
10.626 - 2015
将一些 numpy 和 scipy 粘合在一起,您可以使用使用数据的连续近似值的一阶和二阶导数进行适当的近似。
可能有更好的方法来做到这一点,但这对我有用。
import numpy as np
import scipy.interpolate
import matplotlib.pyplot as plt
import matplotlib
x = np.array([2012, 2013, 2014, 2015])
y = np.array([3.895, 6.863, 8.997, 10.626])
# interpolate to approximate a continuous version of hard drive usage over time
f = scipy.interpolate.interp1d(x, y, kind='quadratic')
# approximate the first and second derivatives near the last point (2015)
dx = 0.01
x0 = x[-1] - 2*dx
first = scipy.misc.derivative(f, x0, dx=dx, n=1)
second = scipy.misc.derivative(f, x0, dx=dx, n=2)
# taylor series approximation near x[-1]
forecast = lambda x_new: np.poly1d([second/2, first, f(x[-1])])(x_new - x[-1])
forecast(2016) # 11.9
xs = np.arange(2012, 2020)
ys = forecast(xs)
# needed to prevent matplotlib from putting the x-axis in scientific notation
x_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False)
plt.gca().xaxis.set_major_formatter(x_formatter)
plt.plot(xs, ys)
d <- data.frame(x= 2012:2015,
y = c(3.895, 6.863, 8.997, 10.626))
您可以将拟合(及其投影)可视化:我在这里比较加法模型和多项式模型。不过,我不确定我是否相信加法模型的置信区间:
library("ggplot2"); theme_set(theme_bw())
ggplot(d,aes(x,y))+ geom_point() +
expand_limits(x=2018)+
geom_smooth(method="lm",formula=y~poly(x,2),
fullrange=TRUE,fill="blue")+
geom_smooth(method="gam",formula=y~s(x,k=3),colour="red",
fullrange=TRUE,fill="red")
二次关系如此接近,我有点震惊。
summary(m1 <- lm(y~poly(x,2),data=d))
## Residual standard error: 0.07357 on 1 degrees of freedom
## Multiple R-squared: 0.9998, Adjusted R-squared: 0.9994
## F-statistic: 2344 on 2 and 1 DF, p-value: 0.0146
预测:
predict(m1,newdata=data.frame(x=2016:2018),interval="confidence")
## fit lwr upr
## 1 11.50325 8.901008 14.10549
## 2 11.72745 6.361774 17.09313
## 3 11.28215 2.192911 20.37139
这些数字是你编造的,还是真实数据?
forecast()
包对于更复杂的方法会更好。
转念一想,你真正想用的是 Gaussian Process.
import numpy as np
import sklearn.gaussian_process
import pandas as pd
import matplotlib
np.random.seed(1)
X = np.atleast_2d([2012, 2013, 2014, 2015]).T
y = np.array([3.895, 6.863, 8.997, 10.626])
x_new = np.atleast_2d(np.linspace(2012, 2018, 1000)).T
gp = sklearn.gaussian_process.GaussianProcess()
gp.fit(X, y)
y_pred, MSE = gp.predict(x_new, eval_MSE=True)
sigma = np.sqrt(MSE)
df = pd.DataFrame(dict(prediction=y_pred, se=sigma), index=x_new)
df.plot(yerr='se')
虽然基础很强,但 Python 需要更好的可视化库。甚至让 x 轴显示整数(而不是使用科学记数法)也是不必要的困难。