python test 14

46 阅读8分钟
# 题目 1:外卖平台商家经营数据分析
# “外卖商家数据.csv” 包含字段:“商家 ID”“接单日期”“菜品类型 (快餐 / 火锅 / 烧烤 / 甜品)”“接单数量”“客单价 (元)”“平台抽成比例 (%)”“配送时长 (分钟)”。请使用 pandas 和 matplotlib 完成以下任务:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 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_mean = df.groupby("星期名称").agg(
    平均接单数量=("接单数量", "mean"),
    平均配送时长=("配送时长 (分钟)", "mean")
).reset_index()
print(df_mean)

# 3. 计算配送时长的变异系数(标准差 / 均值)和 90 分位数。
hour_mean = df["配送时长 (分钟)"].mean()# 均值
hour_std = df["配送时长 (分钟)"].std()# 标准差
hour_cv = hour_std / hour_mean # 变异系数
h90 = df["配送时长 (分钟)"].quantile(0.9)
print(f"配送时长的变异系数{hour_cv:.2f},90分位数为{h90:.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 元)和行驶时长(到达时间 - 出发时间,单位:分钟),添加这两个新列。
df = pd.read_csv("网约车出行数据.csv")
df["出行总费用"] = df["基础车费 (元)"] + df["里程加价 (元)"]
df.loc[df["是否高峰期"] == "是", "出行总费用"] += 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)

# 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")

# 题目 3:奶茶店销售数据统计分析
# “奶茶销售数据.csv” 包含字段:“销售单号”“销售日期”“饮品类型 (奶茶 / 果茶 / 咖啡 / 酸奶)”“杯数”“单杯价格 (元)”“加料费用 (元)”“支付方式 (微信 / 支付宝 / 现金)”。请使用 pandas 和 matplotlib 完成以下任务:

# 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 完成以下任务:

# 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 # 变异系数
print(delay_mean, delay_median, delay_cv)

# 4. 按航线距离分组统计+绘图(修正列名和代码细节)
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. 保存数据(修正:条件判断用&,且要加括号)
df_new = df[(df['延误时长 (分钟)'] >= 60) & (df['是否天气原因延误'] == '是')]
df_new.to_csv("严重延误航班.csv", index=False)

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png