Python | 练习题 <16>

32 阅读10分钟

题目 1:外卖平台商家经营数据分析

“外卖商家数据.csv” 包含字段:“商家 ID”“接单日期”“菜品类型 (快餐 / 火锅 / 烧烤 / 甜品)”“接单数量”“客单价 (元)”“平台抽成比例 (%)”“配送时长 (分钟)”。

请使用 pandas 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,计算商家单日营收(接单数量 × 客单价 × (1 - 平台抽成比例 / 100)),添加为新列。
  2. 按 “接单日期” 提取日期(日)信息,统计每周各日(周一至周日)的平均接单数量和平均配送时长。
  3. 计算配送时长的变异系数(标准差 / 均值)和 90 分位数。
  4. 按菜品类型分组,统计每组的平均单日营收和准时配送率(配送时长≤30 分钟为准时),绘制柱状图。
  5. 保存平台抽成比例>20% 的商家单日数据为 “高抽成商家数据.csv”(不含索引)。

分解代码:

请使用 pandas、numpy 和 matplotlib 完成以下任务:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

1. 读取 CSV 文件数据,计算商家单日营收(接单数量 × 客单价 × (1 - 平台抽成比例 / 100)),添加为新列。

df = pd.read_csv("外卖商家数据.csv")
df["单日营收"] = df["接单数量"] * df["客单价 (元)"] * (1 - df["平台抽成比例 (%)"] / 100)
print(df)

运行结果:

1.png

2. 按 “接单日期” 提取日期(日)信息,统计每周各日(周一至周日)的平均接单数量和平均配送时长。

df["接单日期"] = pd.to_datetime(df["接单日期"])
df["星期"] = df["接单日期"].dt.dayofweek  # 0:周一 ---- 6:周天
print(df)
week_map = {0:"周一", 1:"周二", 2:"周三", 3:"周四", 4:"周五", 5:"周六", 6:"周天"}
df["星期名称"] = df["星期"].map(week_map)
print(df)
df.groupby("星期名称").agg(
    平均接单数量 = ("接单数量", "mean"),
    平均配送时长 = ("配送时长 (分钟)", "mean")
).reset_index()

运行结果:

222.png

3. 计算配送时长的变异系数(标准差 / 均值)和 90 分位数。

hour_mean = df['配送时长 (分钟)'].mean()  # 均值
hour_std = df['配送时长 (分钟)'].std()  # 标准差
hour_cv = hour_std / hour_mean  # 变异系数
q90 = df['配送时长 (分钟)'].quantile(0.9)
print(f"配送时长的变异系数为{hour_cv:.2f},90分位数为{q90:.2f}")

运行结果:

屏幕截图 2025-12-15 154758.png

4. 按菜品类型分组,统计每组的平均单日营收和准时配送率(配送时长≤30 分钟为准时),绘制柱状图。

df['准时配送'] = df['配送时长 (分钟)'] < 30  # True False
print(df)

df_states = df.groupby("菜品类型").agg(
    平均单日营收=("单日营收", "mean"),
    准时配送率=("准时配送", "mean")  # 准时配送率
).reset_index()
print(df_states)

# 平均单日营收
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("平均单日营收")
plt.bar(df_states["菜品类型"], df_states["平均单日营收"])
plt.show()

# 准时配送率
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("准时配送率")
plt.bar(df_states["菜品类型"], df_states["准时配送率"])
plt.show()

运行结果:

4.png

tttt111111111111111.png

tttttt22222222222.png

5. 保存平台抽成比例>20% 的商家单日数据为 “高抽成商家数据.csv”(不含索引)。

df_new = df[df['平台抽成比例 (%)'] > 20]
df_new.to_csv("高抽成商家数据.csv")

完整代码:

# 1. 读取 CSV 文件数据,计算商家单日营收(接单数量 × 客单价 × (1 - 平台抽成比例 / 100)),添加为新列。
df = pd.read_csv("外卖商家数据.csv")
df["单日营收"] = df["接单数量"] * df["客单价 (元)"] * (1 - df["平台抽成比例 (%)"] / 100)
print(df)

# 2. 按 “接单日期” 提取日期(日)信息,统计每周各日(周一至周日)的平均接单数量和平均配送时长。
df["接单日期"] = pd.to_datetime(df["接单日期"])
df["星期"] = df["接单日期"].dt.dayofweek  # 0:周一 ---- 6:周天
print(df)
week_map = {0:"周一", 1:"周二", 2:"周三", 3:"周四", 4:"周五", 5:"周六", 6:"周天"}
df["星期名称"] = df["星期"].map(week_map)
print(df)
df.groupby("星期名称").agg(
    平均接单数量 = ("接单数量", "mean"),
    平均配送时长 = ("配送时长 (分钟)", "mean")
).reset_index()

# 3. 计算配送时长的变异系数(标准差 / 均值)和 90 分位数。
hour_mean = df['配送时长 (分钟)'].mean()  # 均值
hour_std = df['配送时长 (分钟)'].std()  # 标准差
hour_cv = hour_std / hour_mean  # 变异系数
q90 = df['配送时长 (分钟)'].quantile(0.9)
print(f"配送时长的变异系数为{hour_cv:.2f},90分位数为{q90:.2f}")

# 4. 按菜品类型分组,统计每组的平均单日营收和准时配送率(配送时长≤30 分钟为准时),绘制柱状图。
df['准时配送'] = df['配送时长 (分钟)'] < 30  # True False
print(df)

df_states = df.groupby("菜品类型").agg(
    平均单日营收=("单日营收", "mean"),
    准时配送率=("准时配送", "mean")  # 准时配送率
).reset_index()
print(df_states)

# 平均单日营收
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("平均单日营收")
plt.bar(df_states["菜品类型"], df_states["平均单日营收"])
plt.show()

# 准时配送率
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("准时配送率")
plt.bar(df_states["菜品类型"], df_states["准时配送率"])
plt.show()

# 5. 保存平台抽成比例>20% 的商家单日数据为 “高抽成商家数据.csv”(不含索引)。
df_new = df[df['平台抽成比例 (%)'] > 20]
df_new.to_csv("高抽成商家数据.csv")

题目 2:网约车出行数据深度分析

“网约车出行数据.csv” 包含字段:“订单号”“出发时间”“到达时间”“行驶里程 (km)”“基础车费 (元)”“里程加价 (元)”“是否高峰期 (是 / 否)”“乘客人数”。

请使用 pandas 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,计算出行总费用(基础车费 + 里程加价,高峰期额外加 15 元)和行驶时长(到达时间 - 出发时间,单位:分钟),添加这两个新列。
  2. 按 “出发时间” 提取小时信息(0-23 时),统计每小时的订单量和平均行驶里程。
  3. 计算行驶时长的最小值、最大值、均值和中位数。
  4. 按行驶里程分组(0-5km、5-10km、10-20km、20km+),统计每组的平均总费用和高峰期订单占比,绘制分组柱状图。
  5. 保存行驶时长超过 60 分钟的订单数据为 “长时出行订单.csv”(不含索引)。

分解代码:

请使用 pandas、numpy 和 matplotlib 完成以下任务:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

1. 读取 CSV 文件数据,计算出行总费用(基础车费 + 里程加价,高峰期额外加 15 元)和行驶时长(到达时间 - 出发时间,单位:分钟),添加这两个新列。

df = pd.read_csv("网约车出行数据.csv")
df['出行总费用'] = df['基础车费 (元)'] + df['里程加价 (元)']
data = df[df['是否高峰期'] == '是']['出行总费用']  # 高峰期
for i in data.index:
    df['出行总费用'][i] += 15
df['到达时间'] = pd.to_datetime(df['到达时间'])
df['出发时间'] = pd.to_datetime(df['出发时间'])
df['行驶时长'] = (df['到达时间'] - df['出发时间']).dt.total_seconds() / 60  # 分钟
print(df)

运行结果:

11111.png

2. 按 “出发时间” 提取小时信息(0-23 时),统计每小时的订单量和平均行驶里程。

df['出发小时'] = df['出发时间'].dt.hour
df_states = df.groupby("出发小时").agg(
    订单量=('订单号', 'count'),
    平均行驶里程=("行驶里程 (km)", "mean")
).reset_index()
print(df_states)

运行结果:

2222.png

3. 计算行驶时长的最小值、最大值、均值和中位数。

data = df['行驶时长'].agg(['min', 'max', 'mean', 'median'])
print(data)

运行结果:

33333.png

4. 按行驶里程分组(0-5km、5-10km、10-20km、20km+),统计每组的平均总费用和高峰期订单占比,绘制分组柱状图。

labels = ["0-5km", "5-10km", "10-20km", "20km+"]
df['行驶里程分组'] = pd.cut(df['行驶里程 (km)'], bins=[0, 5, 10, 20, np.inf], labels=labels, right=False)
print(df)
states = df.groupby("行驶里程分组").agg(
    平均总费用=("出行总费用", "mean"),
    高峰期订单占比=("是否高峰期", lambda x: (x=='是').mean())
).reset_index()
print(states)
# 平均总费用
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.title('平均总费用')
plt.bar(states['行驶里程分组'], states['平均总费用'])
plt.show()
# 高峰期订单占比
plt.title('高峰期订单占比')
plt.bar(states['行驶里程分组'], states['高峰期订单占比'])
plt.show()

运行结果:

4.png

tt11.png

t2222222222222222.png

5. 保存行驶时长超过 60 分钟的订单数据为 “长时出行订单.csv”(不含索引)。

df_new = df[df['行驶时长'] > 60]
df_new.to_csv("长时出行订单.csv")

完整代码:

# 1. 读取 CSV 文件数据,计算出行总费用(基础车费 + 里程加价,高峰期额外加 15 元)和行驶时长(到达时间 - 出发时间,单位:分钟),添加这两个新列。
df = pd.read_csv("网约车出行数据.csv")
df['出行总费用'] = df['基础车费 (元)'] + df['里程加价 (元)']
data = df[df['是否高峰期'] == '是']['出行总费用']  # 高峰期
for i in data.index:
    df['出行总费用'][i] += 15
df['到达时间'] = pd.to_datetime(df['到达时间'])
df['出发时间'] = pd.to_datetime(df['出发时间'])
df['行驶时长'] = (df['到达时间'] - df['出发时间']).dt.total_seconds() / 60  # 分钟
print(df)

# 2. 按 “出发时间” 提取小时信息(0-23 时),统计每小时的订单量和平均行驶里程。
df['出发小时'] = df['出发时间'].dt.hour
df_states = df.groupby("出发小时").agg(
    订单量=('订单号', 'count'),
    平均行驶里程=("行驶里程 (km)", "mean")
).reset_index()
print(df_states)

# 3. 计算行驶时长的最小值、最大值、均值和中位数。
data = df['行驶时长'].agg(['min', 'max', 'mean', 'median'])
print(data)

print("333333333333333333333333333333")
# 4. 按行驶里程分组(0-5km、5-10km、10-20km、20km+),统计每组的平均总费用和高峰期订单占比,绘制分组柱状图。
labels = ["0-5km", "5-10km", "10-20km", "20km+"]
df['行驶里程分组'] = pd.cut(df['行驶里程 (km)'], bins=[0, 5, 10, 20, np.inf], labels=labels, right=False)
print(df)
states = df.groupby("行驶里程分组").agg(
    平均总费用=("出行总费用", "mean"),
    高峰期订单占比=("是否高峰期", lambda x: (x=='是').mean())
).reset_index()
print(states)
# 平均总费用
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.title('平均总费用')
plt.bar(states['行驶里程分组'], states['平均总费用'])
plt.show()
# 高峰期订单占比
plt.title('高峰期订单占比')
plt.bar(states['行驶里程分组'], states['高峰期订单占比'])
plt.show()

# 5. 保存行驶时长超过 60 分钟的订单数据为 “长时出行订单.csv”(不含索引)。
df_new = df[df['行驶时长'] > 60]
df_new.to_csv("长时出行订单.csv")