# Calculate monthly revenue for Sep-Dec 2025 + Jan 2026
monthly_data = []
months = [
("09", "2025", "sep_revenue", "9月"),
("10", "2025", "oct_revenue", "10月"),
("11", "2025", "nov_revenue", "11月"),
("12", "2025", "dec_revenue", "12月"),
("01", "2026", "jan_revenue", "1月"),
]
# Start with target customers base (include route and csm)
export_df = target_customers.select(["customer_code", "trade_name", "delivery_route", "csm"])
for month_num, year, col_name, _ in months:
start_date = f"{year}{month_num}01"
if month_num == "01":
end_date = f"{year}{month_num}07" # Only up to Jan 7
else:
end_date = f"{year}{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("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("jan_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",
"sep_revenue",
"oct_revenue",
"nov_revenue",
"dec_revenue",
"jan_revenue",
])
.sort("customer_code")
)
# Display sample
(
GT(export_df.head(20))
.tab_header(
title="月度營收明細 (前20筆)",
subtitle="2025年9月至2026年1月"
)
.cols_label(
customer_code="客戶代碼",
trade_name="商號名稱",
delivery_route="路線",
csm="CSM",
avg_ticket_size="平均客單",
sep_revenue="9月",
oct_revenue="10月",
nov_revenue="11月",
dec_revenue="12月",
jan_revenue="1月",
)
.fmt_number(
columns=["avg_ticket_size", "sep_revenue", "oct_revenue",
"nov_revenue", "dec_revenue", "jan_revenue"],
decimals=0,
use_seps=True
)
)