时间序列的分析和预测ARIMA

分析的数据来自一个kaggle的比赛数据,是一组维基百科页面的浏览量数据,对数据进行简单的分析和处理,预测未来的流量.数据包含部分网页从2015年7月1日到2016年12月31日的每天的浏览量数据,数据有存在缺失,网页的类型包含多个语种.
下面是数据的部分截图:
这里写图片描述
Page为网页的地址,列标签为日期,值为每日的浏览量.

下面倒入用到的python库和类

import numpy as np 
import pandas as pd 
import re 
import matplotlib.pyplot as plt 
from statsmodels.tsa.arima_model import ARIMA 

读取数据

train_df = pd.read_csv('webLL/train_1.csv').fillna(0) # 用0来补充缺失值

转换数据类型,释放内存空间

# 数据为浮点数类型的整数,消耗内存较大,转换为整型数据释放一些内存600M减少到300M
for col in train_df.columns[1:]:
    train_df[col] = pd.to_numeric(train_df[col],downcast='integer')

正则表达提取网页的语种信息

# 正则表达匹配的对象是一个不可迭代的对象,可以通过group()转换为一个字符串对象
def get_language(page):
    res = re.search('[a-z][a-z].wikipedia.org',page)
    if res:
        return res.group()[:2]
    return 'na'

新增语言列

train_df['lang'] = train_df['Page'].map(get_language)

用一个字典对象来保存,不同语言的网页的流量数据,key为语言标记,value为对应的dataFarame对象

lang_sets = {}
lang_sets['en'] = train_df[train_df.lang=='en'].iloc[:,0:-1]
lang_sets['ja'] = train_df[train_df.lang=='ja'].iloc[:,0:-1]
lang_sets['de'] = train_df[train_df.lang=='de'].iloc[:,0:-1]
lang_sets['na'] = train_df[train_df.lang=='na'].iloc[:,0:-1]
lang_sets['fr'] = train_df[train_df.lang=='fr'].iloc[:,0:-1]
lang_sets['zh'] = train_df[train_df.lang=='zh'].iloc[:,0:-1]
lang_sets['ru'] = train_df[train_df.lang=='ru'].iloc[:,0:-1]
lang_sets['es'] = train_df[train_df.lang=='es'].iloc[:,0:-1]

计算每种语言wiki页面的日平均流量

sums = {}
for key in lang_sets:
    sums[key] = lang_sets[key].iloc[:,1:].sum(axis=0) / lang_sets[key].shape[0]
# 字典转换为DataFrame对象绘图方便,Nan表示在网页的地址中没有明确表示文字格式
traffic_sum = pd.DataFrame(sums) 
 

更新列名

traffic_sum.columns=['German','English','Spanish','French','Japanese','Nan','Russian','Chinese'] 
traffic_sum.plot(figsize=(12,6))
plt.show()

每种语言wiki页面15/7/1-16/12/31的日平均浏览量
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a6qQAkgi-1680055495717)(output_16_0.png)]这里写图片描述

下面利用上面的数据绘制不用wiki页面浏览数据的自相关和部分自相关图,以估计用于训练ARIMA模型的超参数。

from statsmodels.tsa.stattools import pacf
from statsmodels.tsa.stattools import acf

for key in sums:
    fig = plt.figure(1,figsize=[12,4])
    ax1 = fig.add_subplot(121)
    ax2 = fig.add_subplot(122)
    data = np.array(sums[key])
    autocorr = acf(data)
    pac = pacf(data)

    x = [x for x in range(len(pac))]
    ax1.plot(x[1:],autocorr[1:])
    ax1.grid(True)
    ax1.set_xlabel('Lag')
    ax1.set_ylabel('Autocorrelation')
    
    ax2.plot(x[1:],pac[1:])
    ax2.grid(True)
    ax2.set_xlabel('Lag')
    ax2.set_ylabel('Partial Autocorrelation')
    print(key)
    plt.show()
俄语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBaI5Vx3-1680055495718)(output_18_1.png)]这里写图片描述

日语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZ6MSzsM-1680055495718)(output_18_3.png)]这里写图片描述

法语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFdLimFs-1680055495719)(output_18_5.png)]这里写图片描述

德语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaeyHAxf-1680055495719)(output_18_7.png)]这里写图片描述

英语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Crf3u8DH-1680055495719)(output_18_9.png)]这里写图片描述

汉语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAWbU2Is-1680055495720)(output_18_11.png)]这里写图片描述

na

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ej5w5RcE-1680055495720)(output_18_13.png)]这里写图片描述

西班牙

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uw8tbMlV-1680055495720)(output_18_15.png)]这里写图片描述

观察上面的图表

  1. 英语,俄语,法语,Nan语种页面的浏览量的自相关系数都有较快的收敛,序列比较平稳,所以不需要在进行处理.其他的时间序列有明显的周期性趋势,并没有较好的收敛,需要对序列进行处理,这里通过一阶差分来是序列趋于平稳.
  2. 对于日语,汉语,德语和西班牙语他们的流量数据下的自相关系数没7天左右会出现一个高峰,阶数P取7,其他的取3/4都ok,特别在意的话可以查找更多关于ARIMA模型定阶的资料.
  3. 平稳序列的部分相关系数都有较快的收敛,所以q=0,非平稳序列的收敛情况不一,为了方便计算,统一q=1.总之定阶的问题,我也比较头疼,还在摸索.

下面对不同语言的序列用ARIMA模型进行预测未来的流量

params = {'en': [4,1,0], 'ja': [7,1,1], 'de': [7,1,1], 'na': [4,1,0], 
          'fr': [4,1,0], 'zh': [7,1,1], 'ru': [4,1,0], 'es': [7,1,1]}

for key in sums:
    data = np.array(sums[key])
    result = None
    arima = ARIMA(data,params[key])
    result = arima.fit(disp=False)
    #print(result.params)
    pred = result.predict(2,599,typ='levels')
    x = pd.date_range('2015-07-02','2017-02-18')

    
    print(key)
    plt.figure(figsize=(10,5))
    plt.plot(x[:548],data[2:] ,label='Data')
    plt.plot(x,pred,label='ARIMA Model')
    plt.xlabel('Days')
    plt.ylabel('Views')
    plt.legend()
    plt.show()

俄语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MrTdj6m0-1680055495720)(output_23_1.png)]这里写图片描述

日语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2Lsk6zx-1680055495721)(output_23_3.png)]这里写图片描述

法语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNzFl2KJ-1680055495721)(output_23_5.png)]
这里写图片描述

德语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vx5sxH9k-1680055495721)(output_23_7.png)]这里写图片描述

英语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-40uAVxuq-1680055495722)(output_23_9.png)]这里写图片描述

汉语

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8g0bdHI-1680055495722)(output_23_11.png)]这里写图片描述

na

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfSBTArI-1680055495722)(output_23_13.png)]这里写图片描述

西班牙

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DUNSnvG2-1680055495722)(output_23_15.png)]这里写图片描述

  • 6
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 43
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值