Five more functions. filter_active_customers, compute_arpu_per_customer, find_first_churned, group_by_plan, plan_summary. Which one clicked hardest?
group_by_plan honestly. The idea that a dict is just a customer record — fields you look up by name, not column position — changed how I see my CRM data.
And plan_summary builds on it — group_by_plan gives you the buckets, then you aggregate each one. That's your board deck pivot table replaced by a function chain.
I ran filter_active_customers then group_by_plan on a test set and got the same result as my Excel pivot. Except it took half a second instead of two minutes.
Speed is nice, but composability is the real win. Your plan_summary can feed format_mrr_line from Week 1. They compose because they're functions.
Ready to lock in Week 2. Six questions.
Two of these revisit Week 1 territory — f-strings and bool logic. Make sure those are still solid.
Five more functions. filter_active_customers, compute_arpu_per_customer, find_first_churned, group_by_plan, plan_summary. Which one clicked hardest?
group_by_plan honestly. The idea that a dict is just a customer record — fields you look up by name, not column position — changed how I see my CRM data.
And plan_summary builds on it — group_by_plan gives you the buckets, then you aggregate each one. That's your board deck pivot table replaced by a function chain.
I ran filter_active_customers then group_by_plan on a test set and got the same result as my Excel pivot. Except it took half a second instead of two minutes.
Speed is nice, but composability is the real win. Your plan_summary can feed format_mrr_line from Week 1. They compose because they're functions.
Ready to lock in Week 2. Six questions.
Two of these revisit Week 1 territory — f-strings and bool logic. Make sure those are still solid.