题目 3:奶茶店销售数据统计分析
“奶茶销售数据.csv” 包含字段:“销售单号”“销售日期”“饮品类型 (奶茶 / 果茶 / 咖啡 / 酸奶)”“杯数”“单杯价格 (元)”“加料费用 (元)”“支付方式 (微信 / 支付宝 / 现金)”。
请使用 pandas 和 matplotlib 完成以下任务:
- 读取 CSV 文件数据,计算单日销售额(按销售日期分组,汇总所有订单的杯数 × 单杯价格 + 加料费用),添加为新列(需关联回原数据)。
- 按 “销售日期” 提取月份信息,统计各月份的总销量(杯数)和平均单杯利润(单杯价格 - 成本,成本固定:奶茶 3 元、果茶 4 元、咖啡 5 元、酸奶 3.5 元)。
- 计算加料费用的四分位数(25%、50%、75%)和总和。
- 按支付方式分组,统计每组的订单数、平均每单杯数,绘制并列柱状图。
- 保存饮品类型为果茶且杯数≥3 的订单为 “果茶批量订单.csv”(不含索引)。
分解代码:
请使用 pandas、numpy 和 matplotlib 完成以下任务:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
1. 读取 CSV 文件数据,计算单日销售额(按销售日期分组,汇总所有订单的杯数 × 单杯价格 + 加料费用),添加为新列(需关联回原数据)。
df = pd.read_csv("奶茶销售数据.csv")
df['销售日期'] = pd.to_datetime(df['销售日期'])
df['单订单金额'] = df['杯数'] * df['单杯价格 (元)'] + df['加料费用 (元)']
daily_sales = df.groupby("销售日期")["单订单金额"].sum().reset_index()
daily_sales.columns = ['销售日期', '单日销售额']
print(daily_sales)
df = pd.merge(df, daily_sales, on='销售日期', how='left')
运行结果:
2. 按 “销售日期” 提取月份信息,统计各月份的总销量(杯数)和平均单杯利润(单杯价格 - 成本,成本固定:奶茶 3 元、果茶 4 元、咖啡 5 元、酸奶 3.5 元)。
df['月份'] = df['销售日期'].dt.month
cost_map = {'奶茶':3, '果茶':4, "咖啡":5, "酸奶":3.5}
df['单杯利润'] = df['单杯价格 (元)'] - df['饮品类里'].map(cost_map)
print(df)
df_states = df.groupby("月份").agg(
总销量=("杯数", "sum"),
平均单杯利润=("单杯利润", "mean")
).reset_index()
print(df_states)
运行结果:
3. 计算加料费用的四分位数(25%、50%、75%)和总和。
q25 = df['加料费用 (元)'].quantile(0.25)
q50 = df['加料费用 (元)'].quantile(0.5)
q75 = df['加料费用 (元)'].quantile(0.75)
q_sum = df['加料费用 (元)'].sum()
print(f"加料费用的四分位数分别为:{q25:.2f}, {q50:.2f}, {q75:.2f}, 总和为: {q_sum:.2f}")
运行结果:
4. 按支付方式分组,统计每组的订单数、平均每单杯数,绘制并列柱状图。
pay_states = df.groupby("支付方式").agg(
订单数=("销售单号", "count"),
平均每单杯数=("杯数", "mean")
).reset_index()
print(pay_states)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 订单数
plt.bar(pay_states['支付方式'], pay_states['订单数'])
plt.title("订单数")
plt.show()
# 平均每单杯数
plt.bar(pay_states['支付方式'], pay_states['平均每单杯数'])
plt.title("平均每单杯数")
plt.show()
运行结果:
5. 保存饮品类型为果茶且杯数≥3 的订单为 “果茶批量订单.csv”(不含索引)。
df_new = df[(df['饮品类型'] == '果茶') & (df['杯数'] >= 3)]
df_new.to_csv("果茶批量订单.csv")
完整代码:
# 1. 读取 CSV 文件数据,计算单日销售额(按销售日期分组,汇总所有订单的杯数 × 单杯价格 + 加料费用),添加为新列(需关联回原数据)。
df = pd.read_csv("奶茶销售数据.csv")
df['销售日期'] = pd.to_datetime(df['销售日期'])
df['单订单金额'] = df['杯数'] * df['单杯价格 (元)'] + df['加料费用 (元)']
daily_sales = df.groupby("销售日期")["单订单金额"].sum().reset_index()
daily_sales.columns = ['销售日期', '单日销售额']
print(daily_sales)
df = pd.merge(df, daily_sales, on='销售日期', how='left')
# 2. 按 “销售日期” 提取月份信息,统计各月份的总销量(杯数)和平均单杯利润(单杯价格 - 成本,成本固定:奶茶 3 元、果茶 4 元、咖啡 5 元、酸奶 3.5 元)。
df['月份'] = df['销售日期'].dt.month
cost_map = {'奶茶':3, '果茶':4, "咖啡":5, "酸奶":3.5}
df['单杯利润'] = df['单杯价格 (元)'] - df['饮品类型'].map(cost_map)
print(df)
df_states = df.groupby("月份").agg(
总销量=("杯数", "sum"),
平均单杯利润=("单杯利润", "mean")
).reset_index()
print(df_states)
# 3. 计算加料费用的四分位数(25%、50%、75%)和总和。
q25 = df['加料费用 (元)'].quantile(0.25)
q50 = df['加料费用 (元)'].quantile(0.5)
q75 = df['加料费用 (元)'].quantile(0.75)
q_sum = df['加料费用 (元)'].sum()
print(f"加料费用的四分位数分别为:{q25:.2f}, {q50:.2f}, {q75:.2f}, 总和为: {q_sum:.2f}")
# 4. 按支付方式分组,统计每组的订单数、平均每单杯数,绘制并列柱状图。
pay_states = df.groupby("支付方式").agg(
订单数=("销售单号", "count"),
平均每单杯数=("杯数", "mean")
).reset_index()
print(pay_states)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 订单数
plt.bar(pay_states['支付方式'], pay_states['订单数'])
plt.title("订单数")
plt.show()
# 平均每单杯数
plt.bar(pay_states['支付方式'], pay_states['平均每单杯数'])
plt.title("平均每单杯数")
plt.show()
# 5. 保存饮品类型为果茶且杯数≥3 的订单为 “果茶批量订单.csv”(不含索引)。
df_new = df[(df['饮品类型'] == '果茶') & (df['杯数'] >= 3)]
df_new.to_csv("果茶批量订单.csv")
题目 4:航空公司航班延误数据分析
“航班数据.csv” 包含字段:“航班号”“起飞时间”“降落时间”“航线距离 (km)”“机票均价 (元)”“延误时长 (分钟)”“是否天气原因延误 (是 / 否)”“乘客人数”。
请使用 pandas 和 matplotlib 完成以下任务:
- 读取 CSV 文件数据,计算航班飞行时长(降落时间 - 起飞时间,单位:小时)和单位距离票价(机票均价 / 航线距离),添加这两个新列。
- 按 “起飞时间” 提取月份信息,统计各月份的延误航班占比(延误时长>0 为延误)。
- 计算延误时长的均值、中位数和变异系数(标准差 / 均值)。
- 按航线距离分组(0-500km、500-1000km、1000-2000km、2000km+),统计每组的平均延误时长和平均乘客人数,绘制柱状图。
- 保存延误时长≥60 分钟且天气原因延误的航班数据为 “严重延误航班.csv”(不含索引)。
分解代码:
请使用 pandas、numpy 和 matplotlib 完成以下任务:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
1. 读取 CSV 文件数据,计算航班飞行时长(降落时间 - 起飞时间,单位:小时)和单位距离票价(机票均价 / 航线距离),添加这两个新列。
df = pd.read_csv("航班数据.csv")
df["起飞时间"] = pd.to_datetime(df["起飞时间"])
df["降落时间"] = pd.to_datetime(df["降落时间"])
df["飞行时长"] = (df["降落时间"] - df["起飞时间"]).dt.total_seconds() / 3600 # 小时
df["单位距离票价"] = df["机票均价 (元)"] / df["航线距离 (km)"]
print(df)
运行结果:
2. 按 “起飞时间” 提取月份信息,统计各月份的延误航班占比(延误时长>0 为延误)。
df["月份"] = df["起飞时间"].dt.month
df["是否延误"] = df["延误时长 (分钟)"] > 0 # True:延误 False:未延误
month_delay = df.groupby("月份").agg(
延误航班占比=("是否延误", "mean")
).reset_index()
print(month_delay)
运行结果:
3. 计算延误时长的均值、中位数和变异系数(标准差 / 均值)。
delay_mean = df['延误时长 (分钟)'].mean() # 均值
delay_median = df['延误时长 (分钟)'].median() # 中位数
delay_std = df['延误时长 (分钟)'].std() # 标准差
delay_cv = delay_std / delay_mean # 变异系数
4. 按航线距离分组(0-500km、500-1000km、1000-2000km、2000km+),统计每组的平均延误时长和平均乘客人数,绘制柱状图。
labels = ['0-500km', '500-1000km', '1000-2000km', '2000km+']
df['距离分组'] = pd.cut(df['航线距离 (km)'], bins=[0, 500, 1000, 2000, np.inf], labels=labels)
print(df)
df_states = df.groupby('距离分组').agg(
平均延误时长=('延误时长 (分钟)', 'mean'),
平均乘客人数=('乘客人数', 'mean')
).reset_index()
print(df_states)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 平均延误时长
plt.bar(df_states['距离分组'], df_states['平均延误时长'])
plt.title("平均延误时长")
plt.show()
# 平均乘客人数
plt.bar(df_states['距离分组'], df_states['平均乘客人数'])
plt.title("平均乘客人数")
plt.show()
运行结果:
5. 保存延误时长≥60 分钟且天气原因延误的航班数据为 “严重延误航班.csv”(不含索引)。
df_new = df[(df['延误时长 (分钟)'] >= 60) & (df['是否天气原因延误'] == '是')]
df_new.to_csv("严重延误航班.csv")
完整代码:
# 1. 读取 CSV 文件数据,计算航班飞行时长(降落时间 - 起飞时间,单位:小时)和单位距离票价(机票均价 / 航线距离),添加这两个新列。
df = pd.read_csv("航班数据.csv")
df["起飞时间"] = pd.to_datetime(df["起飞时间"])
df["降落时间"] = pd.to_datetime(df["降落时间"])
df["飞行时长"] = (df["降落时间"] - df["起飞时间"]).dt.total_seconds() / 3600 # 小时
df["单位距离票价"] = df["机票均价 (元)"] / df["航线距离 (km)"]
print(df)
# 2. 按 “起飞时间” 提取月份信息,统计各月份的延误航班占比(延误时长>0 为延误)。
df["月份"] = df["起飞时间"].dt.month
df["是否延误"] = df["延误时长 (分钟)"] > 0 # True:延误 False:未延误
month_delay = df.groupby("月份").agg(
延误航班占比=("是否延误", "mean")
).reset_index()
print(month_delay)
print("2222222222222222222")
# 3. 计算延误时长的均值、中位数和变异系数(标准差 / 均值)。
delay_mean = df['延误时长 (分钟)'].mean() # 均值
delay_median = df['延误时长 (分钟)'].median() # 中位数
delay_std = df['延误时长 (分钟)'].std() # 标准差
delay_cv = delay_std / delay_mean # 变异系数
# 4. 按航线距离分组(0-500km、500-1000km、1000-2000km、2000km+),统计每组的平均延误时长和平均乘客人数,绘制柱状图。
labels = ['0-500km', '500-1000km', '1000-2000km', '2000km+']
df['距离分组'] = pd.cut(df['航线距离 (km)'], bins=[0, 500, 1000, 2000, np.inf], labels=labels)
print(df)
df_states = df.groupby('距离分组').agg(
平均延误时长=('延误时长 (分钟)', 'mean'),
平均乘客人数=('乘客人数', 'mean')
).reset_index()
print(df_states)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 平均延误时长
plt.bar(df_states['距离分组'], df_states['平均延误时长'])
plt.title("平均延误时长")
plt.show()
# 平均乘客人数
plt.bar(df_states['距离分组'], df_states['平均乘客人数'])
plt.title("平均乘客人数")
plt.show()
# 5. 保存延误时长≥60 分钟且天气原因延误的航班数据为 “严重延误航班.csv”(不含索引)。
df_new = df[(df['延误时长 (分钟)'] >= 60) & (df['是否天气原因延误'] == '是')]
df_new.to_csv("严重延误航班.csv")