基于Python的情人节鲜花销售分析预测可视化平台设计与实现的详细项目实例
请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人
或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详解)
情人节鲜花销售在现实商业中通常具有明显的“节日高峰”特征:平时销量相对平稳,接近情人节前一到两周开始快速增长,在情人节当天达到峰值,节日过后迅速回落。这种集中度极高、持续时间极短的销售周期,给鲜花商家带来了非常典型但又复杂的经营问题:一方面,如果备货不足,就容易出现爆单缺货,导致客户体验极差、差评增多、平台权重下降以及长期客源流失;另一方面,如果盲目大量进货,又会在节日过后形成严重积压,鲜花作为高度易腐商品,只能以极低折扣甩卖甚至直接报废处理,造成巨大的利润损失。因此,如何利用数据分析和算法预测,尽可能精确地把握情人节前后各个时间段的销量变化,成为鲜花电商和线下花店都非常迫切的需求。
在实际运营场景中,情人节鲜花销售不仅受到节日本身影响,还会受到天气变化、工作日与周末的差异、区域消费能力、线上平台活动力度、往年价格区间、物流履约能力等多重因素的共同作用。一些规模较小的花店通常依赖经验决策:店主根据多年经营积累的印象,对某一年的情人节销量做出主观判断。然而,经验往往不够稳定,也很难准确量化外部环境的变化,例如某一年平台加大补贴力度、某一年遇到极端天气、某一年线上短视频平台带来的额外流量等。为此,需要构建一个基于Python的数据分析和可视化平台,通过系统化的历史数据整理、特征挖掘和时间序列建模,形成可重复、可量化、可验证的决策依据。
Python生态在数据分析与可视化领域具有成熟、丰富且开源友好的优势。通过pandas、NumPy等工具能够高效处理历史销售数据,通过Matplotlib、Seaborn、Plotly等工具能够构建直观易懂的可视化图表,通过scikit-learn、statsmodels等工具可以快速实现回归预测、时间序列建模与模型评估。此外,还可以采用Streamlit或Dash等组件,构建交互式的网页平台,让非技术人员也能通过点击和选择操作,从复杂数据中获得清晰直观的洞察。这种从数据到可视化再到预测和决策的完整链路,非常适合情人节鲜花销售这种具有明显季节性与周期性的场景。
基于Python的情人节鲜花销售分析预测可视化平台,目标不仅是展示历史销量曲线,还需要从多个维度对业务进行拆解:例如不同花材(玫瑰、郁金香、满天星等)的销量占比走势,不同价位区间套餐的销售构成,不同城市的区域差异,线上线下渠道的贡献比例,以及节前不同天数下单的提前期分布等。通过这些多维分析,可以帮助经营者识别最畅销的组合、最有潜力的价格带、最敏感的促销点。同时,通过设计合理的预测模型,利用历史情人节数据对未来某一年情人节期间的销量进行量化预测,并将结果以图表形式呈现,为进货计划、人员排班、配送能力预留等提供有依据的支持。
在平台层面,还可以对不同模型进行对比:例如简单的移动平均模型、ARIMA时间序列模型、支持向量回归、随机森林回归乃至基于梯度提升的XGBoost等。通过对比不同模型的预测效果与误差指标,帮助业务方理解模型的稳定性与适用范围。结合可视化平台的交互设计,还可以允许用户选择不同的模型,观察不同算法对同一数据的预测结果差异。这种“技术透明化”的方式,一方面提升了模型的可解释性,另一方面也有助于业务方参与到模型改进中,共同优化特征选择和业务规则。
因此,构建一个基于Python的情人节鲜花销售分析预测可视化平台,不仅是对数据科学和工程技术的一次系统实践,更是将数据能力实实在在嵌入到鲜花零售业务运营中的关键举措。通过科学的方法减少浪费、提高履约体验、优化库存结构和资金占用,可以实实在在提升企业盈利能力,也能让终端消费者在重要节日中以更合理的价格、更稳定的服务买到满意的鲜花。
项目目标与意义
提升情人节期间库存管理与进货决策精度
库存管理是鲜花类商品的核心命题,情人节期间尤为突出。情人节销售高峰通常集中在极短的几天内,既有提前预定,又有大量临时下单,任何环节判断错误都会放大经营风险。基于Python的数据分析平台,通过对历史情人节的销售情况进行细分统计,可以拆解为单日销量、小时级别峰值、不同套餐结构、不同花材单品需求、不同城市的差异等,从而帮助经营者更细致地理解销售规律。通过时间序列预测模型,可以对未来某一年情人节前后的日销量做出区间性预测,将结果映射为需要预定的花材数量、包装物料数量及配送运力需求。平台不仅给出总量预测,还可以给出按花材和价格带分解的预估,这一点对于花材采购尤其重要,因为不同花材的保鲜期和供应链稳定性并不相同,需要采用不同的安全库存策略。借助系统化预测结果,可以避免“宁愿多进货也不敢缺货”的极端保守策略,减少积压损耗,同时确保核心爆款套餐不会在高峰期断货。
支撑精细化营销活动方案制定
情人节期间的营销活动种类繁多,包括满减优惠、折扣套餐、限时秒杀、早鸟预定福利、会员专属礼盒等。不同活动形式对销量的拉动效果并不一致,往往受到价格区间、目标人群、渠道定位等多因素影响。数据分析与预测平台可以通过历史数据对各种活动策略进行归因分析。例如统计近几年的情人节期间,在不同促销类型、不同折扣力度下,销量相较于平时基线的提升比例;结合价格与销量的弹性曲线,分析在某一价格档位下促销带来的边际收益。通过可视化界面展示某些活动是否导致大量低利润订单,或者是否带动了高附加值定制花束的联动销售。基于这些洞察,可以帮助运营端设计更有针对性的营销策略,如针对提前下单人群提供早鸟优惠,引导消费者在物流压力较小的时间下单;对于高客单价人群,推出高端礼盒和捆绑巧克力、玩偶等组合,提高整体客单价。在平台中还可以构建简单的场景模拟,例如调整折扣力度参数,估算理论销量变化范围,为运营决策提供可视化的试算工具。
优化人力排班与物流履约能力规划
情人节鲜花销售的另一个显著特征是对人力与物流的集中需求。花束制作需要熟练花艺师完成,物流配送需要骑手或快递员在限定时段送达,而这些资源不可能在日常保持情人节的峰值配置。基于预测平台,可以将销量预测进一步转化为运营资源需求预测:例如每束花平均制作时间、每位花艺师的高峰小时生产能力、每单配送的平均时间和路径、不同区域的下单集中度等。通过这些参数,可以计算各天、各时间段需要的花艺师数量、临时工数量、配送骑手数量等,并通过可视化方式展示为排班建议图。对于运营团队而言,这种量化的排班参考比经验排班更加科学,可以提前做好兼职招聘、外包协调和配送路线规划。此外,平台还可以记录每一年实际履约情况,如订单准时率、延误订单数量、投诉率等指标,与销量预测和人员配置对照,逐步优化经验参数。长期迭代后,平台不仅是一个销量预测工具,也是一个人力与物流资源预测和优化工具,帮助企业提升整体履约质量和客户满意度。
提升数据驱动决策能力与管理透明度
情人节鲜花销售分析预测可视化平台的建设,不仅解决单一节日的经营问题,更重要的意义在于推动企业整体数据化和智能化升级。通过平台建设,可以规范数据采集和存储过程,将原本分散在不同系统中的订单数据、库存数据、营销数据、物流履约数据整合到统一的数据结构中,并通过统一的可视化平台呈现。管理层可以从平台上直接看到过去数年的情人节表现,包括销售规模、利润率变化、不同城市表现、不同渠道权重以及各种运营策略效果,从而获得更全面和直观的经营画像。中层和一线业务人员也能通过平台中的图表和预测结果,理解自身负责环节在整体链路中的作用,减少“各自为战”的信息孤岛现象。此外,通过数据驱动的方式让决策过程更加透明,模型的预测逻辑和误差情况可以被量化和解释,避免单纯依赖少数人的个人判断。长远来看,这种平台化能力可以在其他节日如七夕、母亲节以及婚庆旺季复用,形成一整套覆盖全年重要节日的预测与分析体系,为企业在激烈的市场竞争中提供更稳固的数据基础。
项目挑战及解决方案
数据稀疏、周期长与季节性强带来的建模困难
情人节销售数据与日常销售行为存在巨大差异,属于高度季节性、短周期爆发的典型场景。平时的销售数据无法直接代表情人节的真实需求,而每年情人节只有一组高峰数据,长时间尺度上每年只有几天对建模特别重要,这就导致模型可直接利用的“高价值样本”数量有限。早期年份的业务模式可能与近期存在较大差异,例如价格区间提升、渠道结构变化、平台规则改版等,这会削弱历史数据对当前预测的参考价值。面对这些挑战,平台在数据处理和建模方案上需要特别设计。首先,需要在数据预处理阶段进行细致分层,将情人节前后时间窗口的数据单独标记,构建针对节日的子数据集,通过特征编码引入“节日标志”和“节前天数”等特征,将节日效应显式纳入模型考量。其次,可以利用多年来的趋势信息,通过归一化和指数加权等方式对旧年份数据进行“折旧”处理,让模型更关注近期年份的结构性变化,同时仍然保留整体季节性规律。再者,建模时需要结合时间序列模型和机器学习模型共同使用,例如将ARIMA或季节性ARIMA用于捕捉整体时间变化趋势,再通过随机森林或梯度提升等模型利用日期、节日标志、营销活动等丰富特征进行补充预测,并对两者结果进行加权融合。同时,平台可以设计交互式参数,让使用者调节模型对历史年份的权重,适应业务快速变化的节奏。
数据质量参差不齐与多源数据融合问题
实际业务环境中的数据往往存在缺失、重复、异常、错填等多种质量问题,尤其是早期系统建设不完善阶段的历史数据,可能出现订单时间不准确、商品名称不统一、价格字段缺失、促销信息未记录等情况。同时,情人节销售过程涉及多个系统:订单系统、仓储系统、财务系统、物流系统,数据分散在不同数据库或文件中,字段命名不一致、时间格式不同、编码标准不同,多源数据融合成为一大难点。针对这些问题,平台需要设计一整套稳健的数据预处理流程和数据质量监控机制。通过Python的pandas库对原始数据进行批量清洗,包括处理缺失值、识别与纠正明显异常值、统一时间格式和货币单位等。对商品名称可以构建映射表,将历史上多种写法的同一套餐归一为统一编码,对渠道来源、城市名称也进行标准化。在多源数据融合阶段,需要根据订单编号、用户ID、时间戳等关键字段进行关联,确保一条订单在销售、库存、物流三个维度上的记录可以正确对齐。平台中还可以加入数据质量统计报表:例如显示每一年度的缺失比例、异常订单数量、合并后的覆盖率等,让管理层清晰了解数据基础的可靠性。同时,对于无法纠正的历史数据,可以在模型训练中赋予较低权重,避免对预测结果造成过大干扰。通过这些措施,平台得以在复杂多源数据环境中构建相对稳定可靠的数据基础层,为后续分析和建模提供有效支撑。
模型可解释性不足与业务理解之间的矛盾
在节日场景下,为了提升预测准确性,容易倾向于使用复杂的机器学习模型,例如随机森林、XGBoost或神经网络等。这类模型在处理非线性、多特征交互问题时往往效果较好,但天然存在可解释性不足的问题:业务人员难以直观理解模型为什么做出某个预测,这在涉及重大采购与人力安排决策时,容易导致管理层对模型结果持怀疑态度。为解决这一矛盾,平台设计时需要把“可解释性”视为一等公民,与预测精度同等重要。具体做法包括:在选择模型时引入对比机制,不只提供一个“最强黑箱模型”,而是同时训练线性回归、时间序列模型等相对简单、可解释性高的模型,让业务方看到不同复杂度模型的预测表现与误差差异。在平台界面中展示各特征的重要性排名,例如节前几天的时间特征、价格折扣、天气状况、渠道类型等对预测销量的贡献度,并通过条形图形式呈现。还可以利用SHAP值或类似工具,对单个预测结果给出特征分解,说明某些因素如何拉高或压低预测值。此外,还需在平台文档与交互界面中,用通俗语言解释模型的基本逻辑,如“模型认为节前2天和节前1天的销量对节日当天预测影响最大”。通过这些可视化与文字说明,将技术细节尽量转化为业务可理解的表述,缩小算法世界与业务世界之间的沟通鸿沟。在实践过程中,平台还应支持业务人员反馈;例如当预测结果与一线感知偏差较大时,可以记录并分析原因,迭代模型或调整特征,从而不断提升业务信任度与实际效果。
项目模型架构
数据采集与存储层设计
模型架构的底层是数据采集与存储层,用于接收并保存历史和实时销售数据,为后续分析和建模提供基础。情人节鲜花销售相关的数据来源主要包括订单系统、商品信息系统、库存管理系统、营销活动系统和物流系统等。不同系统的数据结构与接口方式可能不同,有的通过数据库连接,有的通过CSV或Excel导出,有的则可能以API形式提供。数据采集层通过Python脚本定时从这些来源中抽取数据,采用统一的字段命名规范进行整合,例如统一使用order_id表示订单编号,product_id表示商品编号,order_date表示订单日期时间等。对于存储方式,可以采用关系型数据库如MySQL或PostgreSQL,也能使用CSV文件或Parquet文件的形式,当数据量较大时Parquet格式更适合后续分析。数据采集阶段的核心是保证数据字段完整、时间戳准确和编码统一。架构上可以设置一个“原始数据区”保存未经清洗的原始数据,用于追溯和审计;然后通过清洗脚本生成“标准数据区”,用统一格式和编码存储。此层对于整个模型架构相当于“地基”,一旦字段错误或时间错乱,后续分析都会受影响,因此在架构设计时需要强调数据源记录规范和采集流程自动化,减少人工手动导出带来的风险。
数据清洗与特征工程层
在标准化存储基础上,数据清洗与特征工程层负责将原始数据转换成可供模型直接使用的结构。清洗步骤包括处理缺失值、剔除明显异常订单(如金额为负数、日期错位、数量异常大等)、合并重复记录、统一单位等。特征工程则是把业务经验转化为模型能理解的特征向量,以提高预测效果。对于情人节鲜花销售,典型的特征包括日期相关特征(年份、月份、是否周末、距情人节还有多少天等)、商品特征(花材种类、花束档位、是否热门套餐)、价格与促销特征(原价、折扣力度、是否满减活动)、渠道特征(线上平台、线下门店、社交平台推广等)、地区特征(城市、消费能力分级)以及天气特征(温度、是否雨雪等)。这些特征需要通过编码转换成数值,例如类别型特征可以采用独热编码,日期可以转化为数值形式,节日前后的天数可以作为连续变量输入模型。特征工程层还可以加入滚动统计特征,如最近7天的平均销量、最近3年的情人节平均增长倍数等,帮助模型捕捉时间依赖性。在架构上,这一层通常采用Python脚本在pandas中实现,通过函数化设计将各类特征生成步骤封装,以便后续迭代和扩展。特征工程层在整个模型架构中起到“连接业务与算法”的桥梁作用,既要对业务有深入理解,也要考虑算法的输入需求和计算效率。
模型层与算法选择策略
模型层是整个架构的核心,用于实现销量预测、趋势分析和场景模拟。针对情人节销售的季节性与非线性特征,模型层通常采用“多模型协同”的策略,而不是单一算法。基础模型可以使用时间序列模型,如ARIMA或季节性ARIMA(SARIMA),通过对历史销量时间序列的平稳化、差分、季节性识别,捕捉整体的趋势与周期性变化。这类模型在处理单变量时间序列时具有良好的解释性和理论基础。另一方面,机器学习回归模型如线性回归、支持向量回归、随机森林回归和梯度提升树等,可以利用前面构建的多种特征(日期、促销、天气等),捕捉复杂的非线性关系。架构中可以设置一个模型管理模块,对不同模型进行统一训练、保存、版本管理和评估,使用交叉验证或滚动预测的方式评估模型性能,对比误差指标如MAE、RMSE、MAPE等。在预测时可以采用模型集成策略,例如将时间序列模型的预测结果与机器学习模型的输出进行加权平均,权重可以依据历史表现动态调整。模型层还需要提供线上推理接口,支持可视化平台实时请求预测结果。同时,为了满足业务方对可解释性的要求,模型层中需要保存特征重要性信息,并提供接口供可视化层调用,展示对预测结果影响最大的特征。整体而言,模型层既要保证预测效果,又要考虑计算效率和部署方便性。
可视化与交互层设计
可视化与交互层是业务人员最直接使用的平台界面,负责将复杂的数据和模型结果转化为易于理解和操作的图表和交互组件。基于Python可以采用Streamlit或Plotly Dash等技术快速搭建网页式可视化应用。主要功能包括历史销量趋势展示、节前不同天数销量分布、各花材和套餐的销量构成、区域热力图、不同价格带销售情况、促销活动效果分析、模型预测结果对比等。用户可以在界面上选择时间范围、城市、渠道、花材等筛选条件,图表随之实时刷新。交互层还需要提供模型预测模块,允许用户选择某一未来年份的情人节日期,选择特定的城市和渠道,查看模型预测的日销量曲线和区间,甚至可以调整一些关键参数(如预估折扣力度、预期营销预算)进行简单的场景模拟。为了增强理解度,可视化层中还可以展示模型解释性内容,如特征重要性条形图、按特征分组的箱型图等,帮助用户理解销售变化背后的关键因素。架构上,交互层通过API或直接函数调用与模型层和数据层通信,从数据库或文件中读取数据,通过缓存技术提高响应速度。界面设计应简洁明了,避免技术细节堆砌,让非技术背景的运营人员也能轻松上手。
模型评估、监控与迭代优化机制
模型架构如果缺乏持续评估和监控,很容易在业务环境发生变化时失效。因此,在平台设计中需要引入专门的模型评估与监控模块,构成闭环优化机制。评估部分主要在模型训练和更新阶段使用,通过历史数据划分训练集与验证集,对不同模型与特征组合进行比较,记录各个模型的误差指标,同时记录其训练时间和复杂度,为模型选型提供数据支持。监控部分则在模型上线后持续运行,实时收集预测值与真实值之间的偏差,生成误差统计报表。例如展示节前每一天的预测误差、节日当天的峰值偏差、不同城市预测误差分布等。当监控发现误差持续超出设定阈值时,触发模型重训或参数调整提示。在架构上,监控模块可以定期从数据库中读取最新订单数据,与预测记录进行对比,同时记录当期营销活动与外部环境(如极端天气)情况,为事后分析提供依据。优化部分则是基于评估与监控结果不断迭代特征工程与模型结构,例如增加新的特征(视频平台推广力度、搜索热度指数)、尝试新的算法(如基于梯度 boosting 的LightGBM等),或者调整训练数据窗口(偏重近两年数据等)。通过这种持续循环,平台能够逐步贴合业务实际变化,保持预测能力的稳定和可靠,从而真正成为情人节鲜花销售决策的重要基础设施。
项目模型描述及代码示例
数据读取与基础预处理示例 import pandas as pd # 导入pandas库,用于处理表格数据,提供高效的数据结构和数据分析功能 data_path = "data/valentine_sales.csv" # 定义数据文件路径,约定CSV文件中存放历史情人节及日常销售记录 df = pd.read_csv(data_path, encoding="utf-8") # 读取CSV文件为DataFrame,指定UTF-8编码以兼容中文字段 df.columns = [col.strip().lower() for col in df.columns] # 将所有列名去除两端空格并转换为小写,便于后续统一引用 df["order_date"] = pd.to_datetime(df["order_date"]) # 将订单日期字段转换为日期时间类型,方便按时间排序和提取日期特征 df = df.sort_values("order_date").reset_index(drop=True) # 按订单日期升序排序,并重置索引,保证时间序列的有序性 df = df.drop_duplicates(subset=["order_id"]) # 根据订单编号去除重复记录,防止一笔订单被统计多次 df = df[df["quantity"] > 0] # 过滤掉商品数量小于等于零的订单,排除异常或取消订单 df = df[df["amount"] >= 0] # 过滤掉金额为负的记录,避免退款或错误数据干扰销售分析 df["date"] = df["order_date"].dt.date # 提取纯日期部分作为新字段,用于按天聚合和分析,不包含具体时间 daily_sales = df.groupby("date")["quantity"].sum().reset_index() # 按日期分组汇总数量,得到每天的总销量时间序列 daily_sales.columns = ["date", "daily_qty"] # 重命名汇总结果列,date表示日期,daily_qty表示日销量 daily_sales["date"] = pd.to_datetime(daily_sales["date"]) # 再次将date字段转为datetime,确保后续时间操作一致性 daily_sales = daily_sales.sort_values("date").reset_index(drop=True) # 按日期排序日销量表,保证时间序列顺序正确 日期特征与节日窗口特征工程示例 from datetime import datetime # 导入datetime模块,用于定义和计算特定节日日期 valentine_day_map = {year: datetime(year, 2, 14).date() for year in range(2018, 2026)} # 构建各年份情人节日期映射,便于后续查找 daily_sales["year"] = daily_sales["date"].dt.year # 从日期中提取年份,用于关联对应情人节日期和分年度分析 daily_sales["month"] = daily_sales["date"].dt.month # 提取月份,有助于分析月度季节性和节日集中月份的特征 daily_sales["day"] = daily_sales["date"].dt.day # 提取日期中的日字段,可用于可视化日粒度模式 daily_sales["weekday"] = daily_sales["date"].dt.weekday # 提取星期几,0代表周一,6代表周日,用于分析周末与工作日差异 daily_sales["is_weekend"] = daily_sales["weekday"].isin([5, 6]).astype(int) # 将是否周末转为0/1特征,用于回归模型输入 def get_valentine_date(row): # 定义函数,根据行数据中的年份返回该年的情人节日期 year = row["year"] # 从当前行中提取year字段 return valentine_day_map.get(year, None) # 从映射中获取对应情人节日期,如果不存在则返回None daily_sales["valentine_date"] = daily_sales.apply(get_valentine_date, axis=1) # 对每一行应用函数,标记当年的情人节日期 daily_sales["days_to_valentine"] = (daily_sales["valentine_date"] - daily_sales["date"]).dt.days # 计算当前日期距离情人节的天数差 daily_sales["is_valentine_period"] = daily_sales["days_to_valentine"].between(-1, 14).astype(int) # 将情人节前后窗口标记为1,以突出节日时段 daily_sales["is_valentine_day"] = (daily_sales["days_to_valentine"] == 0).astype(int) # 单独标记情人节当天,用于捕捉峰值特征 daily_sales["before_valentine"] = (daily_sales["days_to_valentine"] > 0).astype(int) # 标记情人节前日期,用于分析预订阶段的特征 daily_sales["after_valentine"] = (daily_sales["days_to_valentine"] < 0).astype(int) # 标记情人节后日期,用于观察回落速度和余量销售状况 daily_sales["days_to_valentine"] = daily_sales["days_to_valentine"].fillna(999) # 对没有情人节日期的年份用较大数填充,避免模型误解 基于ARIMA的时间序列预测示例 from statsmodels.tsa.statespace.sarimax import SARIMAX # 导入SARIMAX模型,用于构建带季节项的ARIMA时间序列模型 ts = daily_sales.set_index("date")["daily_qty"] # 将日销量按日期设为索引,得到按时间索引的一维时间序列 train_ts = ts[ts.index < "2023-01-01"] # 将2023年前的数据作为训练集,用于拟合时间序列模型 test_ts = ts[ts.index >= "2023-01-01"] # 将2023年及之后的数据作为测试集,用于检验预测性能 sarima_model = SARIMAX(train_ts, order=(1, 1, 1), seasonal_order=(1, 1, 1, 7)) # 构建SARIMAX模型,设置非季节阶数和7天周期季节项 sarima_result = sarima_model.fit(disp=False) # 拟合模型参数,关闭详细输出,以免训练过程打印大量中间信息 forecast_steps = len(test_ts) # 预测步数设为测试集长度,使预测区间与测试数据对齐 sarima_forecast = sarima_result.forecast(steps=forecast_steps) # 使用拟合模型进行多步预测,得到测试区间的预测序列 sarima_forecast.index = test_ts.index # 将预测结果索引对齐到测试集日期,便于误差评估和图形对比 sarima_df = pd.DataFrame({"actual": test_ts, "forecast": sarima_forecast}) # 将实际值与预测值组合成一个DataFrame,便于后续分析 sarima_df["error"] = sarima_df["forecast"] - sarima_df["actual"] # 计算每一天的预测误差,正值表示预测偏高,负值表示预测偏低 sarima_mae = sarima_df["error"].abs().mean() # 计算平均绝对误差,用于评估模型整体预测精度 基于随机森林的回归预测示例 from sklearn.ensemble import RandomForestRegressor # 导入随机森林回归器,用于构建非线性多特征回归模型 from sklearn.model_selection import train_test_split # 导入数据划分工具,用于拆分训练集和验证集 from sklearn.metrics import mean_absolute_error # 导入平均绝对误差指标,用于评价回归预测效果 feature_cols = ["year", "month", "weekday", "is_weekend", "is_valentine_period", "is_valentine_day", "before_valentine", "after_valentine", "days_to_valentine"] # 定义特征列列表,包含日期和节日相关特征 X = daily_sales[feature_cols] # 提取特征矩阵X,作为回归模型的输入数据 y = daily_sales["daily_qty"] # 提取目标变量y,即每日销量,用于训练模型 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=42) # 将数据随机划分为训练集和验证集,保证评价的独立性 rf_model = RandomForestRegressor(n_estimators=300, max_depth=12, random_state=42, n_jobs=-1) # 初始化随机森林回归模型,设置树数量、最大深度和并行选项 rf_model.fit(X_train, y_train) # 使用训练集数据拟合随机森林模型,学习特征与销量之间的非线性关系 y_pred_val = rf_model.predict(X_val) # 对验证集进行预测,得到模型在未见数据上的预测结果 rf_mae = mean_absolute_error(y_val, y_pred_val) # 计算随机森林模型在验证集上的平均绝对误差 importances = rf_model.feature_importances_ # 提取模型计算的特征重要性,用于分析各特征对销量预测的贡献度 feature_importance_df = pd.DataFrame({"feature": feature_cols, "importance": importances}).sort_values("importance", ascending=False) # 将特征与重要性组合成表,并按重要性降序排序 模型结果可视化示例(Matplotlib) import matplotlib.pyplot as plt # 导入Matplotlib绘图库,用于绘制静态折线图和柱状图 plt.figure(figsize=(12, 6)) # 创建一个新的图形窗口,设置宽度和高度以便图像清晰呈现 plt.plot(sarima_df.index, sarima_df["actual"], label="真实销量", color="blue") # 绘制真实日销量曲线,使用蓝色线条和中文标签 plt.plot(sarima_df.index, sarima_df["forecast"], label="SARIMA预测", color="red", linestyle="--") # 绘制SARIMA模型预测曲线,红色虚线表示 plt.title("情人节时期日销量真实值与SARIMA预测对比") # 设置图标题,说明展示的内容是预测与实际的对比 plt.xlabel("日期") # 设置横轴标签为日期,方便阅读时间轴 plt.ylabel("日销量(束)") # 设置纵轴标签为日销量束数,表明数据单位 plt.legend() # 显示图例,帮助区分真实值与预测值曲线 plt.grid(alpha=0.3) # 添加网格线以便于观察数值变化,设定透明度避免图面过于拥挤 plt.tight_layout() # 自动调整子图边距,使图形布局更紧凑不遮挡标签 plt.show() # 显示绘制好的图形窗口,供分析者观察预测效果 plt.figure(figsize=(8, 5)) # 再创建一个新的图形窗口用于绘制特征重要性柱状图 plt.bar(feature_importance_df["feature"], feature_importance_df["importance"], color="green") # 使用柱状图展示每个特征的重要性值 plt.xticks(rotation=45) # 将横轴特征名称旋转45度,避免文字重叠影响阅读 plt.title("随机森林模型特征重要性分析") # 设置图标题,说明该图展示的是各特征对模型的贡献度 plt.ylabel("重要性得分") # 设置纵轴为重要性得分,表示相对贡献程度 plt.tight_layout() # 调整布局以确保x轴标签完整显示 plt.show() # 显示特征重要性图表,便于业务人员理解模型关注点 Streamlit交互可视化平台示例代码片段 import streamlit as st # 导入Streamlit库,用于快速搭建交互式网页数据可视化应用 st.set_page_config(page_title="情人节鲜花销售分析平台", layout="wide") # 设置页面标题为平台名称,布局模式为宽屏,方便展示多图表 st.title("基于Python的情人节鲜花销售分析与预测可视化平台") # 在页面顶部显示平台主标题,突出平台主题和技术基础 st.sidebar.header("筛选条件") # 在侧边栏添加筛选条件标题,引导用户设置数据过滤参数 start_date = st.sidebar.date_input("开始日期", value=daily_sales["date"].min().date()) # 在侧边栏放置开始日期选择器,默认最早日期 end_date = st.sidebar.date_input("结束日期", value=daily_sales["date"].max().date()) # 在侧边栏放置结束日期选择器,默认最晚日期 mask = (daily_sales["date"] >= pd.to_datetime(start_date)) & (daily_sales["date"] <= pd.to_datetime(end_date)) # 构建布尔条件,筛选在起止日期范围内的数据 filtered = daily_sales[mask].copy() # 基于筛选条件得到新的DataFrame,包含用户指定时间范围内的记录 st.subheader("历史日销量趋势") # 在主区域添加小标题,说明下方图表展示历史日销量走势 st.line_chart(filtered.set_index("date")["daily_qty"]) # 使用Streamlit内置折线图组件展示日销量曲线,横轴为日期 st.subheader("节日窗口销量分布") # 添加小标题,说明下图展示节日前后窗口的销量分布情况 val_period = filtered[filtered["is_valentine_period"] == 1] # 选取处于情人节窗口的日期数据,用于分析节日期间特征 st.bar_chart(val_period.set_index("date")["daily_qty"]) # 用柱状图形式展示节日期间每天的销量,直观对比峰值和波动 st.subheader("预测示例:随机森林模型") # 添加小标题,说明下方展示基于随机森林模型的预测示例 X_all = daily_sales[feature_cols] # 准备全量特征数据,用于在当前界面进行统一预测 daily_sales["rf_pred"] = rf_model.predict(X_all) # 使用随机森林模型对所有日期进行预测,并将结果写入新列 pred_filtered = daily_sales[mask] # 再次根据用户选择的时间范围筛选,便于对比实际值和预测值 st.line_chart(pred_filtered.set_index("date")[["daily_qty", "rf_pred"]]) # 在同一折线图中展示真实销量和模型预测结果曲线,便于视觉对比 简单模型评估与对比展示示例 from sklearn.metrics import mean_squared_error # 导入均方误差指标,用于衡量回归预测误差的平方平均值 import numpy as np # 导入NumPy库,用于数值运算和开平方操作 rf_pred_full = rf_model.predict(X) # 使用训练好的随机森林模型对全量数据进行预测,获得完整预测序列 rf_mae_full = mean_absolute_error(y, rf_pred_full) # 计算随机森林在全量数据上的平均绝对误差,用于整体表现评估 rf_rmse_full = np.sqrt(mean_squared_error(y, rf_pred_full)) # 计算随机森林在全量数据上的均方根误差,体现误差幅度 sarima_pred_full = sarima_result.predict(start=ts.index[0], end=ts.index[-1]) # 使用SARIMA模型对完整时间序列进行拟合预测 sarima_pred_full = sarima_pred_full.reindex(ts.index) # 将预测结果索引对齐到原始时间序列索引,保证一一对应 sarima_mae_full = mean_absolute_error(ts, sarima_pred_full) # 计算SARIMA模型在全量数据上的平均绝对误差 sarima_rmse_full = np.sqrt(mean_squared_error(ts, sarima_pred_full)) # 计算SARIMA模型在全量数据上的均方根误差 eval_df = pd.DataFrame({ # 构建模型评估结果表格,用于展示不同模型的误差指标 "model": ["RandomForest", "SARIMA"], # 模型名称列,分别为随机森林和SARIMA "MAE": [rf_mae_full, sarima_mae_full], # 对应每个模型的平均绝对误差 "RMSE": [rf_rmse_full, sarima_rmse_full], # 对应每个模型的均方根误差 }) # 结束DataFrame构造,形成评估结果表 print(eval_df) # 在控制台打印模型评估结果,便于开发和调试阶段查看性能对比 if "eval_df" in locals(): # 检查当前环境中是否存在评估结果表,确保在Streamlit中安全调用 st.subheader("模型误差对比") # 在Streamlit页面中添加模型误差对比小标题 st.table(eval_df) # 使用表格组件在网页上展示两个模型的误差指标,帮助业务方直观对比模型优劣