【销售预测 ARIMA模型】ARIMA模型预测每天的销售额

2024-09-07 06:32

本文主要是介绍【销售预测 ARIMA模型】ARIMA模型预测每天的销售额,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

输入数据txt格式:
2017-05-01 100
2017-05-02 200
…….

python 实现arima:

# encoding: utf-8"""
function:时间序列预测ARIMA模型预测每天的销售额
author:dongli
date:2018-05-25
"""# 导入库
import numpy as np  # numpy库
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf  # acf和pacf展示库
from statsmodels.tsa.stattools import adfuller  # adf检验库
from statsmodels.stats.diagnostic import acorr_ljungbox  # 随机性检验库
from statsmodels.tsa.arima_model import ARMA  # ARMA库
import matplotlib.pyplot as plt  # matplotlib图形展示库
import prettytable  # 导入表格库
import pandas as pd  #导入数据处理库
from datetime import datetime,timedelta #导入时间库
import warnings
import time
time1=time.time()
from sklearn.externals import joblib  #模型导出
# 忽略提醒
warnings.filterwarnings("ignore")# 把字符串转成datetime
def string_toDatetime(string):''':param string: 日期字符串:return: 返回日期格式数据'''return datetime.strptime(string, "%Y-%m-%d")# 定义一个日期列表
def datelist(beginDate, endDate):''':beginDate string: 日期字符串:endDate string: 日期字符串:return: 返回日期格式列表'''# beginDate, endDate是形如‘20160601’的字符串或datetime 2018-04-23格式date_l=[datetime.strftime(x,'%Y-%m-%d') for x in list(pd.date_range(start=beginDate, end=endDate))]return date_l# 多次用到的表格
def pre_table(table_name, table_rows):''':param table_name: 表格名称,字符串列表:param table_rows: 表格内容,嵌套列表:return: 展示表格对象'''table = prettytable.PrettyTable()  # 创建表格实例table.field_names = table_name  # 定义表格列名for i in table_rows:  # 循环读多条数据table.add_row(i)  # 增加数据return table# 数据平稳处理
def get_best_log(ts, max_log=5, rule1=True, rule2=True):''':param ts: 时间序列数据,Series类型:param max_log: 最大log处理的次数,int型:param rule1: rule1规则布尔值,布尔型:param rule2: rule2规则布尔值,布尔型:return: 达到平稳处理的最佳次数值和处理后的时间序列'''if rule1 and rule2:  # 如果两个规则同时满足return 0, ts  # 直接返回0和原始时间序列数据else:  # 只要有一个规则不满足for i in range(1, max_log):  # 循环做log处理ts = np.log(ts)  # log处理adf, pvalue1, usedlag, nobs, critical_values, icbest = adfuller(ts)  # 稳定性(ADF)检验lbvalue, pvalue2 = acorr_ljungbox(ts, lags=1)  # 白噪声(随机性)检验rule_1 = (adf < critical_values['1%'] and adf < critical_values['5%'] and adf < critical_values['10%'] and pvalue1 < 0.01)  # 稳定性(ADF)检验规则rule_2 = (pvalue2 < 0.05)  # 白噪声(随机性)规则rule_3 = (i < 5)if rule_1 and rule_2 and rule_3:  # 如果同时满足条件# print ('The best log n is: {0}'.format(i))  # 打印输出最佳次数return i, ts  # 返回最佳次数和处理后的时间序列# 还原经过平稳处理的数据
def recover_log(ts, log_n):''':param ts: 经过log方法平稳处理的时间序列,Series类型:param log_n: log方法处理的次数,int型:return: 还原后的时间序列'''for i in range(1, log_n + 1):  # 循环多次ts = np.exp(ts)  # log方法还原return ts  # 返回时间序列# 稳定性(ADF)检验
def adf_val(ts, ts_title, acf_title, pacf_title):''':param ts: 时间序列数据,Series类型:param ts_title: 时间序列图的标题名称,字符串:param acf_title: acf图的标题名称,字符串:param pacf_title: pacf图的标题名称,字符串:return: adf值、adf的p值、三种状态的检验值'''# plt.figure()# plt.plot(ts)  # 时间序列图# plt.title(ts_title)  # 时间序列标题# plt.show()# plot_acf(ts, lags=20, title=acf_title).show()  # 自相关检测# plot_pacf(ts, lags=20, title=pacf_title).show()  # 偏相关检测adf, pvalue, usedlag, nobs, critical_values, icbest = adfuller(ts)  # 稳定性(ADF)检验table_name = ['adf', 'pvalue', 'usedlag', 'nobs', 'critical_values', 'icbest']  # 表格列名列表table_rows = [[adf, pvalue, usedlag, nobs, critical_values, icbest]]  # 表格行数据,嵌套列表adf_table = pre_table(table_name, table_rows)  # 获得平稳性展示表格对象# print ('stochastic score')  # 打印标题# print (adf_table)  # 打印展示表格return adf, pvalue, critical_values,  # 返回adf值、adf的p值、三种状态的检验值# 白噪声(随机性)检验
def acorr_val(ts):''':param ts: 时间序列数据,Series类型:return: 白噪声检验的P值和展示数据表格对象'''lbvalue, pvalue = acorr_ljungbox(ts, lags=1)  # 白噪声检验结果table_name = ['lbvalue', 'pvalue']  # 表格列名列表table_rows = [[lbvalue, pvalue]]  # 表格行数据,嵌套列表acorr_ljungbox_table = pre_table(table_name, table_rows)  # 获得白噪声检验展示表格对象# print ('stationarity score')  # 打印标题# print (acorr_ljungbox_table)  # 打印展示表格return pvalue  # 返回白噪声检验的P值和展示数据表格对象# arma最优模型训练
def arma_fit(ts):''':param ts: 时间序列数据,Series类型:return: 最优状态下的p值、q值、arma模型对象、pdq数据框和展示参数表格对象'''max_count = int(len(ts) / 10)  # 最大循环次数最大定义为记录数的10%bic = float('inf')  # 初始值为正无穷tmp_score = []  # 临时p、q、aic、bic和hqic的值的列表for tmp_p in range(max_count + 1):  # p循环max_count+1次for tmp_q in range(max_count + 1):  # q循环max_count+1次model = ARMA(ts, order=(tmp_p, tmp_q))  # 创建ARMA模型对象try:results_ARMA = model.fit(disp=-1, method='css')  # ARMA模型训练except:continue  # 遇到报错继续finally:tmp_aic = results_ARMA.aic  # 模型的获得aictmp_bic = results_ARMA.bic  # 模型的获得bictmp_hqic = results_ARMA.hqic  # 模型的获得hqictmp_score.append([tmp_p, tmp_q, tmp_aic, tmp_bic, tmp_hqic])  # 追加每个模型的训练参数和结果if tmp_bic < bic:  # 如果模型bic小于最小值,那么获得最优模型ARMA的下列参数:p = tmp_p  # 最优模型ARMA的p值q = tmp_q  # 最优模型ARMA的q值model_arma = results_ARMA  # 最优模型ARMA的模型对象aic = tmp_bic  # 最优模型ARMA的aicbic = tmp_bic  # 最优模型ARMA的bichqic = tmp_bic  # 最优模型ARMA的hqicpdq_metrix = np.array(tmp_score)  # 将嵌套列表转换为矩阵pdq_pd = pd.DataFrame(pdq_metrix, columns=['p', 'q', 'aic', 'bic', 'hqic'])  # 基于矩阵创建数据框table_name = ['p', 'q', 'aic', 'bic', 'hqic']  # 表格列名列表table_rows = [[p, q, aic, bic, hqic]]  # 表格行数据,嵌套列表parameter_table = pre_table(table_name, table_rows)  # 获得最佳ARMA模型结果展示表格对象# print ('each p/q traning record')  # 打印标题# print (pdq_pd)  # 打印输出每次ARMA拟合结果,包含p、d、q以及对应的AIC、BIC、HQIC# print ('best p and q')  # 打印标题# print (parameter_table)  # 输出最佳ARMA模型结果展示表格对象return model_arma  # 最优状态下的arma模型对象# 模型训练和效果评估
def train_test(model_arma, ts, log_n, rule1=True, rule2=True):''':param model_arma: 最优ARMA模型对象:param ts: 时间序列数据,Series类型:param log_n: 平稳性处理的log的次数,int型:param rule1: rule1规则布尔值,布尔型:param rule2: rule2规则布尔值,布尔型:return: 还原后的时间序列'''train_predict = model_arma.predict()  # 得到训练集的预测时间序列if not (rule1 and rule2):  # 如果两个条件有任意一个不满足train_predict = recover_log(train_predict, log_n)  # 恢复平稳性处理前的真实时间序列值ts = recover_log(ts, log_n)  # 时间序列还原处理ts_data_new = ts[train_predict.index]  # 将原始时间序列数据的长度与预测的周期对齐RMSE = np.sqrt(np.sum((train_predict - ts_data_new) ** 2) / ts_data_new.size)  # 求RMSEprint("均方根误差为:%s" %RMSE)# # 对比训练集的预测和真实数据# plt.figure()  # 创建画布# train_predict.plot(label='predicted data', style='--')  # 以虚线展示预测数据# ts_data_new.plot(label='raw data')  # 以实线展示原始数据# plt.legend(loc='best')  # 设置图例位置# plt.title('raw data and predicted data with RMSE of %.2f' % RMSE)  # 设置标题# plt.show()  # 展示图像return ts  # 返回还原后的时间序列# 预测未来指定时间项的数据
def predict_data(model_arma, ts, log_n,start, end,rule1=True, rule2=True):''':param model_arma: 最优ARMA模型对象:param ts: 时间序列数据,Series类型:param log_n: 平稳性处理的log的次数,int型:param start: 要预测数据的开始时间索引:param end: 要预测数据的结束时间索引:param rule1: rule1规则布尔值,布尔型:param rule2: rule2规则布尔值,布尔型:return: 无'''m1=string_toDatetime(end)-string_toDatetime(start)# 预测未来指定时间项的数据predict_ts = model_arma.predict(start=len(ts)-5, end=len(ts)+m1.days+1)beginDate =ts.index[len(ts)-6]endDate = string_toDatetime(end)m = datelist(beginDate, endDate)# print(m)print ('-----------predict data----------')  # 打印标题if not (rule1 and rule2):  # 如果两个条件有任意一个不满足predict_ts = recover_log(predict_ts, log_n)  # 还原数据predict_ts_dataframe=pd.DataFrame(predict_ts,columns = ['number'])# print(predict_ts_dataframe)predict_ts_dataframe['day']=mpre_result=predict_ts_dataframe[predict_ts_dataframe['day']>=start]kk=list(pre_result.loc[:,'number'].apply(lambda x: x*10))# 展示预测数据pre_result2=pd.DataFrame({"day":pre_result['day'],"number":kk})print(pre_result2)#####输出csvpre_result2.to_csv("C:\\Users\\xiaohu\\Desktop\\销售数据预测\\训练数据\\pre_result2.csv", index=False)if __name__ == '__main__':# 读取数据# date_parse = lambda dates: pd.datetime.strptime(dates, '%Y/%m/%d')  # 创建解析列的功能对象# df = pd.read_table('C:\\Users\\xiaohu\\Desktop\销售数据预测\\训练数据\\train_2018.txt', delimiter='\t', index_col='date', date_parser=date_parse)  # 读取数据# 读取数据date_parse = lambda dates: pd.datetime.strptime(dates, '%Y-%m-%d')  # 创建解析列的功能对象df = pd.read_table('C:\\Users\\xiaohu\\Desktop\\book\\chapter4\\time_series4.txt', delimiter='\t', index_col='date',date_parser=date_parse)  # 读取数据# print(df)ts_data = df['number'].astype('float32')  # 将列转换为float32类型# print ('data summary')  # 打印标题# print (ts_data.describe())  # 打印输出时间序列数据概况# 原始数据检验adf, pvalue1, critical_values = adf_val(ts_data, 'raw time series', 'raw acf', 'raw pacf')  # 稳定性检验pvalue2 = acorr_val(ts_data)  # 白噪声检验# 创建用于区分是否进行平稳性处理的规则rule1 = (adf < critical_values['1%'] and adf < critical_values['5%'] and adf < critical_values['10%'] and pvalue1 < 0.01)  # 稳定性检验rule2 = (pvalue2[0,] < 0.05)  # 白噪声检验# 对时间序列做稳定性处理log_n, ts_data = get_best_log(ts_data, max_log=5, rule1=rule1, rule2=rule2)# 再次做检验adf, pvalue1, critical_values = adf_val(ts_data, 'final time series', 'final acf', 'final pacf')  # 稳定性检验pvalue2 = acorr_val(ts_data)  # 白噪声检验# 训练最佳ARMA模型并输出相关参数和对象# model_arma = arma_fit(ts_data)# sklearn中提供了高效的模型持久化模块joblib,将模型保存至硬盘。#joblib.dump(model_arma, 'C:\\Users\\xiaohu\\Desktop\\销售数据预测\\训练数据\\model_arma_day.model')# 模型导出model_arma = joblib.load('C:\\Users\\xiaohu\\Desktop\\销售数据预测\\训练数据\\model_arma_day.model')# 模型导入## 模型训练和效果评估ts_data = train_test(model_arma, ts_data, log_n, rule1=rule1, rule2=rule2)# print(ts_data)# # 模型预测应用start ='2018-06-04'  # 设置预测开始的时间索引end ='2018-06-10'  # 设置预测结束的时间索引predict_data(model_arma, ts_data, log_n,start,end ,rule1=rule1, rule2=rule2)  # 预测时间序列数据time2=time.time()print('总共耗时:' + str(time2 - time1) + 's')

这篇关于【销售预测 ARIMA模型】ARIMA模型预测每天的销售额的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144325

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

AI Toolkit + H100 GPU,一小时内微调最新热门文生图模型 FLUX

上个月,FLUX 席卷了互联网,这并非没有原因。他们声称优于 DALLE 3、Ideogram 和 Stable Diffusion 3 等模型,而这一点已被证明是有依据的。随着越来越多的流行图像生成工具(如 Stable Diffusion Web UI Forge 和 ComyUI)开始支持这些模型,FLUX 在 Stable Diffusion 领域的扩展将会持续下去。 自 FLU

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者