1、项目介绍
本项目旨在通过对超市销售数据的可视化展示与分析,帮助管理者更好地理解销售趋势、发现销售模式,并优化库存管理和营销策略。系统使用关联规则挖掘、时间序列分析等技术,对销售数据进行深入挖掘,生成多种可视化图表,提供直观的分析结果。
1.1 项目简介
本项目开发了一个基于Flask的web应用,通过对超市销售数据的分析与可视化展示,提供销售趋势、类别销售额统计、关联规则分析等多维度的销售数据洞察。系统界面友好,能够实时更新并展示最新的销售数据分析结果。
1.2 技术栈
-
后端:Flask
-
前端:HTML、CSS、JavaScript
-
数据处理:Pandas
-
数据可视化:Pyecharts等
-
数据存储:CSV文件
1.3 实现功能
-
数据加载
-
从CSV文件加载销售数据,包括子类别销售总额、销售趋势数据、关联规则数据、节点边数据、大类别销售数据。
-
-
数据可视化
-
条形图:展示支持度前10的关联规则。
-
饼图:展示子类别销售额统计。
-
折线图:展示销售金额和销售数量的趋势图。
-
置信度条形图:展示置信度前10的关联规则。
-
网络图:展示关联规则网络结构。
-
漏斗图:展示大类别销售数量。
-
-
Web展示
-
主页面展示所有图表,包括条形图、饼图、折线图、置信度条形图、网络图和漏斗图。
-
实时显示当前日期和时间。
-
采用响应式布局,适应不同屏幕大小。
-
1.4项目启动方式
本项目可以通过以下两种方式启动:
1.4.1 通过Jupyter Notebook启动
在Jupyter Notebook中运行以下代码块,可以启动Flask应用
1.4.2 通过PyCharm启动
或可以在PyCharm中可以直接运行app.py
文件来启动Flask应用。具体步骤如下:
-
打开PyCharm并加载项目。
-
确保项目的虚拟环境已经激活,并安装了所有必要的依赖包。
-
在项目目录中找到
app.py
文件。 -
右键点击
app.py
文件,选择Run 'app'
。 -
查看PyCharm下方的控制台输出,确认Flask应用已经成功启动,并显示运行地址,例如:http://127.0.0.1:9999。
2、项目效果截图
3、运行视频
4、核心代码
def create_line_chart(data):
# 准备趋势图数据
print(data.head())
months = data['销售月份'].tolist()
sales_amount = data['销售金额'].tolist()
sales_quantity = data['销售数量'].tolist()
line = (
Line(init_opts=opts.InitOpts(width="550px", height="200px"))
.add_xaxis(months)
.add_yaxis("销售金额(万元)", sales_amount, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False))
.add_yaxis("销售数量(万件)", sales_quantity, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False))
.extend_axis(
yaxis=opts.AxisOpts(
name="销售数量(万件)",
type_="value",
min_=0,
max_=max(sales_quantity) * 1.2,
position="right",
axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="white")),
# 添加轴线显示
axislabel_opts=opts.LabelOpts(formatter="{value} 万件", color="white"),
splitline_opts=opts.SplitLineOpts(is_show=False), # 去除网格线
interval=1 # 调整Y轴刻度间隔
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="销售金额和销售数量趋势图", pos_top="5%",
title_textstyle_opts=opts.TextStyleOpts(color="white",font_size=14),
pos_left='center' # 标题居中对齐
),
yaxis_opts=opts.AxisOpts(
name="销售金额(万元)",
type_="value",
min_=0,
max_=max(sales_amount) * 1.2,
position="left",
axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="white")),
# 添加轴线显示
axislabel_opts=opts.LabelOpts(formatter="{value} 万元", color="white"),
splitline_opts=opts.SplitLineOpts(is_show=False), # 去除网格线
interval=5 # 调整Y轴刻度间隔
),
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=45, color="white"),
axisline_opts=opts.AxisLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(color="white")),
# 添加X轴线显示
splitline_opts=opts.SplitLineOpts(is_show=False), # 去除网格线
),
legend_opts=opts.LegendOpts(orient="vertical",
pos_bottom="0%",
pos_left="75%", # 将图例位置调整到更右边
textstyle_opts=opts.TextStyleOpts(color='white', font_size=10)
),
)
.set_series_opts(
label_opts=opts.LabelOpts(
font_size=10, # 设置字体大小
font_family="Arial", # 设置字体
color="white" # 设置字体颜色
)
)
)
return line
def draw_bar(data):
rules = data.sort_values(by='lift', ascending=False).head(10) # 取提升度前10的规则
print(rules["lift"])
bar = (
Bar(init_opts=opts.InitOpts(width="500px", height="220px"))
.add_yaxis("置信度", rules['confidence'].round(3).tolist())
# .add_yaxis("提升度", rules['lift'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(
title="关联度置信指标",
title_textstyle_opts=opts.TextStyleOpts(color='white', font_size=14), # 确保文字颜色为白色并增加字体大小
pos_top='10%', # 保持标题在顶部5%的位置
pos_left='center' # 标题居中对齐
),
legend_opts=opts.LegendOpts(
orient="vertical",
pos_right='5%',
pos_top='10%',
textstyle_opts=opts.TextStyleOpts(color='white', font_size=10)
),
xaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(rotate=45, color="white", font_size=8), # 确保字体大小正确
splitline_opts=opts.SplitLineOpts(is_show=False), # 去除网格线
min_=0.5, # 强制显示Y轴
max_=0.62, # 设置Y轴的最大值
interval=0.1, # 减少Y轴刻度数
),
yaxis_opts=opts.AxisOpts(
axislabel_opts=opts.LabelOpts(formatter="{value}", color="white", font_size=6),
splitline_opts=opts.SplitLineOpts(is_show=False), # 去除网格线
min_=0, # 强制显示Y轴
max_=0.7, # 设置Y轴的最大值
# interval=0.1, # 减少Y轴刻度数
axisline_opts=opts.AxisLineOpts(
# 设置轴线颜色
linestyle_opts=opts.LineStyleOpts(color="white"),
# 是否显示轴线
is_show=True, )
)
))
return bar