标签归档:Python预测

Python 多项式预测2019年天猫销售额

双十一刚过,天猫的销售额创新高占领了各大新闻媒体头条。但是,知乎上的一个问题对本次双十一的销售额提出了一个非常有意思的问题:《如何看待双十一销售额完美分布在三次回归曲线上且拟合高达 99.94%?是巧合还是造假?》

本文的重点放在如何用Python实现三次回归曲线的预测功能。

1.数据源

采用cnbeta新闻报道中的数据:《[直击]2019年天猫双11落幕:交易额2684亿元》

有效数字保留三位,其中2009年为0.52亿、2010年为9.36亿、2011年为52.0亿。

2.代码构建

我们将使用scikitlearn的多项式回归实现预测。训练集是2009至2014年的数据,后续测试中将陆续增加训练集至2018年。

2.1 数据预处理

构造三次多项式特征需要以列的形式,因此代码中会将numpy数组reshape成列形式。

# 数据集
datasets_X = [2009, 2010, 2011, 2012, 2013, 2014]
datasets_Y = [0.52, 9.36, 52.0, 191, 350, 571]
test_X = [2015, 2016, 2017, 2018, 2019]
real_Y =  [912, 1207, 1682, 2132, 2684]

# 数据预处理
dataset_length = len(datasets_X)
test_length = len(test_X)
# 将数据转化为numpy数组,并变为列的形式
datasets_X = np.array(datasets_X).reshape([dataset_length, 1])
test_X = np.array(test_X).reshape([test_length, 1])
datasets_Y = np.array(datasets_Y)
real_Y = np.array(real_Y)

2.2 数据建模训练

这里需要注意的是,必须先构建三次多项式特征后才可放入线性回归模型。

# 数据建模
# 构造三次多项式特征
poly_reg = PolynomialFeatures(degree=3)
X_poly = poly_reg.fit_transform(datasets_X)

# 使用线性回归模型学习X_poly和datasets_Y之间的映射关系
lin_reg_3 = LinearRegression()
lin_reg_3.fit(X_poly, datasets_Y) 

2.3 数据预测

训练完毕后,就可以将lin_reg_3模型用于预测:

data = poly_reg.fit_transform(test_X)
pred = lin_reg_3.predict(data)
print(pred) 

结果:

[ 830.64251041 1127.88919544 1457.47841358 1814.48141575 2193.96944141]

在这个训练集的基础上,预测2019年的销售额是2193亿,和真实的2684亿还是差了点。不过这样看不是很直观,让我们可视化一下数据,并逐渐增加训练集。

3.数据可视化

用 matplotlib 可以非常简单地实现这一步,设定X轴范围—绘制数据点—绘制线,最后加上横纵轴说明。

# 数据可视化
# X轴
X = np.arange(2009, 2020).reshape([-1, 1])
# 蓝色显示训练数据点
plt.scatter(datasets_X, datasets_Y, color='blue')
# 红色显示真实数据点
plt.scatter(test_X, real_Y, color='red')
# 黄色显示预测数据点
plt.scatter(test_X, pred, color='yellow')

plt.plot(X, lin_reg_3.predict(poly_reg.fit_transform(X)), color='black')
plt.xlabel('年份')
plt.ylabel('销售额(亿)')
plt.show() 

结果如下,蓝色点是训练值,红色点是真实值,而黄色的点是预测值:

训练集增加2015年的真实数据,结果如下:

有意思,真实值反而比预测值低了,说明2015年这一年的成交额非常优秀。

再增加2016年的真实数据到训练集里看一下。

现在,2017年、2018年的预测值非常接近,预测2019年的销售额是2507.3990亿元,离真实的2684亿差了100多亿。让我们继续增加2017年的真实数据到训练集中,预测2018年和2019年的销售额。

优秀,不过2019年预测的销售额为2750亿,略高于真实值2684亿,我们最后将2018年真实值加入到训练集中,看看2019年该模型的预测值是多少。

惊呆了,小红点和小黄点完美重合。按照这个模型,2020年的双十一销售额将会是3293亿元。

关注文章最下方Python实用宝典公众号二维码,回复 天猫销售额预测 或阅读原文下载查阅本模型完整源代码:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score

# 指定默认字体否则图片显示不了中文
from pylab import mpl
mpl.rcParams['axes.unicode_minus'] = False # 解决符号显示问题
mpl.rcParams['font.sans-serif'] = ['FangSong']

# 数据集
datasets_X = [2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
datasets_Y = [0.52, 9.36, 52.0, 191, 350, 571, 912, 1207, 1682, 2132]
test_X = [2019]
real_Y =  [2684]

# 数据预处理
dataset_length = len(datasets_X)
test_length = len(test_X)
# 将数据转化为numpy数组
datasets_X = np.array(datasets_X).reshape([dataset_length, 1])
test_X = np.array(test_X).reshape([test_length, 1])
datasets_Y = np.array(datasets_Y)
real_Y = np.array(real_Y)

# 数据建模
# 构造三次多项式特征
poly_reg = PolynomialFeatures(degree=3)
X_poly = poly_reg.fit_transform(datasets_X)

# 使用线性回归模型学习X_poly和datasets_Y之间的映射关系
lin_reg_3 = LinearRegression()
lin_reg_3.fit(X_poly, datasets_Y)

data = poly_reg.fit_transform(test_X)
pred = lin_reg_3.predict(data)
print(pred)

# 数据可视化
# X轴
X = np.arange(2009, 2020).reshape([-1, 1])
# 蓝色显示训练数据点
plt.scatter(datasets_X, datasets_Y, color='blue')
# 红色显示真实数据点
plt.scatter(test_X, real_Y, color='red')
# 黄色显示预测数据点
plt.scatter(test_X, pred, color='yellow')

plt.plot(X, lin_reg_3.predict(poly_reg.fit_transform(X)), color='black')
plt.xlabel('年份')
plt.ylabel('销售额(亿)')
plt.show() 

如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python使用”先知”预测公众号未来的粉丝量

最近公众号的粉丝量一直都处于上涨状态,可喜可贺当然,作为一个上进的(摸鱼)公众号博主,当然要追求更远大的目标。我希望知道一个月后公众号的粉丝量会达到什么程度,并以此加强公众号的宣传方式。

正好,Facebook开源了一个名为“先知”(prophet)的模型,其能基于加法模型预测时间序列数据,它的非线性趋势与年、周、日的季节性以及假日效应相吻合。而且对丢失的数据和趋势的变化很健壮,通常能很好地处理异常值。

我们将根据 Python 实用宝典 最近60天的关注量变化趋势用来预测未来30天的关注量大小。

1. 安装fbprophet

现在,就让我们来试一下吧!首先是安装fbprophet, 这里的前提是大家都安装好了Python, 如果没有的话推荐看:python超详细安装指南,如果你按照官方的教程来进行安装, 你会发现TM啥也安装不上

第一步,我们需要安装fbprophet的依赖PyStan:

pip install pystan

第二步,使用conda命令安装(需要安装anaconda, 搜anaconda官网安装即可):

conda install -c conda-forge fbprophet
pip install fbprophet

2.导出公众号数据

这时候就要用F12大法了,在当前用户分析页空白处右键—检查,或者直接按F12打开开发者工具

然后选择最近两个月的数据,找到useranalysis的数据包,点开来就会找到我们需要的数据,把这一片json数据保存下来存为data.json文件即可,如下图所示。

3.处理数据

加载json数据:

import json

f = open('./data.json', 'r', encoding='utf-8')
json_data = json.load(f)
f.close()

print(json_data)

现在需要将日期和其对应的总粉丝数提取出来为一个pandas的dataframe. 如果你还没有安装 pandas,请在cmd/Terminal输入 pip install pandas 即可安装成功。

import pandas as pd
# 将日期和其对应的总粉丝数提取出来为一个pandas的dataframe
list_number = json_data['category_list'][0]['list']
df = pd.DataFrame(list_number)
print(df)

效果:

看得出来dataframe有点像字典和列表的集合,接下来就要开始进行预测了!

4.预测未来30天的数据

接下来需要生成prophet对象,调用预测函数,预测未来30天的数据变化:

from fbprophet import Prophet

# prophet内部需要将日期列设为ds,预测的值设为y
df.rename(columns={'date':'ds', 'cumulate_user':'y'}, inplace=True)

print(df)

# 调用"先知"生成对象
m = Prophet()

# 使用"先知对象"进行预测
m.fit(df)

# 获得未来30天的数据
future = m.make_future_dataframe(periods=30)

forecast = m.predict(future)
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())  

效果如下:

让我们来看看效果,表格中的yhat指的是预测的平均值,yhat_lower是预测的最小值,yhat_upper是预测的最大值。根据“先知”的预测,在未来30天内我们的粉丝量将会增加到529名粉丝,也就是说将增加16%。这个预测的值其实相对客观,我们一个月后就可以看看效果如何了。

关注下方的公众号,回复 ” 粉丝预测“即可获得全部源代码及数据。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典