@@ -203,7 +203,30 @@ <h2>1 · Normalize spend and join conversions</h2>
203203 .sortValues("roas", false);
204204console.log("\nChannel rollup:");
205205console.log(channelRollup.toString());</ textarea >
206- < textarea class ="playground-python " style ="display:none "> spend = spend_wide.melt(id_vars=["date", "region"], value_vars=["search", "social", "email"], var_name="channel", value_name="spend")
206+ < textarea class ="playground-python " style ="display:none "> import pandas as pd
207+
208+ spend_wide = pd.DataFrame({
209+ "date": ["2024-05-01", "2024-05-01", "2024-05-02", "2024-05-02"],
210+ "region": ["NA", "EU", "NA", "EU"],
211+ "search": [1200, 900, 1350, 980],
212+ "social": [800, 740, 880, 790],
213+ "email": [300, 260, 320, 280],
214+ })
215+ conversions = pd.DataFrame([
216+ {"date": "2024-05-01", "region": "NA", "channel": "search", "orders": 62, "revenue": 8680},
217+ {"date": "2024-05-01", "region": "NA", "channel": "social", "orders": 35, "revenue": 3920},
218+ {"date": "2024-05-01", "region": "NA", "channel": "email", "orders": 18, "revenue": 2520},
219+ {"date": "2024-05-01", "region": "EU", "channel": "search", "orders": 44, "revenue": 5280},
220+ {"date": "2024-05-01", "region": "EU", "channel": "social", "orders": 31, "revenue": 3100},
221+ {"date": "2024-05-01", "region": "EU", "channel": "email", "orders": 16, "revenue": 1760},
222+ {"date": "2024-05-02", "region": "NA", "channel": "search", "orders": 71, "revenue": 9940},
223+ {"date": "2024-05-02", "region": "NA", "channel": "social", "orders": 42, "revenue": 5040},
224+ {"date": "2024-05-02", "region": "NA", "channel": "email", "orders": 21, "revenue": 3150},
225+ {"date": "2024-05-02", "region": "EU", "channel": "search", "orders": 49, "revenue": 6370},
226+ {"date": "2024-05-02", "region": "EU", "channel": "social", "orders": 33, "revenue": 3465},
227+ {"date": "2024-05-02", "region": "EU", "channel": "email", "orders": 19, "revenue": 2280},
228+ ])
229+ spend = spend_wide.melt(id_vars=["date", "region"], value_vars=["search", "social", "email"], var_name="channel", value_name="spend")
207230joined = spend.merge(conversions, on=["date", "region", "channel"], how="left")
208231joined["roas"] = joined["revenue"] / joined["spend"]
209232joined["cost_per_order"] = joined["spend"] / joined["orders"]
@@ -255,7 +278,23 @@ <h2>2 · Compare region/channel performance</h2>
255278const efficient = nlargestDataFrame(joined, 4, { columns: "roas" }).select(["region", "channel", "spend", "revenue", "roas"]);
256279console.log("\nBest daily placements:");
257280console.log(efficient.toString());</ textarea >
258- < textarea class ="playground-python " style ="display:none "> joined["roas"] = joined["revenue"] / joined["spend"]
281+ < textarea class ="playground-python " style ="display:none "> import pandas as pd
282+
283+ joined = pd.DataFrame([
284+ {"region": "NA", "channel": "search", "spend": 1200, "revenue": 8680, "orders": 62},
285+ {"region": "NA", "channel": "social", "spend": 800, "revenue": 3920, "orders": 35},
286+ {"region": "NA", "channel": "email", "spend": 300, "revenue": 2520, "orders": 18},
287+ {"region": "EU", "channel": "search", "spend": 900, "revenue": 5280, "orders": 44},
288+ {"region": "EU", "channel": "social", "spend": 740, "revenue": 3100, "orders": 31},
289+ {"region": "EU", "channel": "email", "spend": 260, "revenue": 1760, "orders": 16},
290+ {"region": "NA", "channel": "search", "spend": 1350, "revenue": 9940, "orders": 71},
291+ {"region": "NA", "channel": "social", "spend": 880, "revenue": 5040, "orders": 42},
292+ {"region": "NA", "channel": "email", "spend": 320, "revenue": 3150, "orders": 21},
293+ {"region": "EU", "channel": "search", "spend": 980, "revenue": 6370, "orders": 49},
294+ {"region": "EU", "channel": "social", "spend": 790, "revenue": 3465, "orders": 33},
295+ {"region": "EU", "channel": "email", "spend": 280, "revenue": 2280, "orders": 19},
296+ ])
297+ joined["roas"] = joined["revenue"] / joined["spend"]
259298print(pd.pivot_table(joined, index="region", columns="channel", values="roas", aggfunc="mean", fill_value=0, margins=True))
260299print(joined.nlargest(4, "roas")[["region", "channel", "spend", "revenue", "roas"]])</ textarea >
261300 < div class ="playground-output "> Click ▶ Run to execute</ div >
0 commit comments