Prophet,Echarts,D3的巧妙结合!
本系统由于功能点较多,且背后涉及的算法难易程度相差较大,主体有两个重点的算法支持(这里只介绍prophe时间序列预测算法),可视化方面则是对大数据背后潜在的规律经过特点分析之后再进一步完成探索与呈现。
Prophet时间序列模型,对于官方的介绍CSDN与知乎已经近乎完备(且官方)地将其介绍了一遍,由于该算法相较于其他预测算法较为冷门(创造晚,最开始以美国橄榄球联盟的数据演示),因此知道的人较少,你搜索的结果与我应该是一致的。我直接从实践开始。
算法环境的安装,一路走来,碰上了需要大坑小坑,最完备且最好的方法应该是这一篇博客,十分建议使用 Anaconda 来完成环境的配置,安装教程
经过简单的阅读后就可以了解到该算法的输入与输出。我们将原始数据(一个20G的CSV文件)中的无用数据进行清洗,仅提取我们所需的时间与记录人次。最终生成了一个仅包含两列数据 (ds:datatimes与y:yard) 的csv。完成了自2016起三年来山东某城市当日的医保就诊人次,自此数据处理部分大致完成。
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
df = pd.read_csv('per_year.csv')#读取数据
print(df)
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=365)#期望预测的天数
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
print(forecast)
print(type(forecast))
forecast.to_csv('ans_per_year.csv')#将结果详细地保存至本地,便于下一步的分析
fig1 = m.plot(forecast)plt.show()
fig2 = m.plot_components(forecast)
plt.show()
在算法的运行过程中得到预测的结果和计算过程中的中间值,如trend,yearly,weekly等。而最后的结果则保存在我们生成的csv中,ds与yhat。至此,算法的应用方面已经结束,接下来就是可视化部分的内容了。
Echarts实现上下区间折线图
完成了数据的处理与分析部分,下一步便是将数据以更加美丽的效果呈现出来。个人认为prophet算法所绘制的图像已经很完美了,那接下来就是用echarts实现就好,但无论是官方案例还是社区设计都没找到类似的视图,所以在不断地给自己挖坑填坑中,终于完成了自己想要的效果(其实也就是一个折线图线下面积的覆盖)。texts = [
'2019-01',
'2019-02',
'2019-03',
'2019-04',
'2019-05',
'2019-06',
'2019-07',
'2019-08',
'2019-09',
'2019-10',
'2019-11',
'2019-12'
];
bottoms = [
302696097.3, 278774528.06, 314490881.94, 310058672.38, 326202799.18,
321275450.04, 337614652.25, 343328916.43, 337786361.29, 354685773.07,
348601725.65, 353961942.99
];
tops = [
302750270.98, 279172163.42, 315505591.93, 311841576.24, 329079323.83,
325138195.0, 342906904.41, 349976989.91, 345451548.56, 364023669.31,
359209396.65, 366020835.59
];
real = [
302723999.22, 278968855.48, 314992752.21, 310969426.13, 327677395.13,
323244887.03, 340362038.05, 346808332.0, 341758696.9, 359492974.92,
354034157.79, 360071269.7
];
var option = {
title: { text: '2019年医保支出预测trend分析', left: 'auto' },
legend: { data: ['trend上界', 'trend下界', '预测值'], top: 30 },
tooltip: {
trigger: 'axis',
axisPointer: { type: 'cross', label: { backgroundColor: '#6a7985' } }
},
grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
xAxis: [
{
type: 'category',
boundaryGap: false,
axisLine: { onZero: false },
data: texts
}
],
yAxis: {
name: 'trend',
type: 'value',
splitLine: { show: false },
max: 375000000,
min: 275000000
},
series: [
{
name: 'trend上界',
type: 'line',
symbol: 'none',
areaStyle: { color: '#0000CD', origin: 'start', opacity: 0.3 },
color: 'blue',
data: tops
},
{
name: 'trend下界',
type: 'line',
symbol: 'none',
areaStyle: {
color: '#FFFFFF',
origin: 'start',
shadowColor: '#F3F3F3',
shadowOffsetX: 1
},
color: '#87CEFA',
data: bottoms
},
{ name: '预测值', type: 'line', symbol: 'none', color: 'red', data: real }
]
};
碎碎念
PS :本文首发时间为2021- 08 - 20。在整体工作中,个人觉得有些许价值和意义值得再次整理的工作差不多就这些了。因为这个机会,外出出差也是第一次,看到了许多,也学到了不少,更重要的是,了解到了一些接近金字塔顶尖的人的工作吧,感受颇多,同样最后 Wish u all the best.