Python | 练习题 <14>

21 阅读10分钟

题目 1:酒店入住数据分析

“酒店入住数据.csv” 包含字段:“入住订单号”“入住日期”“离店日期”“房型 (单人间 / 双人间 / 套房)”“入住人数”“日房价 (元)”“额外消费 (元)”。

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

  1. 读取 CSV 文件数据,计算订单总费用(日房价 × 入住天数 + 额外消费,需先计算入住天数:离店日期 - 入住日期),添加为新列。
  2. 按 “入住日期” 提取月份信息,统计各月份的订单量和平均入住人数。
  3. 计算总费用的四分位数(25%、50%、75%)和中位数。
  4. 按入住人数分组(1 人、2 人、3 人及以上),统计每组的订单数和平均总费用,绘制柱状图。
  5. 保存房型为套房的订单数据为 “套房入住订单.csv”(不含索引)。

分解代码:

请使用 pandas 和 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.days
df['总费用'] = df['日房价 (元)'] * df['入住天数'] + df['额外消费 (元)']
print(df)

运行结果:

1111.png

2. 按 “入住日期” 提取月份信息,统计各月份的订单量和平均入住人数。

df['月份'] = df['入住日期'].dt.month
df_month = df.groupby('月份').agg({
    "入住订单号":"count", # 订单量
    "入住人数":"mean" # 平均入住人数
}).rename(columns={"入住订单号":"订单量", "入住人数":"平均入住人数"})
print(df_month)

运行结果:

2222.png

3. 计算总费用的四分位数(25%、50%、75%)和中位数。

quantiles = df['总费用'].quantile([0.25, 0.5, 0.75])
df_median = df['总费用'].median()
print("总费用的四分位数分别为:\n", quantiles)
print("总费用的中位数为:", df_median)

运行结果:

33333333.png

4. 按入住人数分组(1 人、2 人、3 人及以上),统计每组的订单数和平均总费用,绘制柱状图。

def group_people(num):
    if num == 1:
        return "1 人"
    elif num == 2:
        return "2 人"
    else:
        return "3 人及以上"
df['入住人数分组'] = df['入住人数'].apply(group_people)
print(df)
df_states = df.groupby("入住人数分组").agg({
    "入住订单号":"count", # 订单量
    "总费用":"mean"
}).rename(columns={"入住订单号":"订单量", "总费用":"平均总费用"})
print(df_states)
# 订单数
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.bar(df_states.index, df_states['订单量'])
plt.title('订单量')
plt.show()
# 平均总费用
plt.bar(df_states.index, df_states['平均总费用'])
plt.title('平均总费用')
plt.show()

运行结果:

44444445.png

ttttttttttttttt111111111111111111111111.png

tttttttttttt2222222222222.png

5. 保存房型为套房的订单数据为 “套房入住订单.csv”(不含索引)。

new_df = df[df['房型'] == '套房']
new_df.to_csv("套房入住订单.csv")

完整代码:

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.days
df['总费用'] = df['日房价 (元)'] * df['入住天数'] + df['额外消费 (元)']
print(df)

# 2. 按 “入住日期” 提取月份信息,统计各月份的订单量和平均入住人数。
df['月份'] = df['入住日期'].dt.month
df_month = df.groupby('月份').agg({
    "入住订单号":"count", # 订单量
    "入住人数":"mean" # 平均入住人数
}).rename(columns={"入住订单号":"订单量", "入住人数":"平均入住人数"})
print(df_month)

# 3. 计算总费用的四分位数(25%、50%、75%)和中位数。
quantiles = df['总费用'].quantile([0.25, 0.5, 0.75])
df_median = df['总费用'].median()
print("总费用的四分位数分别为:\n", quantiles)
print("总费用的中位数为:", df_median)

# 4. 按入住人数分组(1 人、2 人、3 人及以上),统计每组的订单数和平均总费用,绘制柱状图。
def group_people(num):
    if num == 1:
        return "1 人"
    elif num == 2:
        return "2 人"
    else:
        return "3 人及以上"
df['入住人数分组'] = df['入住人数'].apply(group_people)
print(df)
df_states = df.groupby("入住人数分组").agg({
    "入住订单号":"count", # 订单量
    "总费用":"mean"
}).rename(columns={"入住订单号":"订单量", "总费用":"平均总费用"})
print(df_states)
# 订单数
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.bar(df_states.index, df_states['订单量'])
plt.title('订单量')
plt.show()
# 平均总费用
plt.bar(df_states.index, df_states['平均总费用'])
plt.title('平均总费用')
plt.show()

# 5. 保存房型为套房的订单数据为 “套房入住订单.csv”(不含索引)。
new_df = df[df['房型'] == '套房']
new_df.to_csv("套房入住订单.csv")

题目 2:物流配送数据分析 “物流配送数据.csv” 包含字段:“运单号”“发货时间”“签收时间”“配送距离 (km)”“配送员 ID”“基础配送费 (元)”“超重费 (元)”“是否准时签收 (是 / 否)”。

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

  1. 读取 CSV 文件数据,计算配送总费用(基础配送费 + 超重费),并计算配送耗时(签收时间 - 发货时间,单位:小时),添加这两个新列。
  2. 按 “发货时间” 提取日期(日)信息,统计每月各日的配送订单量和平均配送距离。
  3. 计算配送耗时的最大值、最小值、均值和变异系数(标准差 / 均值)。
  4. 按配送距离分组(0-10km、10-20km、20km+),统计每组的准时签收率和平均总配送费,绘制柱状图。
  5. 保存配送耗时超过 24 小时的订单数据为 “超时配送订单.csv”(不含索引)。

分解代码:

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

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

1. 读取 CSV 文件数据,计算配送总费用(基础配送费 + 超重费),并计算配送耗时(签收时间 - 发货时间,单位:小时),添加这两个新列。

df = pd.read_csv("物流配送数据.csv")
df['配送总费用'] = df['基础配送费 (元)'] + df['超重费 (元)']
df['发货时间'] = pd.to_datetime(df['发货时间'])
df['签收时间'] = pd.to_datetime(df['签收时间'])
df['配送耗时'] = (df['签收时间'] - df['发货时间']).dt.total_seconds() / 3600
print(df)

运行结果:

1.png

2. 按 “发货时间” 提取日期(日)信息,统计每月各日的配送订单量和平均配送距离。

df['发货月份'] = df['发货时间'].dt.month
df['发货日期'] = df['发货时间'].dt.day
df_states = df.groupby(['发货月份', '发货日期']).agg(
    配送订单量=('运单号', 'count'),
    平均配送距离=('配送距离 (km)', 'mean')
).reset_index()
print(df_states)

运行结果:

222.png

3. 计算配送耗时的最大值、最小值、均值和变异系数(标准差 / 均值)。

df_time = df['配送耗时'].agg(['max', 'min', 'mean', 'std'])
df_time['变异系数'] = df_time['std'] / df_time['mean']
print(df_time)

运行结果:

3333333.png

4. 按配送距离分组(0-10km、10-20km、20km+),统计每组的准时签收率和平均总配送费,绘制柱状图。

def group_distance(dist):
    if  0 <= dist <10:
        return "0-10km"
    elif 10 <= dist < 20:
        return "10-20km"
    else:
        return "20km+"
df['配送距离分组'] = df['配送距离 (km)'].apply(group_distance)
df['准时签收标记'] = df['是否准时签收'].map({'是':1, '否':0})
print(df)
df_dis = df.groupby('配送距离分组').agg(
    准时签收率=('准时签收标记', 'mean'),
    平均总配送费=('配送总费用', 'mean')
).reset_index()
print(df_dis)
# 准时签收率
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.bar(df_dis.index, df_dis['准时签收率'])
plt.title('准时签收率')
plt.show()
# 配送总费用
plt.bar(df_dis.index, df_dis['平均总配送费'])
plt.title('平均总配送费')
plt.show()

运行结果:

4444444.png

tttttttttt33333333333333.png

屏幕截图 2025-12-10 094334.png

5. 保存配送耗时超过 24 小时的订单数据为 “超时配送订单.csv”(不含索引)。

new_df = df[df['配送耗时'] > 24]
new_df.to_csv("超时配送订单.csv")

完整代码:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 1. 读取 CSV 文件数据,计算配送总费用(基础配送费 + 超重费),并计算配送耗时(签收时间 - 发货时间,单位:小时),添加这两个新列。
df = pd.read_csv("物流配送数据.csv")
df['配送总费用'] = df['基础配送费 (元)'] + df['超重费 (元)']
df['发货时间'] = pd.to_datetime(df['发货时间'])
df['签收时间'] = pd.to_datetime(df['签收时间'])
df['配送耗时'] = (df['签收时间'] - df['发货时间']).dt.total_seconds() / 3600
print(df)

# 2. 按 “发货时间” 提取日期(日)信息,统计每月各日的配送订单量和平均配送距离。
df['发货月份'] = df['发货时间'].dt.month
df['发货日期'] = df['发货时间'].dt.day
df_states = df.groupby(['发货月份', '发货日期']).agg(
    配送订单量=('运单号', 'count'),
    平均配送距离=('配送距离 (km)', 'mean')
).reset_index()
print(df_states)

# 3. 计算配送耗时的最大值、最小值、均值和变异系数(标准差 / 均值)。
df_time = df['配送耗时'].agg(['max', 'min', 'mean', 'std'])
df_time['变异系数'] = df_time['std'] / df_time['mean']
print(df_time)

# 4. 按配送距离分组(0-10km、10-20km、20km+),统计每组的准时签收率和平均总配送费,绘制柱状图。
def group_distance(dist):
    if  0 <= dist <10:
        return "0-10km"
    elif 10 <= dist < 20:
        return "10-20km"
    else:
        return "20km+"
df['配送距离分组'] = df['配送距离 (km)'].apply(group_distance)
df['准时签收标记'] = df['是否准时签收'].map({'是':1, '否':0})
print(df)
df_dis = df.groupby('配送距离分组').agg(
    准时签收率=('准时签收标记', 'mean'),
    平均总配送费=('配送总费用', 'mean')
).reset_index()
print(df_dis)
# 准时签收率
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.bar(df_dis.index, df_dis['准时签收率'])
plt.title('准时签收率')
plt.show()
# 配送总费用
plt.bar(df_dis.index, df_dis['平均总配送费'])
plt.title('平均总配送费')
plt.show()

# 5. 保存配送耗时超过 24 小时的订单数据为 “超时配送订单.csv”(不含索引)。
new_df = df[df['配送耗时'] > 24]
new_df.to_csv("超时配送订单.csv")