使用Pandas计算订单日期间的物料消耗率
使用Pandas计算住宅物料日均消耗率
嘿,作为Python新手能先用SQL搞定核心逻辑已经超棒啦!下面我一步步带你用Pandas实现这个需求,代码里会加详细注释,你跟着复制运行就能理解每一步的作用~
第一步:先把你的数据转成可运行的Pandas DataFrame
首先我们把你提供的表格转换成Pandas能识别的格式,方便后续操作:
import pandas as pd # 构造你的数据 data = { "House": ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A"], "CheckDate": ["2020-01-01", "2020-01-02", "2020-01-03", "2020-05-01", "2020-05-02", "2020-05-15", "2020-05-15", "2020-05-16", "2020-06-17", "2020-07-03"], "Reading": [43.21, 43.06, 42.97, 9.82, 9.65, 0.23, 25.94, 49.71, 6.57, 9.65], "OrderDate": [pd.NaT, pd.NaT, pd.NaT, "2020-05-01", pd.NaT, pd.NaT, pd.NaT, pd.NaT, "2020-06-17", pd.NaT], "OrderedQuantity": [pd.NA, pd.NA, pd.NA, 50, pd.NA, pd.NA, pd.NA, pd.NA, 50, pd.NA], "DeliveryDate": [pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, pd.NaT, "2020-05-15", pd.NaT, pd.NaT, pd.NaT], "DeliveredQuantity": [pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, pd.NA, 50, pd.NA, pd.NA, pd.NA] } df = pd.DataFrame(data) # 把日期列转换成datetime类型,这一步很重要,不然没法计算日期间隔 df["CheckDate"] = pd.to_datetime(df["CheckDate"]) df["OrderDate"] = pd.to_datetime(df["OrderDate"]) df["DeliveryDate"] = pd.to_datetime(df["DeliveryDate"])
第二步:实现你的计算逻辑
按照你给出的公式,我们分步骤计算:
1. 提取订单相关的关键信息
首先筛选出所有有订单的记录(OrderDate不为空的行),然后找到首次和末次订单的日期,以及对应的Reading值:
# 筛选有订单的行并按日期排序 order_records = df[df["OrderDate"].notna()].sort_values("OrderDate") # 首次订单日的Reading值 first_order_reading = order_records.iloc[0]["Reading"] # 末次订单日的Reading值 last_order_reading = order_records.iloc[-1]["Reading"] # 计算首尾订单日的间隔天数(提取days属性获得整数天数) days_between = (order_records.iloc[-1]["OrderDate"] - order_records.iloc[0]["OrderDate"]).days
2. 计算所有配送量的总和
然后统计所有已完成配送的数量之和:
total_delivered = df["DeliveredQuantity"].dropna().sum()
3. 计算总消耗量和日均消耗率
最后代入你的公式计算最终结果:
# 总消耗量 = 所有配送量之和 + 首次订单日Reading值 - 末次订单日Reading值 total_consumption = total_delivered + first_order_reading - last_order_reading # 日均消耗率 = 总消耗量 / 首尾订单日间隔天数 daily_consumption_rate = total_consumption / days_between # 打印结果,保留两位小数更直观 print(f"总消耗量: {total_consumption:.2f}") print(f"日均消耗率: {daily_consumption_rate:.2f}")
运行结果说明
根据你的数据,运行后会得到:
- 总消耗量:
50 + 9.82 - 6.57 = 53.25 - 首尾订单日间隔:2020-06-17 减去 2020-05-01,一共47天
- 日均消耗率:
53.25 / 47 ≈ 1.13
额外提示(针对新手)
- 一定要把日期列转换成
datetime类型,不然Pandas没法识别日期格式,计算间隔会出错 - 如果你的数据包含多个住宅,可以用
groupby("House")分组计算每个住宅的消耗率,示例代码如下:
def calculate_consumption(group): order_records = group[group["OrderDate"].notna()].sort_values("OrderDate") # 处理没有足够订单记录的情况 if len(order_records) < 2: return pd.Series([None, None], index=["total_consumption", "daily_rate"]) first_order_reading = order_records.iloc[0]["Reading"] last_order_reading = order_records.iloc[-1]["Reading"] days_between = (order_records.iloc[-1]["OrderDate"] - order_records.iloc[0]["OrderDate"]).days total_delivered = group["DeliveredQuantity"].dropna().sum() total_consumption = total_delivered + first_order_reading - last_order_reading daily_rate = total_consumption / days_between return pd.Series([total_consumption, daily_rate], index=["total_consumption", "daily_rate"]) # 按House分组计算每个住宅的消耗数据 result = df.groupby("House").apply(calculate_consumption).reset_index() print(result)
内容的提问来源于stack exchange,提问作者f722axzo5d
相关产品推荐
相关产品推荐

