python练习题17

39 阅读9分钟

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

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

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
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
q90 = df['配送时长 (分钟)'].quantile(0.9)
print(f"配送时长的变异系数为{hour_cv:.2f},90分位数为{q90:.2f}")

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

df['准时配送'] = df['配送时长 (分钟)'] <= 30
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.title('准时配送率')
plt.bar(df_states['菜品类型'],df_states['准时配送率'])
plt.show()

运行结果如图:

屏幕截图 2025-12-17 100701.png

屏幕截图 2025-12-17 100740.png

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['里程加价 (元)']
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)

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(df_states)

# 平均总费用
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置为黑体
plt.title('平均总费用')
plt.bar(states['行驶里程分组'],states['平均总费用'])
plt.show()
# 高峰期订单占比
plt.title('高峰期订单占比')
plt.bar(states['行驶里程分组'],states['高峰期订单占比'])
plt.show()

运行结果如图:

屏幕截图 2025-12-17 100805.png

屏幕截图 2025-12-17 100830.png

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(df_states)
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()

运行结果如图:

屏幕截图 2025-12-17 100859.png

屏幕截图 2025-12-17 100922.png

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

states = df.groupby("距离分组").agg(
    平均延误时长=("延误时长 (分钟)","mean"),
    平均乘客人数=("乘客人数","mean")
).reset_index()
print(df_states)

# 平均延误时长
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置为黑体
plt.title('平均延误时长')
plt.bar(states['距离分组'],states['平均延误时长'])
plt.show()
# 平均乘客人数
plt.title('平均乘客人数')
plt.bar(states['距离分组'],states['平均乘客人数'])
plt.show()

运行结果如图:

屏幕截图 2025-12-17 100945.png

屏幕截图 2025-12-17 101007.png

5. 保存延误时长≥60 分钟且天气原因延误的航班数据为 “严重延误航班.csv”(不含索引)。

df_new = df[(df['延误时长 (分钟)'] >= 60) & (df['是否天气原因延误'] == '是')]
df_new.to_csv("严重延误航班.csv")