coffee销售数据集分析:基于时间趋势分析的实操练习
**文章说明:**对coffee销售数据集的简单分析练习(时间趋势分析练习),主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。
**注:**这是我第一次使用md格式编辑博客文章,排版上还是不是很熟悉,害,我尽量弄好看点。
分析过程
import pandas as pd
import matplotlib.pyplot as plt# 设置中文字体,防止绘图时中文标题出现乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 导入数据
data = pd.read_csv(r"C:\Users\31049\Desktop\电商数据\coffee.csv")# 查看数据情况
print(data.shape)
data.head()
(2623, 6)
date | datetime | cash_type | card | money | coffee_name | |
---|---|---|---|---|---|---|
0 | 2024-03-01 | 2024-03-01 10:15:50.520 | card | ANON-0000-0000-0001 | 38.7 | Latte |
1 | 2024-03-01 | 2024-03-01 12:19:22.539 | card | ANON-0000-0000-0002 | 38.7 | Hot Chocolate |
2 | 2024-03-01 | 2024-03-01 12:20:18.089 | card | ANON-0000-0000-0002 | 38.7 | Hot Chocolate |
3 | 2024-03-01 | 2024-03-01 13:46:33.006 | card | ANON-0000-0000-0003 | 28.9 | Americano |
4 | 2024-03-01 | 2024-03-01 13:48:14.626 | card | ANON-0000-0000-0004 | 38.7 | Latte |
# 检查数据类型、检查是否有缺失值
print(data.info())# 输出缺失值数量
print('\n缺失值数量:')
print( data.isnull().sum())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2623 entries, 0 to 2622
Data columns (total 6 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 date 2623 non-null object 1 datetime 2623 non-null object 2 cash_type 2623 non-null object 3 card 2534 non-null object 4 money 2623 non-null float645 coffee_name 2623 non-null object
dtypes: float64(1), object(5)
memory usage: 123.1+ KB
None缺失值数量:
date 0
datetime 0
cash_type 0
card 89
money 0
coffee_name 0
dtype: int64
发现1: card列有89个缺失值,可能有些用户不是使用card支付,而是其他支付方式。(待验证)
发现2: date和datetime列的数据类型为object类型,需要转化为日期类型
# 转化为datetime日期格式
data['date'] = pd.to_datetime(data['date'])
data['datetime'] = pd.to_datetime(data['datetime'])
# 异常值检查,检查monet列是否有0值或负值
data['money'].describe()
结果:最小值大于0,因此无异常值。
一、付款方式分析:观察‘支付方式’的趋势
# 计算不同支付方式的数量以及占比。
ty = data['cash_type'].value_counts()# 可视化
plt.pie(ty, labels=ty.index, autopct=lambda pct: f'{int(pct/100*ty.sum())}, {pct:.1f}%')
plt.title('不同支付方式的数量以及占比')
plt.show()
结论:支付方式只有两种(cash和card),96%的用户选择使用“card”进行支付。也说明了card列的89个缺失值是合理的(因为89个订单数据显示cash现金支付)
分析用户选择的支付方式随时间的变化趋势:
from datetime import datetime# 提取月份
data['month'] = data['date'].dt.month# unstack()方法用于将行索引转为列,或者更准确地说,是将 DataFrame 中的层次化索引的某一层转换为列
payment_counts = data.groupby(['month', 'cash_type']).size().unstack(fill_value=0)
payment_counts.index = payment_counts.index.astype(str)# 查看结果
print(payment_counts)
cash_type card cash
month
3 175 31
4 168 28
5 241 26
6 223 4
7 237 0
8 272 0
9 344 0
10 426 0
11 259 0
12 189 0
结果可视化:
# 创建一个图形容器、子图对象
fig, ax = plt.subplots(figsize=(8, 5))# 绘制cash-card订单数量的柱状图
ax.bar(payment_counts.index, payment_counts['cash'], label='cash现金', color='blue')
ax.bar(payment_counts.index, payment_counts['card'], bottom=payment_counts['cash'], label='card', color='skyblue')# 同一坐标系下绘制每月的cash现金数量占比的折线图
ax1 = ax.twinx()
ax1.set_ylim([0, 0.5])
cash_pct = (payment_counts['cash'] / (payment_counts['card'] + payment_counts['cash'])).round(2)
ax1.plot(payment_counts.index, cash_pct, label='cash占比', marker='^', color='r')
for i in range(len(payment_counts)):ax1.text(payment_counts.index[i], cash_pct.iloc[i], s=f'{cash_pct.iloc[i]}%')ax.legend(loc='upper left')
ax1.legend(loc='best')
plt.title('cash-card数量的堆积柱状图\n每月的cash现金数量占比', fontsize=15)
ax.set_xlabel('month月份')
ax.set_ylabel('数量')
plt.show()
结论:在3-6月,cash现金支付的订单数占比逐月下降,且之后几个月全部订单都是使用card卡支付的,呈现出无现金支付的趋势。
二、销售趋势分析:热销时间段(时间趋势)
# 定义设置时间段的函数,[0-6,6-8,8-12,12-14,14-18,18-21,21-0], 对应[凌晨、早晨、早上、中午、下午、晚上、深夜]
def f(hour):if hour<6:return '凌晨'elif hour<8:return '早晨'elif hour<12:return '早上'elif hour<14:return '中午'elif hour<18:return '下午'elif hour<21:return '晚上'else:return '深夜'# 增加一列表示时间段
data['time'] = data['datetime'].dt.hour.apply(f)# 查看数据
data.head()
date | datetime | cash_type | card | money | coffee_name | month | time | |
---|---|---|---|---|---|---|---|---|
0 | 2024-03-01 | 2024-03-01 10:15:50.520 | card | ANON-0000-0000-0001 | 38.7 | Latte | 3 | 早上 |
1 | 2024-03-01 | 2024-03-01 12:19:22.539 | card | ANON-0000-0000-0002 | 38.7 | Hot Chocolate | 3 | 中午 |
2 | 2024-03-01 | 2024-03-01 12:20:18.089 | card | ANON-0000-0000-0002 | 38.7 | Hot Chocolate | 3 | 中午 |
3 | 2024-03-01 | 2024-03-01 13:46:33.006 | card | ANON-0000-0000-0003 | 28.9 | Americano | 3 | 中午 |
4 | 2024-03-01 | 2024-03-01 13:48:14.626 | card | ANON-0000-0000-0004 | 38.7 | Latte | 3 | 中午 |
# 计算不同时间段的订单数量占比
nums_time = data.groupby('time').size().sort_values()# 可视化
plt.pie(nums_time, labels=nums_time.index, autopct=lambda pct: f'{int(pct/100*nums_time.sum())}\n{pct:.1f}%', radius=1)
plt.title('不同时间段的订单数及其占比')
plt.show()
结论:店铺早上(8-12点)的订单数最多,占比31%;第二下午(14-18点)占比24%;第三是晚上(18-21点)占比18%。这3个时间段占比总和近75%。
三、咖啡销量分析:某时间段最畅销的咖啡(最受欢迎)
# 按照['time', 'coffee_name']分组,计算每组包含的销量数据,并通过unstack()方法转化行层次化索引(['time', 'coffee_name'])的‘coffee’索引转为列
cof_time = data.groupby(['time', 'coffee_name']).size().unstack(fill_value=0)# 查看数据
cof_time
coffee_name | Americano | Americano with Milk | Cappuccino | Cocoa | Cortado | Espresso | Hot Chocolate | Latte |
---|---|---|---|---|---|---|---|---|
time | ||||||||
下午 | 86 | 124 | 95 | 36 | 43 | 31 | 52 | 160 |
中午 | 62 | 93 | 45 | 15 | 38 | 18 | 13 | 70 |
早上 | 114 | 226 | 80 | 38 | 127 | 32 | 34 | 180 |
早晨 | 7 | 12 | 10 | 3 | 2 | 2 | 0 | 29 |
晚上 | 39 | 92 | 103 | 30 | 22 | 10 | 63 | 110 |
深夜 | 19 | 74 | 35 | 17 | 15 | 4 | 44 | 69 |
分时间段进行可视化:
# 创建一个图形对象fig、包含1*6张子图的ax对象
fig, ax = plt.subplots(6, 1, figsize=(6, 30))# 绘制每个时间段的销量柱状图
for i in range(len(cof_time)):# cof_time的取每行数据,并排序,用于可视化d = cof_time.iloc[i].sort_values(ascending=False)ax[i].bar(d.index, d.values, color='skyblue')ax[i].tick_params(axis='x', rotation=45) #tick_params()可以调整刻度线的位置、大小、颜色、旋转、刻度标签的对齐方式、字体大小等ax[i].set_title(f'{cof_time.index[i]}——热销的coffee')ax[i].set_ylabel('销量')ax[i].grid(axis='y', alpha=0.5)fig.tight_layout()
plt.show()
结论:每个时间段最受欢迎的coffee类参考上图。
# 文章到此结束,有问题可以一起交流,我们下期文章再见叭
相关文章:

coffee销售数据集分析:基于时间趋势分析的实操练习
**文章说明:**对coffee销售数据集的简单分析练习(时间趋势分析练习),主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注:**这是我第一次使用md格式编辑博客文章,排版上还是不是很…...

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能
【1】原贴地址:eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下: 更新eclipse-24-09版本后之后,新的搜索功能(CT…...
Centos 修改历史读录( HISTSIZE)
history命令 -c #清空命令历史 -r #读历史文件附加到历史列表 -w #保存历史列表到指定的历史文件 命令历史相关环境变量 HISTSIZE #命令历史记录的条数 HISTFILE #指定历史文件,默认为~/.bash_history HISTFILESIZE #命令历史文件记录历史的条数 以上变量可以 exp…...

lwIP——4 网络接口
1.lwIP网络接口 网络接口(网卡):个人理解是处理网络层和数据传输关系的接口(tcp/ip协议栈中的网络接口层部分),直接与硬件平台打交道 lwIP协议栈支持多种不同的网络接口(网卡)&#…...
pytest自动化测试 - pytest夹具的基本概念
<< 返回目录 1 pytest自动化测试 - pytest夹具的基本概念 夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件,夹具可以是函数、类或模块,使用pytest.fixture装饰器进行标记。 1.1 夹具的作用范围 夹具的作用范围: …...

FreeRtos的使用教程
定义: RTOS实时操作系统, (Real Time Operating System), 指的是当外界事件发生时, 能够有够快的响应速度,调度一切可利用的资源, 控制实时任务协调一致的运行。 特点: 支持多任务管理, 处理多个事件, 实现更复杂的逻辑。 与计算…...

yolov11 解读简记
1 文章详细介绍了YOLOv11的架构设计,包括以下几个关键组件: C3k2块:这是YOLOv11引入的一种新型卷积块,替代了之前版本中的C2f块。C3k2块通过使用两个较小的卷积核代替一个大的卷积核,提高了计算效率,同时保…...

实验二 数据库的附加/分离、导入/导出与备份/还原
实验二 数据库的附加/分离、导入/导出与备份/还原 一、实验目的 1、理解备份的基本概念,掌握各种备份数据库的方法。 2、掌握如何从备份中还原数据库。 3、掌握数据库中各种数据的导入/导出。 4、掌握数据库的附加与分离,理解数据库的附加与分离的作用。…...
Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`
文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称(对于Producer重点检查 client.id)4…...
性能测试丨JVM 性能数据采集
什么是JVM性能数据采集? JVM性能数据采集是指通过一些工具和技术采集与Java虚拟机相关的性能数据。这些数据包括但不限于内存使用、CPU使用、垃圾回收(GC)行为、线程活动等。合理地分析这些数据,可以帮助我们找出系统的瓶颈&…...
计算机图形学实验练习(实验1.2-4.1AND补充实验12)
实验1.2 OpenGL与着色器编程 1.理论知识 1.1 OpenGL的含义 OpenGL是一种应用程序编程接口(Application Programming Interface,API),它是一种可以对图形硬件设备特性进行访问的软件库。OpenGL最新的4.3版本包含了超过500个不同的命令,可以用于设置所需的对象、图像和操…...

JWT实现单点登录
文章目录 JWT实现单点登录JWT 简介存在问题及解决方案登录流程后端程序实现前端保存Tokenstore存放信息的缺点及解决 校验流程:为gateway增加登录校验拦截器 另一种单点登录方法:Token+Redis实现单点登录 JWT实现单点登录 登录流程ÿ…...
云计算的概念与特点:开启数字化时代的新篇章
在当今数字化时代,云计算(Cloud Computing)已经成为推动技术创新和业务转型的核心力量。无论是大型企业、中小型企业,还是个人用户,云计算都为其提供了高效、灵活和经济的解决方案。本文将深入探讨云计算的概念及其核心特点,帮助读者全面了解这一革命性技术。 © ivw…...
salesforce中如何获取一个profile的18位id
在 Salesforce 中,要获取一个 Profile 的 18 位 ID,可以通过以下几种方式实现: 方法 1:通过 Developer Console 登录 Salesforce。 点击右上角的 头像 或 设置齿轮,选择 “开发者控制台”(Developer Conso…...
Vue 3 中的标签 ref 与 defineExpose:模板引用与组件暴露
在 Vue 3 中,ref 不仅可以用于创建响应式数据,还可以用于获取 DOM 节点或组件实例。通过 ref,我们可以直接访问模板中的元素或组件,并在需要时操作它们。此外,defineExpose 用于在 <script setup> 语法中显式暴露…...

FLTK - FLTK1.4.1 - demo - adjuster.exe
文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码,用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程,工程…...

单路由及双路由端口映射指南
远程登录总会遇到登陆不上的情况,可能是访问的大门没有打开哦,下面我们来看看具体是怎么回事? 当软件远程访问时,主机需要两个条件,一是有一个唯一的公网IP地址(运营商提供),二是开…...
专为课堂打造:宏碁推出三款全新耐用型 Chromebook
IT之家 1 月 25 日消息,宏碁(Acer)昨日(1 月 24 日)发布公告,针对教育市场,推出 Chromebook Spin 512 (R857T)、Chromebook Spin 511 (R757T) 和 Chromebook 511 (C737) 三款产品,兼…...

云计算架构学习之LNMP架构部署、架构拆分、负载均衡-会话保持
一.LNMP架构部署 1.1. LNMP服务搭建 1.磁盘信息 2.内存 3.负载信息 4.Nginx你们公司都用来干嘛 5.文件句柄(文件描述符 打开文件最大数量) 6.你处理过系统中的漏洞吗 SSH漏洞 7.你写过什么shell脚本 8.监控通过什么告警 zabbix 具体监控哪些内容 9.mysql redis查询 你好H…...

Python案例--暂停与时间格式化
在编程中,时间的处理是一个常见的需求。无论是日志记录、任务调度还是数据时间戳的生成,正确地获取和格式化时间都至关重要。Python 提供了强大的时间处理模块,其中 time 模块是基础且广泛使用的工具之一。本文将通过一个简单的示例ÿ…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...