# Calculate monthly revenue for Aug-Dec 2025
monthly_data = []
months = [
("08", "aug_revenue", "8月"),
("09", "sep_revenue", "9月"),
("10", "oct_revenue", "10月"),
("11", "nov_revenue", "11月"),
("12", "dec_revenue", "12月"),
]
# Start with target customers base (include route and csm)
export_df = target_customers.select(["customer_code", "trade_name", "delivery_route", "csm"])
for month_num, col_name, _ in months:
start_date = f"2025{month_num}01"
end_date = f"2025{month_num}31"
month_sales = (
geo_orders
.filter(
pl.col("customer_code").is_in(target_customer_codes) &
(pl.col("order_date") >= start_date) &
(pl.col("order_date") <= end_date)
)
.group_by("customer_code")
.agg(pl.col("order_total").sum().alias(col_name))
)
export_df = export_df.join(month_sales, on="customer_code", how="left")
# Calculate average ticket size
avg_ticket = (
geo_orders
.filter(pl.col("customer_code").is_in(target_customer_codes))
.group_by("customer_code")
.agg(pl.col("order_total").mean().alias("avg_ticket_size"))
)
export_df = (
export_df
.join(avg_ticket, on="customer_code", how="left")
.with_columns([
pl.col("aug_revenue").fill_null(0),
pl.col("sep_revenue").fill_null(0),
pl.col("oct_revenue").fill_null(0),
pl.col("nov_revenue").fill_null(0),
pl.col("dec_revenue").fill_null(0),
pl.col("avg_ticket_size").fill_null(0).round(0),
pl.col("csm").fill_null(""),
])
.select([
"customer_code",
"trade_name",
"delivery_route",
"csm",
"avg_ticket_size",
"aug_revenue",
"sep_revenue",
"oct_revenue",
"nov_revenue",
"dec_revenue",
])
.sort("customer_code")
)
# Display sample
(
GT(export_df.head(20))
.tab_header(
title="月度營收明細 (前20筆)",
subtitle="2025年8月至12月"
)
.cols_label(
customer_code="客戶代碼",
trade_name="商號名稱",
delivery_route="路線",
csm="CSM",
avg_ticket_size="平均客單",
aug_revenue="8月",
sep_revenue="9月",
oct_revenue="10月",
nov_revenue="11月",
dec_revenue="12月",
)
.fmt_number(
columns=["avg_ticket_size", "aug_revenue", "sep_revenue",
"oct_revenue", "nov_revenue", "dec_revenue"],
decimals=0,
use_seps=True
)
)