a = input("请输入十个数字:").split()
n = a[::-1]
print(' '.join(n))
a = input("请输入十个数字:").split() #把input进来的字符串按空格分割,变成一个str数组
n = a[::-1] #切片操作,数组取反
print(' '.join(n)) #把取反后的数组重新按空格合并为一个str
首先构建两个线性回归模型:
输入今日医学观察数,预测明日新增确诊数
输入明日医学观察数,输出明日新增确诊数
from sklearn.linear_model import LinearRegression
# 第一个线性回归模型
X_train = clean_df["watch"].values.reshape(-1,1)
y_train = clean_df["new"].to_list()
lin_reg01 = LinearRegression()
lin_reg01.fit(X_train, y_train)
# 第二个线性回归模型 new_df指的是上述重新排列后的数据集
X_log_train = np.log(new_df["watch"].values.reshape(-1,1))
y_log_train = np.log(new_df["new"].to_list())
lin_reg02 = LinearRegression()
lin_reg02.fit(X_log_train, y_log_train)
其中第二个模型可以直接进行预测了:
# 0202的医学观察数为152700,输入
res = lin_reg02.predict(np.log([[152700]]))[0]
# 得出结果为2931
print(np.exp(res))
这里可以看到我们已经得出第一个结果了2931
,我还是想试试第二个方案的结果,2931
可以作为一个参考,后面可以将两个结果平均一下。
第二个方案,线性回归模型我们已经构建好了,接下来弄个时间序列模型来预测后面一天的医学观察数。
from statsmodels.tsa.arima_model import ARIMA
order = sm.tsa.arma_order_select_ic(log_watch_df, max_ar=7, max_ma=7, ic=['aic', 'bic', 'hqic'])
# 给出最优p q值
p, q =order.bic_min_order
train_X = log_watch_df[:]
arima_model = ARIMA(train_X, (p, 0, q)).fit()
# 预测未来两天数据
# 2020-02-03 11.974123
# 2020-02-04 11.945058
predict_data_02 = arima_model.predict(start=len(train_X), end=len(train_X) + 1, dynamic = False)
# 预测历史数据
# 2020-01-28 10.853324
# 2020-01-29 10.997501
# 2020-01-30 11.591271
# 2020-01-31 11.714462
# 2020-02-01 11.775772
# 2020-02-02 11.920444
predict_data = arima_model.predict(dynamic = False)
看看预测值和实际值:
comp = pd.DataFrame()
comp['original'] = train_X[:]
comp['predict'] = predict_data[:]
comp.plot(figsize=(12,6))
此时我们已经知道2020-02-03 11.974123
是模型预测的明天的值,我们转换一下再将前面的误差综合一下,2020-02-03
的预测医学观察数是:163739
,根据第一个模型,输入明日医学观察数,得出明日新增确诊人数:
lin_reg01.predict([[163739]])
# 输出
array([3063.42234138])
目前可以得出以下结果:
对于第一个方案,预测2020-02-03
新增确诊人数是:3063
对于第二个方案:预测2020-02-03
新增确诊人数是:2931
我来取个中间值吧:2997。
于是,我预测2020-02-03
新增确诊人数是:2997,此结论仅仅作为参考,也肯定会在一定范围内波动,不要当真哈。
欢迎关注公众号【老胡的储物柜】
历史推文:
据非官方研究:学习Python可抑制冠状病毒
程序员如何在工作中进步