Skip to content

Commit 95eb5c1

Browse files
Copilotmrjf
andauthored
Fix Python playground examples validation
Co-authored-by: mrjf <180956+mrjf@users.noreply.github.com>
1 parent bc7d21e commit 95eb5c1

3 files changed

Lines changed: 107 additions & 7 deletions

File tree

playground/example_inventory_replenishment.html

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,25 @@ <h2>1 · Enrich sales with product master data</h2>
198198
<textarea class="playground-python" style="display:none">from io import StringIO
199199
import pandas as pd
200200

201+
csv = """date,sku,store,units_sold,on_hand,unit_cost
202+
2024-04-01,A100,Downtown,8,40,12
203+
2024-04-02,A100,Downtown,11,31,12
204+
2024-04-03,A100,Downtown,9,22,12
205+
2024-04-04,A100,Downtown,10,14,12
206+
2024-04-01,B200,Downtown,4,28,22
207+
2024-04-02,B200,Downtown,5,23,22
208+
2024-04-03,B200,Downtown,7,16,22
209+
2024-04-04,B200,Downtown,6,10,22
210+
2024-04-01,C300,Uptown,3,18,35
211+
2024-04-02,C300,Uptown,2,16,35
212+
2024-04-03,C300,Uptown,4,12,35
213+
2024-04-04,C300,Uptown,5,7,35"""
201214
sales = pd.read_csv(StringIO(csv))
202-
master = pd.DataFrame([...])
215+
master = pd.DataFrame([
216+
{"sku": "A100", "category": "accessories", "supplier": "Acme", "lead_days": 5},
217+
{"sku": "B200", "category": "apparel", "supplier": "Northwind", "lead_days": 8},
218+
{"sku": "C300", "category": "home", "supplier": "Acme", "lead_days": 6},
219+
])
203220
enriched = sales.merge(master, on="sku", how="left")
204221
enriched["inventory_value"] = enriched["on_hand"] * enriched["unit_cost"]
205222
enriched["sell_through"] = enriched["units_sold"] / (enriched["on_hand"] + enriched["units_sold"])
@@ -260,7 +277,24 @@ <h2>2 · Calculate reorder points from recent demand</h2>
260277
});
261278
console.log("\nDemand by reorder status:");
262279
console.log(heatmap.toString());</textarea>
263-
<textarea class="playground-python" style="display:none">plan = pd.DataFrame(rows).sort_values(["sku", "date"])
280+
<textarea class="playground-python" style="display:none">import numpy as np
281+
import pandas as pd
282+
283+
rows = [
284+
{"date": "2024-04-01", "sku": "A100", "units_sold": 8, "on_hand": 40, "lead_days": 5},
285+
{"date": "2024-04-02", "sku": "A100", "units_sold": 11, "on_hand": 31, "lead_days": 5},
286+
{"date": "2024-04-03", "sku": "A100", "units_sold": 9, "on_hand": 22, "lead_days": 5},
287+
{"date": "2024-04-04", "sku": "A100", "units_sold": 10, "on_hand": 14, "lead_days": 5},
288+
{"date": "2024-04-01", "sku": "B200", "units_sold": 4, "on_hand": 28, "lead_days": 8},
289+
{"date": "2024-04-02", "sku": "B200", "units_sold": 5, "on_hand": 23, "lead_days": 8},
290+
{"date": "2024-04-03", "sku": "B200", "units_sold": 7, "on_hand": 16, "lead_days": 8},
291+
{"date": "2024-04-04", "sku": "B200", "units_sold": 6, "on_hand": 10, "lead_days": 8},
292+
{"date": "2024-04-01", "sku": "C300", "units_sold": 3, "on_hand": 18, "lead_days": 6},
293+
{"date": "2024-04-02", "sku": "C300", "units_sold": 2, "on_hand": 16, "lead_days": 6},
294+
{"date": "2024-04-03", "sku": "C300", "units_sold": 4, "on_hand": 12, "lead_days": 6},
295+
{"date": "2024-04-04", "sku": "C300", "units_sold": 5, "on_hand": 7, "lead_days": 6},
296+
]
297+
plan = pd.DataFrame(rows).sort_values(["sku", "date"])
264298
plan["rolling_3d_demand"] = plan.groupby("sku")["units_sold"].transform(lambda s: s.rolling(3, min_periods=1).mean())
265299
plan["reorder_point"] = plan["rolling_3d_demand"] * plan["lead_days"]
266300
plan["status"] = np.where(plan["on_hand"] &lt;= plan["reorder_point"], "reorder", "ok")

playground/example_marketing_attribution.html

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,30 @@ <h2>1 · Normalize spend and join conversions</h2>
203203
.sortValues("roas", false);
204204
console.log("\nChannel rollup:");
205205
console.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")
207230
joined = spend.merge(conversions, on=["date", "region", "channel"], how="left")
208231
joined["roas"] = joined["revenue"] / joined["spend"]
209232
joined["cost_per_order"] = joined["spend"] / joined["orders"]
@@ -255,7 +278,23 @@ <h2>2 · Compare region/channel performance</h2>
255278
const efficient = nlargestDataFrame(joined, 4, { columns: "roas" }).select(["region", "channel", "spend", "revenue", "roas"]);
256279
console.log("\nBest daily placements:");
257280
console.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"]
259298
print(pd.pivot_table(joined, index="region", columns="channel", values="roas", aggfunc="mean", fill_value=0, margins=True))
260299
print(joined.nlargest(4, "roas")[["region", "channel", "spend", "revenue", "roas"]])</textarea>
261300
<div class="playground-output">Click ▶ Run to execute</div>

playground/example_marketplace_fraud.html

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,23 @@ <h2>1 · Join risk signals and score transactions</h2>
200200
console.log(nlargestDataFrame(highRisk, 3, { columns: "risk_score" }).select(["txn_id", "merchant_name", "risk_score"]).toString());</textarea>
201201
<textarea class="playground-python" style="display:none">import pandas as pd
202202

203-
transactions = pd.DataFrame([...])
204-
merchants = pd.DataFrame([...])
203+
transactions = pd.DataFrame([
204+
{"txn_id": "t001", "merchant_id": "m01", "segment": "electronics", "device": "mobile", "amount": 1299, "card_testing": 0},
205+
{"txn_id": "t002", "merchant_id": "m02", "segment": "fashion", "device": "desktop", "amount": 184, "card_testing": 0},
206+
{"txn_id": "t003", "merchant_id": "m03", "segment": "gaming", "device": "mobile", "amount": 720, "card_testing": 1},
207+
{"txn_id": "t004", "merchant_id": "m01", "segment": "electronics", "device": "desktop", "amount": 899, "card_testing": 0},
208+
{"txn_id": "t005", "merchant_id": "m04", "segment": "travel", "device": "mobile", "amount": 1450, "card_testing": 1},
209+
{"txn_id": "t006", "merchant_id": "m05", "segment": "fashion", "device": "mobile", "amount": 92, "card_testing": 0},
210+
{"txn_id": "t007", "merchant_id": "m03", "segment": "gaming", "device": "desktop", "amount": 610, "card_testing": 0},
211+
{"txn_id": "t008", "merchant_id": "m04", "segment": "travel", "device": "desktop", "amount": 980, "card_testing": 0},
212+
])
213+
merchants = pd.DataFrame([
214+
{"merchant_id": "m01", "merchant_name": "Northstar Cameras", "chargeback_rate": 0.018},
215+
{"merchant_id": "m02", "merchant_name": "Threadline", "chargeback_rate": 0.012},
216+
{"merchant_id": "m03", "merchant_name": "Pixel Arcade", "chargeback_rate": 0.071},
217+
{"merchant_id": "m04", "merchant_name": "FlyAway Deals", "chargeback_rate": 0.096},
218+
{"merchant_id": "m05", "merchant_name": "Studio Basics", "chargeback_rate": 0.009},
219+
])
205220
triaged = transactions.merge(merchants, on="merchant_id", how="left")
206221
triaged["expected_loss"] = triaged["amount"] * triaged["chargeback_rate"]
207222
triaged["risk_score"] = triaged["expected_loss"] + triaged["card_testing"] * 25
@@ -253,7 +268,19 @@ <h2>2 · Build a fraud heatmap and merchant leaderboard</h2>
253268
.sortValues("expected_loss", false);
254269
console.log("\nMerchant exposure leaderboard:");
255270
console.log(merchantExposure.toString());</textarea>
256-
<textarea class="playground-python" style="display:none">heatmap = pd.pivot_table(
271+
<textarea class="playground-python" style="display:none">import pandas as pd
272+
273+
triaged = pd.DataFrame([
274+
{"merchant_id": "m01", "segment": "electronics", "device": "mobile", "amount": 1299, "expected_loss": 23.38},
275+
{"merchant_id": "m02", "segment": "fashion", "device": "desktop", "amount": 184, "expected_loss": 2.21},
276+
{"merchant_id": "m03", "segment": "gaming", "device": "mobile", "amount": 720, "expected_loss": 51.12},
277+
{"merchant_id": "m01", "segment": "electronics", "device": "desktop", "amount": 899, "expected_loss": 16.18},
278+
{"merchant_id": "m04", "segment": "travel", "device": "mobile", "amount": 1450, "expected_loss": 139.20},
279+
{"merchant_id": "m05", "segment": "fashion", "device": "mobile", "amount": 92, "expected_loss": 0.83},
280+
{"merchant_id": "m03", "segment": "gaming", "device": "desktop", "amount": 610, "expected_loss": 43.31},
281+
{"merchant_id": "m04", "segment": "travel", "device": "desktop", "amount": 980, "expected_loss": 94.08},
282+
])
283+
heatmap = pd.pivot_table(
257284
triaged, index="segment", columns="device", values="expected_loss",
258285
aggfunc="sum", fill_value=0, margins=True,
259286
)

0 commit comments

Comments
 (0)