编写Python函数:依据store_id和date获取前一日销售额
解决面试中的两个Pandas数据处理任务
1. 构建符合要求的数据集
按照面试要求,我们需要生成包含3个门店、每个门店对应3个连续日期、共9条记录,且所有门店覆盖相同9个连续日期的数据集。以下是实现代码:
import pandas as pd import numpy as np # 生成9个连续日期(2023-01-01至2023-01-09) dates = pd.date_range(start='2023-01-01', periods=9) # 为每个门店分配连续3天的日期 store_ids = [] store_dates = [] for store_num in [1, 2, 3]: # 每个门店取3个连续日期,起始位置按门店编号偏移 start_pos = (store_num - 1) * 3 store_dates.extend(dates[start_pos:start_pos+3]) store_ids.extend([store_num] * 3) # 生成10-99之间的随机销售额 sales = np.random.randint(10, 100, size=9) # 构建DataFrame store_df = pd.DataFrame({ 'store_id': store_ids, 'date': store_dates, 'sales': sales }) # 可选:将日期转为字符串格式(与示例格式一致) store_df['date'] = store_df['date'].dt.strftime('%Y-%m-%d')
生成的数据集示例:
store_id date sales 0 1 2023-01-01 45 1 1 2023-01-02 72 2 1 2023-01-03 19 3 2 2023-01-04 88 4 2 2023-01-05 33 5 2 2023-01-06 51 6 3 2023-01-07 67 7 3 2023-01-08 22 8 3 2023-01-09 94
2. 实现查询前一日销售额的函数
以下提供两种实用的实现方式:
方式一:预处理后查询(效率更高)
先提前计算每个门店每条记录的前一日销售额,再通过函数快速查询:
# 先将日期列转为datetime类型,方便日期操作 store_df['date'] = pd.to_datetime(store_df['date']) # 按门店分组,对每组销售额做位移,得到前一日销售额 store_df['prev_day_sales'] = store_df.groupby('store_id')['sales'].shift(1) def get_prev_day_sales(store_id, target_date): # 转换输入日期为datetime格式 target_date = pd.to_datetime(target_date) # 筛选对应门店和目标日期的记录 match = store_df[(store_df['store_id'] == store_id) & (store_df['date'] == target_date)] # 返回结果,无匹配则返回None return match['prev_day_sales'].iloc[0] if not match.empty else None
测试示例:
# 查询门店1在2023-01-02的前一日销售额 print(get_prev_day_sales(1, '2023-01-02')) # 输出:45 # 查询门店2在2023-01-04的前一日销售额(无记录) print(get_prev_day_sales(2, '2023-01-04')) # 输出:None
方式二:函数内动态计算(逻辑更直观)
无需预处理,直接在函数中计算目标日期的前一天,并查询对应门店的销售额:
def get_prev_day_sales(store_id, target_date): target_date = pd.to_datetime(target_date) # 获取该门店的所有记录并按日期排序 store_records = store_df[store_df['store_id'] == store_id].sort_values('date') # 计算目标日期的前一天 prev_date = target_date - pd.Timedelta(days=1) # 查询前一天的销售额 prev_sales = store_records[store_records['date'] == prev_date]['sales'] return prev_sales.iloc[0] if not prev_sales.empty else None
内容的提问来源于stack exchange,提问作者Aravinth Meganathan
相关产品推荐
相关产品推荐

