[
 {
  "type": "article",
  "slug": "welt-a-collection-of-groundbreaking-models",
  "title": "Welt: A Collection of Groundbreaking Models",
  "initials": "WC",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation",
   "Causal discovery"
  ],
  "format": "Foundations",
  "source": "Welt team",
  "summary": "All the models you need in one table.",
  "charts": false,
  "url": "https://ergodic.dev/research/articles/welt-a-collection-of-groundbreaking-models"
 },
 {
  "type": "article",
  "slug": "how-welt-works",
  "title": "How Welt Works",
  "initials": "HW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Forecasting",
   "Causal discovery"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Five short steps through the collection, each with a tiny example, the code and a notebook that opens in Colab.",
  "url": "https://ergodic.dev/research/articles/how-welt-works"
 },
 {
  "type": "article",
  "slug": "get-started-with-welt",
  "title": "Get Started with Welt",
  "initials": "GS",
  "status": "Published",
  "topics": [
   "Prediction",
   "Forecasting",
   "Causal discovery",
   "Model evaluation"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Connect Welt to your AI assistant or to Python, make your first prediction on a real table, then pick the guide for what you want to do next.",
  "link": "https://ergodic-ai.github.io/welt-python/index.html",
  "url": "https://ergodic.dev/research/articles/get-started-with-welt"
 },
 {
  "type": "article",
  "slug": "connect-welt-to-your-ai-assistant",
  "title": "Connect Welt to Claude, ChatGPT and Your AI Assistant",
  "initials": "CW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Forecasting",
   "Causal discovery",
   "Model evaluation"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Add Welt's MCP server to Claude, ChatGPT, Claude Code, Codex, Cursor or VS Code, sign in once, and ask your assistant to run Welt's models on your data.",
  "link": "https://welt.ergodic.dev/agents/mcp.md",
  "url": "https://ergodic.dev/research/articles/connect-welt-to-your-ai-assistant"
 },
 {
  "type": "article",
  "slug": "guide-predict-with-your-own-table",
  "title": "Predict with Your Own Table",
  "initials": "PO",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Train on your own labelled table and check it on rows it hasn't seen. You choose the task and name the target, so Welt never guesses either.",
  "link": "https://ergodic-ai.github.io/welt-python/own-data.html",
  "url": "https://ergodic.dev/research/articles/guide-predict-with-your-own-table"
 },
 {
  "type": "article",
  "slug": "guide-predict-a-number",
  "title": "Predict a Number",
  "initials": "PN",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Fit a Regressor on real Yacht data and measure its errors on held-out rows.",
  "link": "https://ergodic-ai.github.io/welt-python/regression.html",
  "url": "https://ergodic.dev/research/articles/guide-predict-a-number"
 },
 {
  "type": "article",
  "slug": "guide-compare-models-with-cross-validation",
  "title": "Compare Models with Cross-Validation",
  "initials": "CM",
  "status": "Published",
  "topics": [
   "Model evaluation",
   "Prediction"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Cross-validate several models on your table and rank them, with a leaderboard, per-fold metrics, out-of-fold predictions and a shareable report.",
  "link": "https://ergodic-ai.github.io/welt-python/evaluations.html",
  "url": "https://ergodic.dev/research/articles/guide-compare-models-with-cross-validation"
 },
 {
  "type": "article",
  "slug": "compare-four-tabular-foundation-models",
  "title": "Compare Four Tabular Foundation Models in One Call",
  "initials": "CF",
  "status": "Published",
  "topics": [
   "Model evaluation"
  ],
  "format": "Tutorial",
  "source": "Welt team",
  "summary": "Cross-validate TabICLv2, Kumo Tabular Medium, TabDPT 1.3 and Mitra-v2 on the same folds with one client.evaluate call, then fit the top-ranked model.",
  "url": "https://ergodic.dev/research/articles/compare-four-tabular-foundation-models"
 },
 {
  "type": "article",
  "slug": "guide-reuse-a-fitted-predictor",
  "title": "Reuse a Fitted Predictor",
  "initials": "RF",
  "status": "Published",
  "topics": [
   "Prediction"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Fit once, then predict on new rows later with the same predictor, without uploading training data or fitting again.",
  "link": "https://ergodic-ai.github.io/welt-python/reuse.html",
  "url": "https://ergodic.dev/research/articles/guide-reuse-a-fitted-predictor"
 },
 {
  "type": "article",
  "slug": "guide-causal-discovery",
  "title": "Discover a Causal Graph",
  "initials": "DC",
  "status": "Published",
  "topics": [
   "Causal discovery"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Discover a causal graph from an observational table with a qualified model, then read its native edges and scores.",
  "link": "https://ergodic-ai.github.io/welt-python/causal-discovery.html",
  "url": "https://ergodic.dev/research/articles/guide-causal-discovery"
 },
 {
  "type": "article",
  "slug": "discover-in-welt-estimate-in-ergodic",
  "title": "From a Table to an Effect: Discover in Welt, Estimate in Ergodic",
  "initials": "FT",
  "status": "Published",
  "topics": [
   "Causal discovery",
   "Forecasting"
  ],
  "format": "Tutorial",
  "source": "Welt team",
  "summary": "Learn a candidate causal graph from a small table in Welt, then test whether it answers your question and estimate the effect in Ergodic.",
  "url": "https://ergodic.dev/research/articles/discover-in-welt-estimate-in-ergodic"
 },
 {
  "type": "article",
  "slug": "guide-research-datasets",
  "title": "Find and Load Research Datasets",
  "initials": "FL",
  "status": "Published",
  "topics": [
   "Prediction"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Search Welt's research catalogue for a real table, inspect its schema and load it into a DataFrame or save it as a file.",
  "link": "https://ergodic-ai.github.io/welt-python/research-datasets.html",
  "url": "https://ergodic.dev/research/articles/guide-research-datasets"
 },
 {
  "type": "article",
  "slug": "guide-welt-cli-for-agents",
  "title": "Run Welt from the CLI or an Agent",
  "initials": "RW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Causal discovery"
  ],
  "format": "Guide",
  "source": "Welt team",
  "summary": "Run Welt from a terminal, a script or an AI agent. Every successful command prints one JSON value you can parse.",
  "link": "https://ergodic-ai.github.io/welt-python/cli.html",
  "url": "https://ergodic.dev/research/articles/guide-welt-cli-for-agents"
 },
 {
  "type": "article",
  "slug": "what-seventy-percent-means",
  "title": "What Does 70% Mean? How to Score a Probabilistic Prediction",
  "initials": "D7",
  "status": "Published",
  "topics": [
   "Model evaluation",
   "Forecasting"
  ],
  "format": "Explainer",
  "source": "Welt team",
  "summary": "A plain guide to Brier score, log loss and calibration, with worked arithmetic, common misreadings and why accuracy alone misleads.",
  "url": "https://ergodic.dev/research/articles/what-seventy-percent-means"
 },
 {
  "type": "article",
  "slug": "policy-brief-small-tables",
  "title": "Small Tables, Real Decisions: A Brief for Public-Sector Analysts",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Model evaluation",
   "Causal discovery",
   "Forecasting"
  ],
  "format": "Article",
  "source": "Welt team",
  "summary": "What tabular foundation models can and can't do on small public tables, and what to ask before procuring an AI forecast.",
  "url": "https://ergodic.dev/research/articles/policy-brief-small-tables"
 },
 {
  "type": "usecase",
  "slug": "will-this-customer-churn",
  "title": "Will This Customer Churn?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Score every customer's chance of cancelling, using the best model in the collection for your table.",
  "audience": "Data scientists and retention teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "IBM Telco customer churn, 7,043 customers",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/evaluation.ipynb",
  "area": "Customers",
  "notebook": "evaluation",
  "lede": "Which of your customers are about to cancel, and how likely is each one to go? A retention team can only call so many people a week, so it needs the list ranked by risk, with a probability next to each name.",
  "steps": [
   [
    "Load the table",
    "<p>Read the public CSV and drop the ID column, which tells a model nothing about churn.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nurl = &quot;https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv&quot;\ncustomers = pd.read_csv(url).drop(columns=&quot;customerID&quot;)\ncustomers[&quot;TotalCharges&quot;] = pd.to_numeric(customers[&quot;TotalCharges&quot;], errors=&quot;coerce&quot;)\nprint(customers.shape, customers[&quot;Churn&quot;].value_counts().to_dict())</code></pre>"
   ],
   [
    "Pick the customers",
    "<p>Set aside 20 customers to score at the end, and keep the rest for the models to learn from.</p>\n<pre><code>new_rows = customers.sample(20, random_state=1)\ntable = customers.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and score",
    "<p>TabICLv2 and Kumo Tabular Medium compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each customer's chance of leaving next to what they did.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, &quot;Churn&quot;, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=&quot;Churn&quot;)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[&quot;Churn&quot;].values,\n                    &quot;chance of leaving&quot;: model.predict_proba(features)[:, 1]}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A ranked call list",
    "Every customer has a probability of leaving, highest first."
   ],
   [
    "The right model for this table",
    "The leaderboard shows which model won and whether it beat the runner-up by more than chance."
   ],
   [
    "A report to share",
    "evaluation.report_link() gives a link your manager can open without an account."
   ]
  ],
  "task": "Classification",
  "domain": "Telecoms",
  "rows": 7043,
  "cols": 20,
  "licence": "",
  "signal": null,
  "url": "https://ergodic.dev/research/use-cases/will-this-customer-churn"
 },
 {
  "type": "usecase",
  "slug": "how-much-will-we-sell",
  "title": "How Much Will Each Store Sell in the Next Two Weeks?",
  "initials": "MW",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "Forecast the next 14 days for every store at once, with a range around each day.",
  "audience": "Planners and operations analysts",
  "model": "Chronos-2",
  "dataset": "A year of daily sales for three stores, built in the notebook",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/forecasting-with-covariates.ipynb",
  "area": "Customers",
  "notebook": "forecasting-with-covariates",
  "lede": "How much stock should each store order for the next fortnight? Order too little and shelves go empty at the weekend. Order too much and cash sits in the stockroom. A planner needs a number for each store and each day, and a sense of how wrong it could be.",
  "steps": [
   [
    "Get the history",
    "<p>A year of daily sales for three stores, busier at weekends.</p>\n<pre><code>import numpy as np\nimport pandas as pd\n\nrng = np.random.default_rng(0)\ndays = pd.date_range(&quot;2025-01-01&quot;, periods=365, freq=&quot;D&quot;)\nhistory = pd.concat([pd.DataFrame({\n    &quot;date&quot;: days, &quot;store&quot;: store,\n    &quot;sales&quot;: level * (1 + 0.3 * (days.dayofweek &gt;= 5)) + rng.normal(0, 5, len(days)),\n}) for store, level in {&quot;north&quot;: 120, &quot;south&quot;: 90, &quot;east&quot;: 60}.items()], ignore_index=True)</code></pre>"
   ],
   [
    "Forecast every store at once",
    "<p>Chronos-2 reads all three series in one request.</p>\n<pre><code>from welt import Forecast\n\nmodel = Forecast(model=&quot;chronos-2&quot;).fit(history, time=&quot;date&quot;, id=&quot;store&quot;, target=[&quot;sales&quot;])\nresult = model.forecast(14, quantile_levels=[0.1, 0.5, 0.9])</code></pre>"
   ],
   [
    "Read the plan and its range",
    "<p>The median is the plan. The 10% and 90% columns show a low and a high day to plan stock around.</p>\n<pre><code>plan = result.to_frame()\nprint(plan[[&quot;id&quot;, &quot;timestamp&quot;, &quot;median&quot;, &quot;q_0.1&quot;, &quot;q_0.9&quot;]].head(14))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A daily plan per store",
    "Fourteen days for each store, from one request."
   ],
   [
    "A range for every day",
    "Order for the middle and keep safety stock for the high end."
   ],
   [
    "Room for what you already know",
    "Add bank holidays or promotions as known-future columns and the forecast uses them."
   ]
  ],
  "task": "Forecasting",
  "domain": "Retail",
  "rows": 1095,
  "cols": 3,
  "licence": "",
  "signal": null,
  "url": "https://ergodic.dev/research/use-cases/how-much-will-we-sell"
 },
 {
  "type": "usecase",
  "slug": "machine-product-sales",
  "title": "How Many Will This Machine Sell Today?",
  "initials": "MW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the day, the weather, holidays, the temperature and whether the product was in stock, how many will sell from this machine?",
  "audience": "Retail and vending operators",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Sales Dataset, 10,738 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Customers",
  "notebook": "research-datasets",
  "lede": "Given the day, the weather, holidays, the temperature and whether the product was in stock, how many will sell from this machine? Restocking to the forecast avoids empty slots and wasted trips.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;sales dataset machine weather holiday&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A sales estimate",
    "Per product and day."
   ],
   [
    "Smarter restocking",
    "Fill the machines that will run out first."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Regression",
  "domain": "Business and marketing",
  "rows": 10738,
  "cols": 15,
  "licence": "CC0",
  "signal": 0.69,
  "url": "https://ergodic.dev/research/use-cases/machine-product-sales"
 },
 {
  "type": "usecase",
  "slug": "wholesale-client-type",
  "title": "Is This Client a Restaurant or a Shop?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From a year of spending on fresh food, milk, groceries, frozen goods, detergents and delicatessen, is this client a hotel or restaurant, or a retailer?",
  "audience": "Wholesale sales teams and marketing analysts",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Wholesale Customers Annual Spending, 440 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Customers",
  "notebook": "research-datasets",
  "lede": "From a year of spending on fresh food, milk, groceries, frozen goods, detergents and delicatessen, is this client a hotel or restaurant, or a retailer? Getting the channel right decides which sales team calls.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;wholesale customers annual spending&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A channel per client",
    "With a probability."
   ],
   [
    "Better targeting",
    "Route each client to the right team."
   ],
   [
    "Small data handled",
    "440 rows suit every model in the collection."
   ]
  ],
  "task": "Classification",
  "domain": "Business and marketing",
  "rows": 440,
  "cols": 9,
  "licence": "CC BY 4.0",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/wholesale-client-type"
 },
 {
  "type": "usecase",
  "slug": "camera-price",
  "title": "What Should This Camera Cost?",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its release year, resolution, zoom, focus range, storage, weight and size, what price does this camera's spec suggest?",
  "audience": "Retail buyers and pricing analysts",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "1000 Cameras Dataset, 1,038 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Customers",
  "notebook": "research-datasets",
  "lede": "From its release year, resolution, zoom, focus range, storage, weight and size, what price does this camera's spec suggest? Buyers use a fair-price estimate to spot bargains and overpriced stock.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;1000 cameras&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A fair price",
    "For any camera spec."
   ],
   [
    "Over- and under-priced models",
    "Compare the estimate with the list price."
   ],
   [
    "Small data handled",
    "About a thousand rows fit without sampling."
   ]
  ],
  "task": "Regression",
  "domain": "Business and marketing",
  "rows": 1038,
  "cols": 13,
  "licence": "CC BY-SA 3.0",
  "signal": 0.52,
  "url": "https://ergodic.dev/research/use-cases/camera-price"
 },
 {
  "type": "usecase",
  "slug": "car-price",
  "title": "What Should This Car Cost?",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its make, body style, dimensions, engine and fuel economy, what price does this car's spec suggest?",
  "audience": "Car dealers, buyers and pricing analysts",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Automobile Specifications and Prices, Fixed Version, 201 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Customers",
  "notebook": "research-datasets",
  "lede": "From its make, body style, dimensions, engine and fuel economy, what price does this car's spec suggest? With only 201 cars and 68 columns, it shows how foundation models handle small, wide tables.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;automobile specifications prices&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A fair price",
    "For any car's spec."
   ],
   [
    "Small, wide data handled",
    "201 rows and 68 features, no tuning."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Transportation",
  "rows": 201,
  "cols": 69,
  "licence": "CC0",
  "signal": 0.87,
  "url": "https://ergodic.dev/research/use-cases/car-price"
 },
 {
  "type": "usecase",
  "slug": "credit-score-band",
  "title": "Which Credit Score Band Is This Customer In?",
  "initials": "WC",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From income, accounts, loans, payment delays and debt, is this customer's credit score poor, standard or good?",
  "audience": "Credit analysts and lenders",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Credit Score Classification, 100,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From income, accounts, loans, payment delays and debt, is this customer's credit score poor, standard or good? A consistent band helps a lender decide who to offer what.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;credit score classification&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A band per customer",
    "Poor, standard or good, with a probability."
   ],
   [
    "Consistent decisions",
    "The same method for every applicant."
   ],
   [
    "Large tables handled",
    "A seeded sample keeps the run within the model limits."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 100000,
  "cols": 28,
  "licence": "CC0",
  "signal": 0.46,
  "url": "https://ergodic.dev/research/use-cases/credit-score-band"
 },
 {
  "type": "usecase",
  "slug": "corporate-credit-rating",
  "title": "What Credit Rating Will This Company Get?",
  "initials": "CR",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From a handful of financial ratios and its size, which rating class is this company likely to get?",
  "audience": "Credit analysts and corporate treasurers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Multiclass Classification for Corporate Credit Ratings, 5,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From a handful of financial ratios and its size, which rating class is this company likely to get? An early estimate shows a treasurer where a firm stands before the agencies decide.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;multiclass classification corporate credit ratings&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A rating per company",
    "With a probability for each class."
   ],
   [
    "Before the agencies",
    "An estimate ahead of a formal rating."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 5000,
  "cols": 8,
  "licence": "CC BY 4.0",
  "signal": 0.78,
  "url": "https://ergodic.dev/research/use-cases/corporate-credit-rating"
 },
 {
  "type": "usecase",
  "slug": "sba-loan-default",
  "title": "Will This Small-Business Loan Be Repaid?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the bank, the industry, the term, the jobs supported and the government guarantee, will this SBA-backed loan default?",
  "audience": "Lenders and small-business finance analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "SBA Small Business Loan Outcomes, California, 2,102 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the bank, the industry, the term, the jobs supported and the government guarantee, will this SBA-backed loan default? Lenders and the agency both carry the risk.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;SBA small business loan California&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A default probability",
    "For every loan in the book."
   ],
   [
    "Risk by industry",
    "See where defaults cluster."
   ],
   [
    "A strong signal",
    "The catalogue measures one of its highest signals."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 2102,
  "cols": 35,
  "licence": "CC0: Public Domain",
  "signal": 0.88,
  "url": "https://ergodic.dev/research/use-cases/sba-loan-default"
 },
 {
  "type": "usecase",
  "slug": "home-equity-default",
  "title": "Will This Home-Equity Loan Default?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the loan amount, the property value, the borrower's job and their credit history, will this home-equity loan go bad?",
  "audience": "Credit risk analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "HMEQ Loan Default Data, 5,960 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the loan amount, the property value, the borrower's job and their credit history, will this home-equity loan go bad? It's the standard teaching table for credit scoring.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;HMEQ loan default&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A default probability",
    "Per loan, with calibration you can check."
   ],
   [
    "Missing values handled",
    "Gaps in credit history go in as they are."
   ],
   [
    "A teaching benchmark",
    "Compare with the many published scorecards."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 5960,
  "cols": 21,
  "licence": "Public",
  "signal": 0.66,
  "url": "https://ergodic.dev/research/use-cases/home-equity-default"
 },
 {
  "type": "usecase",
  "slug": "personal-loan-default",
  "title": "Will This Personal Loan Be Paid Back?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the loan's purpose, grade, amount and rate and the borrower's income and employment, will it default?",
  "audience": "Lenders and credit risk analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Credit Risk Dataset, 32,581 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the loan's purpose, grade, amount and rate and the borrower's income and employment, will it default? A good score lets a lender price risk rather than refuse it.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;credit risk dataset&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A default probability",
    "For each application."
   ],
   [
    "Risk-based pricing",
    "Set rates from the predicted risk."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 32581,
  "cols": 12,
  "licence": "CC0: Public Domain",
  "signal": 0.71,
  "url": "https://ergodic.dev/research/use-cases/personal-loan-default"
 },
 {
  "type": "usecase",
  "slug": "bank-loan-risk-grade",
  "title": "Which Risk Grade Will the Bank Give This Loan?",
  "initials": "WR",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the loan, its guarantee and collateral and the household's finances, which of five risk grades does the bank assign?",
  "audience": "Bank risk teams and credit analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Credit Risk China, 27,522 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the loan, its guarantee and collateral and the household's finances, which of five risk grades does the bank assign? Predicting the grade helps check that grading is consistent across branches.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;credit risk China&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A grade per loan",
    "With a probability for each grade."
   ],
   [
    "Consistency checks",
    "Loans graded far from the prediction stand out."
   ],
   [
    "An honest signal",
    "The catalogue measures a weak signal, so read the baseline comparison."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 27522,
  "cols": 28,
  "licence": "CC BY 4.0",
  "signal": 0.28,
  "url": "https://ergodic.dev/research/use-cases/bank-loan-risk-grade"
 },
 {
  "type": "usecase",
  "slug": "company-bankruptcy",
  "title": "Will This Company Go Bankrupt Within Three Years?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From 64 financial ratios in its accounts, will this Polish company go bankrupt in the next three years?",
  "audience": "Credit analysts, auditors and investors",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Polish Companies Bankruptcy, Three-Year Horizon, 10,503 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From 64 financial ratios in its accounts, will this Polish company go bankrupt in the next three years? Spotting distress early protects lenders, suppliers and staff.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Polish companies bankruptcy three-year&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A bankruptcy probability",
    "For every company in the table."
   ],
   [
    "Wide tables handled",
    "All 64 ratios go in without selection."
   ],
   [
    "An honest signal",
    "Bankruptcy is rare and hard to predict, and the score says how hard."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 10503,
  "cols": 65,
  "licence": "CC0",
  "signal": 0.3,
  "url": "https://ergodic.dev/research/use-cases/company-bankruptcy"
 },
 {
  "type": "usecase",
  "slug": "audit-risk-firm",
  "title": "Should the Auditors Look at This Firm?",
  "initials": "SA",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its sector, location, the discrepancies found and its history, is this firm high-risk?",
  "audience": "Auditors and public-sector finance teams",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Audit Data Fraudulent Firm Classification, 1,552 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From its sector, location, the discrepancies found and its history, is this firm high-risk? Audit offices have more firms than inspectors, so they need to choose.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;audit data fraudulent firm&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A risk score per firm",
    "Rank firms for inspection."
   ],
   [
    "Better use of auditors",
    "Visit the likely cases first."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Classification",
  "domain": "Finance",
  "rows": 1552,
  "cols": 37,
  "licence": "CC BY 4.0",
  "signal": 0.6,
  "url": "https://ergodic.dev/research/use-cases/audit-risk-firm"
 },
 {
  "type": "usecase",
  "slug": "crypto-price-forecast",
  "title": "Where Could Bitcoin's Price Go in the Next Two Weeks?",
  "initials": "WC",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "From each coin's daily closing price, what range could Bitcoin, Ethereum and Litecoin trade in over the next 14 days?",
  "audience": "Crypto analysts and finance students",
  "model": "Chronos-2",
  "dataset": "Top 100 Cryptocurrency Daily Market Prices 2020, 40,100 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From each coin's daily closing price, what range could Bitcoin, Ethereum and Litecoin trade in over the next 14 days? The width of the range matters more than the middle line.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client, Forecast\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;top 100 cryptocurrency 2020&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the history",
    "<p>Keep the time column and the target, for the series you want.</p>\n<pre><code>time, series = &quot;date&quot;, &quot;name&quot;\nhistory = data[data[series].isin([&quot;Bitcoin&quot;, &quot;Ethereum&quot;, &quot;Litecoin&quot;])][[series, time, target]].dropna()\nhistory[time] = pd.to_datetime(history[time])</code></pre>"
   ],
   [
    "Forecast with a range",
    "<p>Ask for the next 14 steps, one per day. The median is the forecast, and the 10% and 90% columns give a low and a high case.</p>\n<pre><code>model = Forecast(model=&quot;chronos-2&quot;).fit(history, time=time, id=series, target=[target])\nresult = model.forecast(14, quantile_levels=[0.1, 0.5, 0.9])\nprint(result.to_frame()[[&quot;id&quot;, &quot;timestamp&quot;, &quot;median&quot;, &quot;q_0.1&quot;, &quot;q_0.9&quot;]].head(14))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Two weeks ahead",
    "A daily range for each coin."
   ],
   [
    "Risk in plain sight",
    "The gap between the 10% and 90% lines shows how volatile each coin is."
   ],
   [
    "Several coins at once",
    "One request covers all three."
   ]
  ],
  "task": "Forecasting",
  "domain": "Finance",
  "rows": 40100,
  "cols": 9,
  "licence": "CC0: Public Domain",
  "signal": 0.55,
  "url": "https://ergodic.dev/research/use-cases/crypto-price-forecast"
 },
 {
  "type": "usecase",
  "slug": "will-unemployment-rise",
  "title": "Will US Unemployment Be Higher in Three Months?",
  "initials": "WU",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "Turn a forecast of a public series into the probability a forecasting question asks for.",
  "audience": "Forecasters, prediction-market traders and journalists",
  "model": "Chronos-2",
  "dataset": "FRED civilian unemployment rate (UNRATE), monthly since 1948",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/forecasting-with-covariates.ipynb",
  "area": "Finance",
  "notebook": "forecasting-with-covariates",
  "lede": "Forecasting tournaments and prediction markets ask questions like this every week: will a public number be above its latest value on a given date? Answering well means putting a probability on it, and a probability needs a forecast with a range, not a single guess.",
  "steps": [
   [
    "Download the series",
    "<p>Read FRED's CSV straight into pandas.</p>\n<pre><code>import pandas as pd\n\nurl = &quot;https://fred.stlouisfed.org/graph/fredgraph.csv?id=UNRATE&quot;\nrate = pd.read_csv(url, parse_dates=[&quot;observation_date&quot;])</code></pre>"
   ],
   [
    "Forecast three months with a range",
    "<p>Ask Chronos-2 for several quantiles, so you can see the whole spread of outcomes.</p>\n<pre><code>from welt import Forecast\n\nlevels = [0.05, 0.1, 0.5, 0.9, 0.95]\nmodel = Forecast(model=&quot;chronos-2&quot;).fit(\n    rate, time=&quot;observation_date&quot;, target=[&quot;UNRATE&quot;], frequency=&quot;MS&quot;)\nmonth3 = model.forecast(3, quantile_levels=levels).to_frame().iloc[-1]</code></pre>"
   ],
   [
    "Turn the range into a probability",
    "<p>Find where today's rate falls inside the forecast's spread. The share of outcomes above it is the probability of \"higher\".</p>\n<pre><code>import numpy as np\n\ntoday = rate[&quot;UNRATE&quot;].iloc[-1]\nvalues = [month3[f&quot;q_{q}&quot;] for q in levels]\np_higher = 1 - np.interp(today, values, levels)\nprint(f&quot;Chance unemployment is higher in three months: {p_higher:.0%}&quot;)</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability for the question",
    "Ready to submit, trade on or report."
   ],
   [
    "The reasoning behind it",
    "The forecast's range shows how much the number could move."
   ],
   [
    "A repeatable method",
    "The same three steps answer any question about a public series."
   ]
  ],
  "task": "Forecasting",
  "domain": "Economics",
  "rows": 945,
  "cols": 2,
  "licence": "Public domain",
  "signal": null,
  "url": "https://ergodic.dev/research/use-cases/will-unemployment-rise"
 },
 {
  "type": "usecase",
  "slug": "bengaluru-home-price",
  "title": "What Will This Bengaluru Home Sell For?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the area type, location, size, square footage, bathrooms and balconies, what's a fair price?",
  "audience": "Property analysts, agents and buyers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Bengaluru Real Estate Prices, 13,320 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "Given the area type, location, size, square footage, bathrooms and balconies, what's a fair price? Agents and buyers want a quick, consistent estimate before they negotiate.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;bengaluru real estate prices&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A fair-price estimate",
    "A price for any listing in seconds."
   ],
   [
    "Over- and under-priced homes",
    "Compare the estimate with the asking price."
   ],
   [
    "Consistent valuations",
    "The same method for every home on the market."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 13320,
  "cols": 8,
  "licence": "CC0: Public Domain",
  "signal": 0.47,
  "url": "https://ergodic.dev/research/use-cases/bengaluru-home-price"
 },
 {
  "type": "usecase",
  "slug": "munich-rent",
  "title": "What's a Fair Rent for This Munich Flat?",
  "initials": "SF",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From living area, year built, location, bathroom, kitchen, heating and district, what net rent does this flat command?",
  "audience": "Tenants, landlords and housing analysts",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Munich Rent Index (1999) Apartments, 3,082 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From living area, year built, location, bathroom, kitchen, heating and district, what net rent does this flat command? Munich's rent index is built from exactly this kind of table.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Munich rent index&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A rent estimate",
    "For any flat in the table."
   ],
   [
    "Above or below the index",
    "Compare the estimate with the rent charged."
   ],
   [
    "A well-known table",
    "Used in statistics teaching for decades."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 3082,
  "cols": 9,
  "licence": "CC0: Public Domain",
  "signal": 0.45,
  "url": "https://ergodic.dev/research/use-cases/munich-rent"
 },
 {
  "type": "usecase",
  "slug": "california-house-value",
  "title": "What's a Typical Home Worth in This California Neighbourhood?",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From income, housing age, rooms, population and location, what is the median house value in this block group?",
  "audience": "Housing analysts, planners and students",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Houses, 20,640 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From income, housing age, rooms, population and location, what is the median house value in this block group? It's the 1990 census table that most data scientists meet first.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;houses California median value&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A value per neighbourhood",
    "From census figures alone."
   ],
   [
    "Where location matters",
    "See how much coordinates add."
   ],
   [
    "A classic benchmark",
    "Compare with countless published results."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 20640,
  "cols": 9,
  "licence": "MIT (PMLB collection)",
  "signal": 0.78,
  "url": "https://ergodic.dev/research/use-cases/california-house-value"
 },
 {
  "type": "usecase",
  "slug": "property-tax-rate",
  "title": "What Property Tax Rate Will This City Charge?",
  "initials": "PT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the state, the population, the median home value and household income, what's the effective property tax rate in this US city?",
  "audience": "Homebuyers, relocation advisers and local-finance analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "US Property Tax Rates 2026 by City, 10,058 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the state, the population, the median home value and household income, what's the effective property tax rate in this US city? Buyers comparing places want the number before they look at houses.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;US property tax rates 2026 by city&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A rate per city",
    "For cities in the table and ones like them."
   ],
   [
    "Unusual rates",
    "Cities far from the estimate stand out."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 10058,
  "cols": 10,
  "licence": "CC BY 4.0",
  "signal": 0.77,
  "url": "https://ergodic.dev/research/use-cases/property-tax-rate"
 },
 {
  "type": "usecase",
  "slug": "riga-flat-price",
  "title": "What Should This Riga Flat Be Listed At?",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the offer type, district, rooms, area, floor and building type, what's a sensible listing price?",
  "audience": "Estate agents and property investors in the Baltics",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Riga Real Estate Listings, 4,219 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the offer type, district, rooms, area, floor and building type, what's a sensible listing price? A quick estimate helps an agent advise a seller on day one.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Riga real estate listings&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A listing price",
    "For any flat you can describe."
   ],
   [
    "Sale or rent",
    "The offer type is a column, so one model covers both."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 4219,
  "cols": 13,
  "licence": "CC0: Public Domain",
  "signal": 0.87,
  "url": "https://ergodic.dev/research/use-cases/riga-flat-price"
 },
 {
  "type": "usecase",
  "slug": "dubai-apartment-price",
  "title": "What's This Dubai Apartment Worth?",
  "initials": "ST",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the neighbourhood, size, rooms and a long list of amenities, what price does this apartment's listing suggest?",
  "audience": "Property investors and agents in the Gulf",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Dubai Apartment Properties, 1,905 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the neighbourhood, size, rooms and a long list of amenities, what price does this apartment's listing suggest? Investors compare it with the asking price before they bid.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Dubai apartment properties&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A price estimate",
    "For any listing."
   ],
   [
    "What amenities are worth",
    "Compare predictions with and without each one."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 1905,
  "cols": 37,
  "licence": "CC0: Public Domain",
  "signal": 0.81,
  "url": "https://ergodic.dev/research/use-cases/dubai-apartment-price"
 },
 {
  "type": "usecase",
  "slug": "taipei-price-per-area",
  "title": "How Much Is a Home Near a Metro Station Worth?",
  "initials": "MI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the sale date, the building's age, the distance to the nearest MRT station, the number of shops nearby and the location, what's the price per unit area?",
  "audience": "Property valuers and transport planners",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Real Estate Valuation, Sindian District, 414 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Finance",
  "notebook": "research-datasets",
  "lede": "From the sale date, the building's age, the distance to the nearest MRT station, the number of shops nearby and the location, what's the price per unit area? It puts a number on what living near the metro is worth.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;real estate valuation Sindian&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A price per area",
    "For any home in the district."
   ],
   [
    "The metro effect",
    "See how price falls with distance to the station."
   ],
   [
    "Small data handled",
    "Every model in the collection can take 414 rows."
   ]
  ],
  "task": "Regression",
  "domain": "Real estate",
  "rows": 414,
  "cols": 7,
  "licence": "CC BY 4.0",
  "signal": 0.65,
  "url": "https://ergodic.dev/research/use-cases/taipei-price-per-area"
 },
 {
  "type": "usecase",
  "slug": "is-this-patient-at-risk",
  "title": "Is This Patient at Risk of Heart Disease?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Get a reliable risk score from a few hundred patient records, and know which model to trust.",
  "audience": "Clinical researchers and health data scientists",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "UCI Heart Disease (Cleveland), 303 patients",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/evaluation.ipynb",
  "area": "Healthcare",
  "notebook": "evaluation",
  "lede": "A clinic has a few hundred patient records and wants a risk score for each new patient. Small tables are where most models struggle, and a clinician needs to know the score is better than a guess before using it.",
  "steps": [
   [
    "Load the records",
    "<p>Read the UCI file, name the columns, and turn the outcome into yes or no.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nurl = &quot;https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data&quot;\ncols = [&quot;age&quot;, &quot;sex&quot;, &quot;cp&quot;, &quot;trestbps&quot;, &quot;chol&quot;, &quot;fbs&quot;, &quot;restecg&quot;,\n        &quot;thalach&quot;, &quot;exang&quot;, &quot;oldpeak&quot;, &quot;slope&quot;, &quot;ca&quot;, &quot;thal&quot;, &quot;disease&quot;]\npatients = pd.read_csv(url, names=cols, na_values=&quot;?&quot;)\npatients[&quot;disease&quot;] = (patients[&quot;disease&quot;] &gt; 0).map({True: &quot;yes&quot;, False: &quot;no&quot;})\nprint(patients.shape, patients[&quot;disease&quot;].value_counts().to_dict())</code></pre>"
   ],
   [
    "Pick the patients",
    "<p>Set aside 20 patients to score at the end, and keep the rest for the models to learn from.</p>\n<pre><code>new_rows = patients.sample(20, random_state=1)\ntable = patients.drop(new_rows.index)</code></pre>"
   ],
   [
    "Test all four models and score",
    "<p>On a table this small, every prediction model in the collection can take part, and the baseline line shows what a guess would score. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each patient's risk next to their diagnosis.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, &quot;disease&quot;, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=&quot;disease&quot;)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[&quot;disease&quot;].values,\n                    &quot;risk&quot;: model.predict_proba(features)[:, 1]}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A risk score per patient",
    "A probability, not just a yes or no."
   ],
   [
    "Proof it beats a guess",
    "Every model is ranked against the baseline on records it never saw."
   ],
   [
    "The right model for small data",
    "The leaderboard shows which model handles 303 rows best."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 303,
  "cols": 14,
  "licence": "CC BY 4.0",
  "signal": null,
  "url": "https://ergodic.dev/research/use-cases/is-this-patient-at-risk"
 },
 {
  "type": "usecase",
  "slug": "periodontal-diagnosis",
  "title": "Does This Patient Have Gum Disease?",
  "initials": "DT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Can lifestyle, hygiene habits and dental indices flag periodontal disease before a full examination?",
  "audience": "Dental researchers and clinicians",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "French Dental and Lifestyle Records, 224 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "Can lifestyle, hygiene habits and dental indices flag periodontal disease before a full examination? A clinic with a couple of hundred records wants a screening score it can trust.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;french dental lifestyle periodontal&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A screening score",
    "A probability of gum disease for each patient."
   ],
   [
    "Small data handled",
    "Foundation models are built for tables this size."
   ],
   [
    "Ready to report",
    "Leaderboard and calibration figures for a write-up."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 224,
  "cols": 20,
  "licence": "CC0",
  "signal": 0.47,
  "url": "https://ergodic.dev/research/use-cases/periodontal-diagnosis"
 },
 {
  "type": "usecase",
  "slug": "diabetic-retinopathy",
  "title": "Does This Eye Scan Show Diabetic Retinopathy?",
  "initials": "DT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From features measured on a retinal image, does this patient show signs of diabetic retinopathy?",
  "audience": "Ophthalmology researchers and screening programmes",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Diabetic Retinopathy Debrecen, 1,151 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From features measured on a retinal image, does this patient show signs of diabetic retinopathy? Screening programmes see far more images than specialists can grade by hand.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;diabetic retinopathy Debrecen&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per scan",
    "Send the likely cases to a specialist first."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal, so check the baseline comparison."
   ],
   [
    "Calibrated scores",
    "The Brier score shows whether the probabilities can be trusted."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 1151,
  "cols": 20,
  "licence": "CC BY 4.0",
  "signal": 0.35,
  "url": "https://ergodic.dev/research/use-cases/diabetic-retinopathy"
 },
 {
  "type": "usecase",
  "slug": "hypothyroid",
  "title": "Does This Patient Have an Underactive Thyroid?",
  "initials": "DT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From age, sex, medication history and thyroid test results, does this patient have hypothyroidism?",
  "audience": "Endocrinology researchers and clinical analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Hypothyroid, 3,163 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From age, sex, medication history and thyroid test results, does this patient have hypothyroidism? Most tests come back normal, so a score that flags the likely cases saves clinicians time.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;hypothyroid&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per patient",
    "Flag the cases most likely to need treatment."
   ],
   [
    "Rare cases checked",
    "The leaderboard shows how the models handle the smaller class."
   ],
   [
    "Missing tests handled",
    "Records with gaps go in as they are."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 3163,
  "cols": 26,
  "licence": "CC BY 4.0",
  "signal": 0.7,
  "url": "https://ergodic.dev/research/use-cases/hypothyroid"
 },
 {
  "type": "usecase",
  "slug": "fetal-health",
  "title": "Is This Baby's Heart Trace Healthy?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the measurements of a cardiotocography trace, is the baby's health normal, suspect or pathological?",
  "audience": "Obstetric researchers and maternity clinicians",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Cardiotocography (CTG) Fetal Health Dataset, 2,126 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From the measurements of a cardiotocography trace, is the baby's health normal, suspect or pathological? Midwives read these traces around the clock, and a consistent score helps on a busy night.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;cardiotocography fetal health&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A class per trace",
    "Normal, suspect or pathological, with a probability."
   ],
   [
    "The worrying traces first",
    "Sort by the chance of a pathological result."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 2126,
  "cols": 23,
  "licence": "CC BY 4.0",
  "signal": 0.84,
  "url": "https://ergodic.dev/research/use-cases/fetal-health"
 },
 {
  "type": "usecase",
  "slug": "breast-cytology",
  "title": "Is This Breast Biopsy Malignant?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From nine cell characteristics scored by a pathologist, is this fine-needle biopsy malignant or benign?",
  "audience": "Pathology researchers and clinicians",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Breast Cancer Wisconsin Cytology Features (Original), 699 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From nine cell characteristics scored by a pathologist, is this fine-needle biopsy malignant or benign? It's one of the oldest medical tables in machine learning and still a good first test.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;breast cancer Wisconsin original&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per biopsy",
    "Benign or malignant, with a probability."
   ],
   [
    "A strong signal",
    "The catalogue measures one of its highest signals here."
   ],
   [
    "A classic benchmark",
    "Compare with decades of published results."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 699,
  "cols": 10,
  "licence": "CC BY 4.0",
  "signal": 0.91,
  "url": "https://ergodic.dev/research/use-cases/breast-cytology"
 },
 {
  "type": "usecase",
  "slug": "mammogram-mass",
  "title": "Is This Mammogram Mass Malignant?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the radiologist's BI-RADS assessment, the patient's age and the mass's shape, margin and density, is it malignant?",
  "audience": "Radiology researchers and screening programmes",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Mammographic Mass, 961 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From the radiologist's BI-RADS assessment, the patient's age and the mass's shape, margin and density, is it malignant? A better estimate could spare some women an unnecessary biopsy.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;mammographic mass&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A malignancy probability",
    "For each mass before biopsy."
   ],
   [
    "Fewer unnecessary biopsies",
    "See how many benign masses fall below a safe threshold."
   ],
   [
    "Calibrated scores",
    "The Brier score shows how far to trust each probability."
   ]
  ],
  "task": "Classification",
  "domain": "Healthcare",
  "rows": 961,
  "cols": 6,
  "licence": "CC BY 4.0",
  "signal": 0.59,
  "url": "https://ergodic.dev/research/use-cases/mammogram-mass"
 },
 {
  "type": "usecase",
  "slug": "medicare-hospital-payment",
  "title": "What Will Medicare Pay for This Hospital Stay?",
  "initials": "WM",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "For a given diagnosis group and hospital, what is Medicare's average payment per stay?",
  "audience": "Health economists and hospital finance teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Medicare Inpatient Hospitals by Provider and Service (2019), 188,806 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "For a given diagnosis group and hospital, what is Medicare's average payment per stay? Hospitals and researchers use the estimate to spot unusual prices and plan budgets.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Medicare inpatient hospitals provider service 2019&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A payment estimate",
    "For any hospital and diagnosis group."
   ],
   [
    "Unusual prices",
    "Payments far from the estimate stand out."
   ],
   [
    "Text columns handled",
    "Diagnosis groups and locations go in as they are."
   ]
  ],
  "task": "Regression",
  "domain": "Healthcare",
  "rows": 188806,
  "cols": 13,
  "licence": "Public",
  "signal": 0.45,
  "url": "https://ergodic.dev/research/use-cases/medicare-hospital-payment"
 },
 {
  "type": "usecase",
  "slug": "kidney-function",
  "title": "How Well Will This Person's Kidneys Work in Four Years?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From a 2011 kidney test, blood fat levels, diabetes, blood pressure and lifestyle, what will this person's kidney function be in 2015?",
  "audience": "Nephrology researchers and population health teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "AIP, Cumulative AIP, Type 2 Diabetes and CKD: Complete-Case Analysis, 5,779 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From a 2011 kidney test, blood fat levels, diabetes, blood pressure and lifestyle, what will this person's kidney function be in 2015? Spotting decline early is when treatment works best.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;AIP cumulative type 2 diabetes CKD&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A four-year estimate",
    "Kidney function predicted from today's checks."
   ],
   [
    "Who to watch",
    "Rank people by predicted decline."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal, so read the baseline comparison."
   ]
  ],
  "task": "Regression",
  "domain": "Healthcare",
  "rows": 5779,
  "cols": 23,
  "licence": "CC BY 4.0",
  "signal": 0.39,
  "url": "https://ergodic.dev/research/use-cases/kidney-function"
 },
 {
  "type": "usecase",
  "slug": "covid-cases-forecast",
  "title": "How Many COVID-19 Cases Will a Country Report Next Month?",
  "initials": "MC",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "From each country's daily history, how many new cases will France, Germany and Italy report over the next four weeks?",
  "audience": "Public-health analysts and data journalists",
  "model": "Chronos-2",
  "dataset": "Data on COVID-19 (Coronavirus) Country Statistics, 170,646 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From each country's daily history, how many new cases will France, Germany and Italy report over the next four weeks? Health services plan beds and staff around a range, not a single number.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client, Forecast\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Data on COVID-19 country statistics&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the history",
    "<p>Keep the time column and the target, for the series you want.</p>\n<pre><code>time, series = &quot;date&quot;, &quot;location&quot;\nhistory = data[data[series].isin([&quot;France&quot;, &quot;Germany&quot;, &quot;Italy&quot;])][[series, time, target]].dropna()\nhistory[time] = pd.to_datetime(history[time])</code></pre>"
   ],
   [
    "Forecast with a range",
    "<p>Ask for the next 28 steps, one per day. The median is the forecast, and the 10% and 90% columns give a low and a high case.</p>\n<pre><code>model = Forecast(model=&quot;chronos-2&quot;).fit(history, time=time, id=series, target=[target])\nresult = model.forecast(28, quantile_levels=[0.1, 0.5, 0.9])\nprint(result.to_frame()[[&quot;id&quot;, &quot;timestamp&quot;, &quot;median&quot;, &quot;q_0.1&quot;, &quot;q_0.9&quot;]].head(28))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Four weeks ahead",
    "Daily cases per country with a range."
   ],
   [
    "Several countries at once",
    "Chronos-2 reads up to eight series in one request."
   ],
   [
    "Plan for the high case",
    "The 90% line is the number to staff for."
   ]
  ],
  "task": "Forecasting",
  "domain": "Healthcare",
  "rows": 170646,
  "cols": 67,
  "licence": "CC BY 4.0",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/covid-cases-forecast"
 },
 {
  "type": "usecase",
  "slug": "eeg-eye-state",
  "title": "Are This Person's Eyes Open or Closed?",
  "initials": "AT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From 14 EEG electrode readings, are the person's eyes open or closed?",
  "audience": "Neuroscientists and brain-computer interface developers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "EEG Eye State, 14,980 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "From 14 EEG electrode readings, are the person's eyes open or closed? It's a simple first test for any device that reads the brain.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;EEG eye state&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Eye state per reading",
    "Open or closed, with a probability."
   ],
   [
    "A first brain-computer test",
    "Check a headset's signal quality."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 14980,
  "cols": 15,
  "licence": "CC BY 4.0",
  "signal": 0.75,
  "url": "https://ergodic.dev/research/use-cases/eeg-eye-state"
 },
 {
  "type": "usecase",
  "slug": "vaccine-uptake-survey",
  "title": "How Many COVID-19 Doses Will This Person Have Taken?",
  "initials": "MC",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Which attitudes and circumstances go with lower vaccine uptake?",
  "audience": "Public-health researchers and policy analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Populist Party Support, Medical Trust and COVID-19 Vaccine Uptake in Japan Survey, 31,676 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Healthcare",
  "notebook": "research-datasets",
  "lede": "Which attitudes and circumstances go with lower vaccine uptake? A model that predicts doses from survey answers shows public-health teams where trust is weakest and outreach would help most.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;populist party support medical trust COVID-19 vaccine Japan&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted uptake",
    "Estimate doses for groups you didn't survey."
   ],
   [
    "Where to focus",
    "See which groups the model expects to lag."
   ],
   [
    "A defensible method",
    "Every score is checked against a baseline on rows the model never saw."
   ]
  ],
  "task": "Regression",
  "domain": "Social science",
  "rows": 31676,
  "cols": 32,
  "licence": "CC BY 4.0",
  "signal": 0.34,
  "url": "https://ergodic.dev/research/use-cases/vaccine-uptake-survey"
 },
 {
  "type": "usecase",
  "slug": "zoo-animal-class",
  "title": "Is It a Mammal, a Bird or a Fish?",
  "initials": "II",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From simple yes-or-no traits like hair, feathers, eggs, milk and number of legs, which class does this animal belong to?",
  "audience": "Teachers, students and anyone new to machine learning",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Zoo Animal Types, 101 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From simple yes-or-no traits like hair, feathers, eggs, milk and number of legs, which class does this animal belong to? It's a friendly first table for seeing how a model reasons from examples.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;zoo animal&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A class per animal",
    "With a probability for each class."
   ],
   [
    "A tiny table",
    "Every model in the collection can take 101 rows."
   ],
   [
    "Easy to explain",
    "Every column is something a child could check."
   ]
  ],
  "task": "Classification",
  "domain": "Biology",
  "rows": 101,
  "cols": 17,
  "licence": "CC BY 4.0",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/zoo-animal-class"
 },
 {
  "type": "usecase",
  "slug": "yeast-protein-location",
  "title": "Where in the Cell Does This Protein Go?",
  "initials": "WC",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From eight scores computed from its sequence, which part of the yeast cell does this protein end up in?",
  "audience": "Molecular biologists and bioinformaticians",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Yeast Protein Localization, 1,484 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From eight scores computed from its sequence, which part of the yeast cell does this protein end up in? Knowing where a protein works is a first clue to what it does.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;yeast protein localization&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A location per protein",
    "With a probability for each compartment."
   ],
   [
    "Many classes",
    "Ten locations, all within the collection's limits."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal here."
   ]
  ],
  "task": "Classification",
  "domain": "Biology",
  "rows": 1484,
  "cols": 9,
  "licence": "CC BY 4.0",
  "signal": 0.38,
  "url": "https://ergodic.dev/research/use-cases/yeast-protein-location"
 },
 {
  "type": "usecase",
  "slug": "snail-mating",
  "title": "Will This Snail Choose to Mate?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the species, populations, shell sizes and trial conditions, will a male periwinkle snail mount the female he's paired with?",
  "audience": "Evolutionary biologists and ecologists",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Assortative Mating and Genital Divergence in Littoraria, 940 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "Given the species, populations, shell sizes and trial conditions, will a male periwinkle snail mount the female he's paired with? Who mates with whom is how new species begin to split.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;assortative mating Littoraria&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A mating probability",
    "For any pairing in the trials."
   ],
   [
    "Size or species",
    "Compare models to see what drives choice."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Classification",
  "domain": "Biology",
  "rows": 940,
  "cols": 23,
  "licence": "CC0",
  "signal": 0.35,
  "url": "https://ergodic.dev/research/use-cases/snail-mating"
 },
 {
  "type": "usecase",
  "slug": "whooping-crane-stopover",
  "title": "Will Whooping Cranes Stop Here?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the mix of wetland, cropland and grassland around a spot, will migrating whooping cranes use it as a stopover?",
  "audience": "Conservation biologists and land managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Whooping Crane Stopover Habitat, 30,407 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From the mix of wetland, cropland and grassland around a spot, will migrating whooping cranes use it as a stopover? There are only a few hundred of these birds in the wild, so protecting the right places matters.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;whooping crane stopover&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A stopover probability",
    "For any location along the route."
   ],
   [
    "Where to protect",
    "Rank sites for conservation."
   ],
   [
    "Many features handled",
    "Land cover at several distances goes in as it is."
   ]
  ],
  "task": "Classification",
  "domain": "Ecology and environment",
  "rows": 30407,
  "cols": 57,
  "licence": "CC0",
  "signal": 0.5,
  "url": "https://ergodic.dev/research/use-cases/whooping-crane-stopover"
 },
 {
  "type": "usecase",
  "slug": "red-squirrel-behaviour",
  "title": "What Is This Squirrel Doing?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From a collar's acceleration and temperature readings, is the squirrel feeding, travelling, grooming or resting?",
  "audience": "Wildlife ecologists and animal-tag researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Red Squirrel Acceleration and Behaviour Data, 24,300 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From a collar's acceleration and temperature readings, is the squirrel feeding, travelling, grooming or resting? Tags record for months, and nobody can watch that much video.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;red squirrel acceleration&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A behaviour per window",
    "Months of tag data labelled automatically."
   ],
   [
    "Time budgets",
    "How long each squirrel spends feeding or travelling."
   ],
   [
    "Fewer hours of video",
    "Label a sample, predict the rest."
   ]
  ],
  "task": "Classification",
  "domain": "Ecology and environment",
  "rows": 24300,
  "cols": 25,
  "licence": "CC0",
  "signal": 0.62,
  "url": "https://ergodic.dev/research/use-cases/red-squirrel-behaviour"
 },
 {
  "type": "usecase",
  "slug": "tree-survival",
  "title": "Will This Tree Survive to the Next Survey?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given its size, its condition last time, its species and how well the climate suits it, will this tree still be alive at the next forest inventory?",
  "audience": "Foresters and ecologists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Local Neighbourhood and Regional Climate Explain Tree Performance, 7,277 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "Given its size, its condition last time, its species and how well the climate suits it, will this tree still be alive at the next forest inventory? Foresters plan planting and thinning around exactly this.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;tree performance climate suitability&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A survival probability",
    "For every tree in the inventory."
   ],
   [
    "Climate risk",
    "See how survival changes as suitability falls."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Ecology and environment",
  "rows": 7277,
  "cols": 14,
  "licence": "CC0",
  "signal": 0.81,
  "url": "https://ergodic.dev/research/use-cases/tree-survival"
 },
 {
  "type": "usecase",
  "slug": "forest-cover-type",
  "title": "Which Forest Grows on This Patch of Land?",
  "initials": "WF",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From elevation, slope, distance to water and roads, wilderness area and soil type, which type of forest covers this 30-metre patch of Colorado?",
  "audience": "Foresters, ecologists and land managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Forest Cover Type Prediction from Cartographic Variables (Covertype), 110,393 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From elevation, slope, distance to water and roads, wilderness area and soil type, which type of forest covers this 30-metre patch of Colorado? Mapping cover from maps alone saves sending crews to remote ground.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;forest cover type covertype&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A cover type per cell",
    "With a probability for each type."
   ],
   [
    "Maps without fieldwork",
    "Predict cover for cells nobody has visited."
   ],
   [
    "A classic benchmark",
    "One of the most used tables in machine learning."
   ]
  ],
  "task": "Classification",
  "domain": "Ecology and environment",
  "rows": 110393,
  "cols": 55,
  "licence": "Public",
  "signal": 0.42,
  "url": "https://ergodic.dev/research/use-cases/forest-cover-type"
 },
 {
  "type": "usecase",
  "slug": "dry-bean-variety",
  "title": "Which Variety Is This Dry Bean?",
  "initials": "WV",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the size and shape measured in a photograph, which of seven varieties is this bean?",
  "audience": "Seed producers and food-processing engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Dry Bean Grain Shape Dataset, 13,611 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From the size and shape measured in a photograph, which of seven varieties is this bean? Sorting by camera keeps seed lots pure without anyone checking beans by eye.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;dry bean&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A variety per bean",
    "With a probability for each variety."
   ],
   [
    "Automatic sorting",
    "Grade a whole lot from photos."
   ],
   [
    "A very strong signal",
    "The catalogue measures one of its highest signals."
   ]
  ],
  "task": "Classification",
  "domain": "Agriculture and food",
  "rows": 13611,
  "cols": 17,
  "licence": "CC BY 4.0",
  "signal": 0.92,
  "url": "https://ergodic.dev/research/use-cases/dry-bean-variety"
 },
 {
  "type": "usecase",
  "slug": "rice-variety",
  "title": "Is This Rice Grain Cammeo or Osmancik?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From seven measurements of its shape in a photograph, which of two Turkish rice varieties is this grain?",
  "audience": "Grain traders and food-quality inspectors",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Rice Grain Varieties Cammeo and Osmancik, 3,810 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From seven measurements of its shape in a photograph, which of two Turkish rice varieties is this grain? Mixed lots sell for less, so buyers want a quick check.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;rice Cammeo Osmancik&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A variety per grain",
    "With a probability."
   ],
   [
    "A purity check",
    "Estimate how mixed a lot is from a sample."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Agriculture and food",
  "rows": 3810,
  "cols": 8,
  "licence": "CC BY 4.0",
  "signal": 0.82,
  "url": "https://ergodic.dev/research/use-cases/rice-variety"
 },
 {
  "type": "usecase",
  "slug": "raisin-variety",
  "title": "Is This Raisin Kecimen or Besni?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From seven size and shape measurements, which of two raisin varieties grown in Turkey is this one?",
  "audience": "Dried-fruit graders and food engineers",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Raisin Grain Classification, 900 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From seven size and shape measurements, which of two raisin varieties grown in Turkey is this one? Machine vision grading saves sorting by hand.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;raisin grain&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A variety per raisin",
    "With a probability."
   ],
   [
    "Small data handled",
    "900 rows fit three of the four models without sampling."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Classification",
  "domain": "Agriculture and food",
  "rows": 900,
  "cols": 8,
  "licence": "CC BY 4.0",
  "signal": 0.71,
  "url": "https://ergodic.dev/research/use-cases/raisin-variety"
 },
 {
  "type": "usecase",
  "slug": "wheat-water-stress",
  "title": "Is This Wheat Short of Water?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From texture features of a chlorophyll fluorescence image, how water-stressed is this wheat plant?",
  "audience": "Crop scientists and precision-farming teams",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Wheat Water Stress Texture Features, 1,188 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From texture features of a chlorophyll fluorescence image, how water-stressed is this wheat plant? Catching stress early lets a farmer water before yield is lost.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;wheat water stress texture&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A stress class per plant",
    "With a probability for each level."
   ],
   [
    "Earlier watering",
    "Spot stress before it shows to the eye."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal, so read the baseline comparison."
   ]
  ],
  "task": "Classification",
  "domain": "Agriculture and food",
  "rows": 1188,
  "cols": 23,
  "licence": "CC0",
  "signal": 0.3,
  "url": "https://ergodic.dev/research/use-cases/wheat-water-stress"
 },
 {
  "type": "usecase",
  "slug": "white-wine-quality",
  "title": "How Good Will Tasters Say This Wine Is?",
  "initials": "GW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From acidity, sugar, sulphur, alcohol and other lab measurements, what score will a tasting panel give this white wine?",
  "audience": "Winemakers and food scientists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "White Wine Quality, 4,898 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From acidity, sugar, sulphur, alcohol and other lab measurements, what score will a tasting panel give this white wine? Lab tests are cheap and quick, and panels aren't.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;white wine quality&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted score",
    "For any wine with lab results."
   ],
   [
    "What drives quality",
    "Compare models to see which measurements matter."
   ],
   [
    "A well-known table",
    "Compare with many published results."
   ]
  ],
  "task": "Regression",
  "domain": "Agriculture and food",
  "rows": 4898,
  "cols": 12,
  "licence": "CC BY 4.0",
  "signal": 0.45,
  "url": "https://ergodic.dev/research/use-cases/white-wine-quality"
 },
 {
  "type": "usecase",
  "slug": "cocoa-jar-contamination",
  "title": "Is This Jar of Spread Contaminated?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From 30 sensor measurements taken on the line, does this jar of cocoa-hazelnut spread contain a foreign body?",
  "audience": "Food-safety and production-line engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Contaminant Detection in Cocoa Hazelnut Spread Jars, 2,400 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "From 30 sensor measurements taken on the line, does this jar of cocoa-hazelnut spread contain a foreign body? A missed jar means a recall, and a false alarm wastes product.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;contaminant detection cocoa hazelnut&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per jar",
    "Reject the jars most likely to be contaminated."
   ],
   [
    "Fewer false alarms",
    "Set the threshold from the out-of-fold scores."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Agriculture and food",
  "rows": 2400,
  "cols": 31,
  "licence": "CC BY-SA",
  "signal": 0.81,
  "url": "https://ergodic.dev/research/use-cases/cocoa-jar-contamination"
 },
 {
  "type": "usecase",
  "slug": "tamil-nadu-crop",
  "title": "How Much Will This District Harvest?",
  "initials": "MW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the crop, the season, the year and the area planted, how much will a district in Tamil Nadu produce?",
  "audience": "Agricultural planners and food-security analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Tamil Nadu Crop Production, 13,547 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Biology",
  "notebook": "research-datasets",
  "lede": "Given the crop, the season, the year and the area planted, how much will a district in Tamil Nadu produce? State planners use estimates like this to plan storage and prices.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Tamil Nadu crop production&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A production estimate",
    "For any district, crop and season."
   ],
   [
    "Unusual harvests",
    "Seasons far from the estimate stand out."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Regression",
  "domain": "Agriculture and food",
  "rows": 13547,
  "cols": 7,
  "licence": "CC BY 4.0",
  "signal": 0.36,
  "url": "https://ergodic.dev/research/use-cases/tamil-nadu-crop"
 },
 {
  "type": "usecase",
  "slug": "mauna-loa-co2",
  "title": "How Much CO2 Will Mauna Loa Measure Next Year?",
  "initials": "MC",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "Given every weekly reading since the 1970s, what will the CO2 level at Mauna Loa be over the next 52 weeks?",
  "audience": "Climate scientists, teachers and data journalists",
  "model": "Chronos-2",
  "dataset": "Mauna Loa Weekly Atmospheric CO2 Averages, 2,225 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "Given every weekly reading since the 1970s, what will the CO2 level at Mauna Loa be over the next 52 weeks? The record climbs every year and rises and falls with the seasons, a good test of any forecast.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client, Forecast\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Mauna Loa weekly CO2&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the history",
    "<p>Keep the time column and the target.</p>\n<pre><code>time = &quot;date&quot;\nhistory = data[[time, target]].dropna()\nhistory[time] = pd.to_datetime(history[time])\nhistory = history.sort_values(time)</code></pre>"
   ],
   [
    "Forecast with a range",
    "<p>Ask for the next 52 steps, one per week. The median is the forecast, and the 10% and 90% columns give a low and a high case.</p>\n<pre><code>model = Forecast(model=&quot;chronos-2&quot;).fit(history, time=time, target=[target])\nresult = model.forecast(52, quantile_levels=[0.1, 0.5, 0.9])\nprint(result.to_frame()[[&quot;timestamp&quot;, &quot;median&quot;, &quot;q_0.1&quot;, &quot;q_0.9&quot;]].head(52))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A year ahead",
    "Weekly CO2 with a range around each week."
   ],
   [
    "The seasons kept",
    "The forecast follows the yearly rise and fall."
   ],
   [
    "One series, no set-up",
    "Chronos-2 reads the history as it is."
   ]
  ],
  "task": "Forecasting",
  "domain": "Earth and climate",
  "rows": 2225,
  "cols": 7,
  "licence": "CC0",
  "signal": 0.57,
  "url": "https://ergodic.dev/research/use-cases/mauna-loa-co2"
 },
 {
  "type": "usecase",
  "slug": "pacific-sea-temperature",
  "title": "How Warm Is the Pacific at This Buoy?",
  "initials": "WI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the buoy's position, the date, the winds and the humidity, what is the sea surface temperature?",
  "audience": "Climate scientists and oceanographers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "El Nino Equatorial Pacific Buoy Readings, 178,080 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From the buoy's position, the date, the winds and the humidity, what is the sea surface temperature? Buoys fail and leave gaps, and El Niño studies need a complete record.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;El Nino buoy&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Temperature per reading",
    "An estimate wherever a buoy has the other readings."
   ],
   [
    "Gaps filled",
    "Complete the record when a sensor drops out."
   ],
   [
    "A strong signal",
    "The catalogue measures one of its highest signals here."
   ]
  ],
  "task": "Regression",
  "domain": "Earth and climate",
  "rows": 178080,
  "cols": 11,
  "licence": "CC BY 4.0",
  "signal": 0.9,
  "url": "https://ergodic.dev/research/use-cases/pacific-sea-temperature"
 },
 {
  "type": "usecase",
  "slug": "soil-water-content",
  "title": "How Much Water Will This Soil Hold?",
  "initials": "MW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its sand, silt and clay, organic carbon, density, pH and depth, how much water does this soil hold at field capacity?",
  "audience": "Soil scientists, agronomists and hydrologists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "SoilHydroDB: Global Soil Hydraulic Properties, 155,649 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From its sand, silt and clay, organic carbon, density, pH and depth, how much water does this soil hold at field capacity? Measuring it in a lab is slow, so an estimate from cheaper measurements helps every irrigation and flood model.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;SoilHydroDB&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Water content per sample",
    "An estimate from routine soil measurements."
   ],
   [
    "Fewer lab tests",
    "Measure the cheap properties and predict the expensive one."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal for this table."
   ]
  ],
  "task": "Regression",
  "domain": "Earth and climate",
  "rows": 155649,
  "cols": 38,
  "licence": "CC BY-SA",
  "signal": 0.82,
  "url": "https://ergodic.dev/research/use-cases/soil-water-content"
 },
 {
  "type": "usecase",
  "slug": "weather-forecast-correction",
  "title": "How Far Off Is the Temperature Forecast?",
  "initials": "FO",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "How wrong will the national weather model's temperature forecast for Aarhus be, and in which direction?",
  "audience": "Meteorologists and forecast users",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "DMI Aarhus Weather Data: Training Matrix, 64,568 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "How wrong will the national weather model's temperature forecast for Aarhus be, and in which direction? Correcting the forecast with recent local observations is how forecasters squeeze out extra accuracy.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;DMI Aarhus weather&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A forecast correction",
    "Add the predicted error to get a better forecast."
   ],
   [
    "Local knowledge",
    "The model learns where the national forecast goes wrong for one city."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal for this table."
   ]
  ],
  "task": "Regression",
  "domain": "Earth and climate",
  "rows": 64568,
  "cols": 76,
  "licence": "CC BY 4.0",
  "signal": 0.88,
  "url": "https://ergodic.dev/research/use-cases/weather-forecast-correction"
 },
 {
  "type": "usecase",
  "slug": "irish-wind-speed",
  "title": "How Windy Is It at This Irish Station?",
  "initials": "WI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "If you know today's wind speed at eleven weather stations across Ireland, what is it at the twelfth?",
  "audience": "Wind energy analysts and meteorologists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Wind 503 Regression, 6,574 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "If you know today's wind speed at eleven weather stations across Ireland, what is it at the twelfth? Filling in one site from its neighbours is how wind farm planners estimate places without a mast.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;wind 503&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A wind speed per day",
    "Estimated from the neighbouring stations."
   ],
   [
    "A site without a mast",
    "The same approach estimates places with no measurements."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Earth and climate",
  "rows": 6574,
  "cols": 15,
  "licence": "StatLib",
  "signal": 0.77,
  "url": "https://ergodic.dev/research/use-cases/irish-wind-speed"
 },
 {
  "type": "usecase",
  "slug": "canyon-turbidity",
  "title": "How Murky Is the Water at the Bottom of the Canyon?",
  "initials": "MI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From currents, temperature, pressure and the weather at the surface, how cloudy is the water deep in Barkley Canyon?",
  "audience": "Ocean scientists and marine engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Oceanic Biological Pump Barkley Canyon, 5,089 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From currents, temperature, pressure and the weather at the surface, how cloudy is the water deep in Barkley Canyon? Turbidity shows how much material sinks to the deep sea, which matters for how the ocean stores carbon.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Barkley Canyon biopump&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Turbidity per hour",
    "An estimate from the other instruments."
   ],
   [
    "Gaps filled",
    "Keep the record going when a sensor is fouled."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Earth and climate",
  "rows": 5089,
  "cols": 31,
  "licence": "CC0",
  "signal": 0.84,
  "url": "https://ergodic.dev/research/use-cases/canyon-turbidity"
 },
 {
  "type": "usecase",
  "slug": "beijing-air-pollution",
  "title": "How Polluted Is Beijing's Air This Hour?",
  "initials": "PI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the dew point, temperature, pressure, wind, snow and rain, how much fine particulate matter is in Beijing's air?",
  "audience": "Air-quality scientists and city health teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Beijing PM2.5 Air Quality and Weather, 43,824 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From the dew point, temperature, pressure, wind, snow and rain, how much fine particulate matter is in Beijing's air? Weather explains a lot of pollution, and knowing how much helps a city tell weather from emissions.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Beijing PM2.5&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "PM2.5 per hour",
    "An estimate from the weather alone."
   ],
   [
    "Weather or emissions",
    "Hours far above the estimate point to a source, not the weather."
   ],
   [
    "A clear comparison",
    "The leaderboard shows how much weather explains."
   ]
  ],
  "task": "Regression",
  "domain": "Ecology and environment",
  "rows": 43824,
  "cols": 13,
  "licence": "CC BY 4.0",
  "signal": 0.57,
  "url": "https://ergodic.dev/research/use-cases/beijing-air-pollution"
 },
 {
  "type": "usecase",
  "slug": "la-ozone",
  "title": "How High Will Ozone Climb in Los Angeles Today?",
  "initials": "HW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the date and the morning's weather readings, what will the day's maximum ozone level be in Los Angeles?",
  "audience": "Air-quality analysts and public health teams",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Los Angeles Ozone Pollution Data (1976), 366 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From the date and the morning's weather readings, what will the day's maximum ozone level be in Los Angeles? Health warnings go out when it's likely to be high.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Los Angeles ozone 1976&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A daily ozone estimate",
    "From readings available that morning."
   ],
   [
    "Earlier warnings",
    "Flag days likely to cross the health limit."
   ],
   [
    "Small data handled",
    "Every model in the collection can take 366 rows."
   ]
  ],
  "task": "Regression",
  "domain": "Ecology and environment",
  "rows": 366,
  "cols": 13,
  "licence": "CC0",
  "signal": 0.71,
  "url": "https://ergodic.dev/research/use-cases/la-ozone"
 },
 {
  "type": "usecase",
  "slug": "urban-land-cover",
  "title": "What's on the Ground in This Part of Ouagadougou?",
  "initials": "SO",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its Sentinel-2 satellite bands, is this spot in Ouagadougou buildings, roads, bare soil, vegetation or water?",
  "audience": "Urban planners and remote-sensing analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Trusted Urban Land-Cover Training Labels, 46 African Cities: Ouagadougou, 5,013 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From its Sentinel-2 satellite bands, is this spot in Ouagadougou buildings, roads, bare soil, vegetation or water? Fast-growing cities need up-to-date maps, and ground surveys can't keep pace.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;urban land-cover Ouagadougou&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A class per point",
    "Land cover with a probability for each class."
   ],
   [
    "Maps that keep up",
    "Classify new satellite passes as they arrive."
   ],
   [
    "Checked labels",
    "Trained on labels people verified on the ground."
   ]
  ],
  "task": "Classification",
  "domain": "Earth and climate",
  "rows": 5013,
  "cols": 19,
  "licence": "CC0 1.0",
  "signal": 0.64,
  "url": "https://ergodic.dev/research/use-cases/urban-land-cover"
 },
 {
  "type": "usecase",
  "slug": "satellite-land-cover",
  "title": "What Land Does This Satellite Pixel Show?",
  "initials": "LD",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the four spectral bands of a small patch of Landsat image, is it red soil, cotton crop, grey soil, damp soil, vegetation stubble or very damp soil?",
  "audience": "Remote-sensing analysts and geographers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Satellite Image Attributes, 6,435 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Climate",
  "notebook": "research-datasets",
  "lede": "From the four spectral bands of a small patch of Landsat image, is it red soil, cotton crop, grey soil, damp soil, vegetation stubble or very damp soil? It's the classic test for turning satellite pixels into a land map.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;satellite image attributes&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A class per pixel",
    "With a probability for each type of land."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ],
   [
    "A classic benchmark",
    "Compare with decades of published results."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 6435,
  "cols": 37,
  "licence": "CC BY 4.0",
  "signal": 0.86,
  "url": "https://ergodic.dev/research/use-cases/satellite-land-cover"
 },
 {
  "type": "usecase",
  "slug": "steel-plant-load-type",
  "title": "What Load Is the Steel Plant Running?",
  "initials": "LI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Is the plant running a light, medium or maximum load right now?",
  "audience": "Energy managers and industrial engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Steel Industry Energy Consumption, 35,040 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "Is the plant running a light, medium or maximum load right now? Knowing the load from the meters alone lets an energy manager shift heavy work to cheaper hours and spot waste without walking the floor.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;steel industry energy consumption&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Load from the meter",
    "Each new reading gets a load type and a probability."
   ],
   [
    "Cheaper scheduling",
    "Heavy loads at peak price stand out at once."
   ],
   [
    "Proof it works",
    "The leaderboard shows the score against a simple guess."
   ]
  ],
  "task": "Classification",
  "domain": "Energy",
  "rows": 35040,
  "cols": 10,
  "licence": "CC BY 4.0",
  "signal": 0.76,
  "url": "https://ergodic.dev/research/use-cases/steel-plant-load-type"
 },
 {
  "type": "usecase",
  "slug": "tetouan-power-demand",
  "title": "How Much Power Will Tetouan Draw?",
  "initials": "MP",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the temperature, humidity, wind and sunlight, how much power will zone 1 of Tetouan use?",
  "audience": "Grid operators and energy analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Power Consumption of Tetouan City, 52,416 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "Given the temperature, humidity, wind and sunlight, how much power will zone 1 of Tetouan use? A city utility plans its supply around exactly this number.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;power consumption Tetouan&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Demand from the weather",
    "An estimate for any weather reading."
   ],
   [
    "A plan for hot days",
    "See how demand moves with temperature."
   ],
   [
    "An honest signal",
    "Weather alone explains part of demand, and the score shows how much."
   ]
  ],
  "task": "Regression",
  "domain": "Energy",
  "rows": 52416,
  "cols": 7,
  "licence": "CC BY 4.0",
  "signal": 0.35,
  "url": "https://ergodic.dev/research/use-cases/tetouan-power-demand"
 },
 {
  "type": "usecase",
  "slug": "solar-radiation",
  "title": "How Much Sunlight Will Reach the Panels?",
  "initials": "MS",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the time of day, temperature, pressure, humidity and wind, how much solar radiation is reaching the ground?",
  "audience": "Solar farm operators and energy forecasters",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Solar Radiation Prediction, 32,686 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From the time of day, temperature, pressure, humidity and wind, how much solar radiation is reaching the ground? Solar operators use the estimate to plan output and fill gaps when a sensor is down.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;solar radiation prediction&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A radiation estimate",
    "Watts per square metre from routine weather readings."
   ],
   [
    "Gaps filled",
    "Estimate radiation when the pyranometer is offline."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal for this table."
   ]
  ],
  "task": "Regression",
  "domain": "Energy",
  "rows": 32686,
  "cols": 11,
  "licence": "ODbL",
  "signal": 0.82,
  "url": "https://ergodic.dev/research/use-cases/solar-radiation"
 },
 {
  "type": "usecase",
  "slug": "smart-grid-stability",
  "title": "Is This Smart Grid Stable?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "With these reaction times, power balances and price responses, will a four-node smart grid stay stable?",
  "audience": "Power systems engineers and energy researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Electrical Grid Stability Simulated Classification, 10,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "With these reaction times, power balances and price responses, will a four-node smart grid stay stable? Simulating every case is slow, so a fast prediction helps designers test many set-ups.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;electrical grid stability&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Stable or not, in seconds",
    "A probability for any grid set-up."
   ],
   [
    "Fewer simulations",
    "Simulate only the borderline cases."
   ],
   [
    "A clear signal",
    "The catalogue measures a strong signal here."
   ]
  ],
  "task": "Classification",
  "domain": "Energy",
  "rows": 10000,
  "cols": 13,
  "licence": "CC BY 4.0",
  "signal": 0.82,
  "url": "https://ergodic.dev/research/use-cases/smart-grid-stability"
 },
 {
  "type": "usecase",
  "slug": "spain-daily-electricity",
  "title": "How Much Electricity Did Spain Use Today?",
  "initials": "ME",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From how much each type of power station generated, what was Spain's total electricity use that day?",
  "audience": "Energy analysts and students",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Daily Electric Energy in Spain (2003), 365 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From how much each type of power station generated, what was Spain's total electricity use that day? A year of daily figures is a small table, which is where foundation models do well.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;daily electric energy Spain&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A daily estimate",
    "Consumption from the generation mix."
   ],
   [
    "Small data handled",
    "365 rows are enough for every model to compete."
   ],
   [
    "A clear signal",
    "The catalogue measures a strong signal."
   ]
  ],
  "task": "Regression",
  "domain": "Energy",
  "rows": 365,
  "cols": 7,
  "licence": "CC0",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/spain-daily-electricity"
 },
 {
  "type": "usecase",
  "slug": "electricity-price-forecast",
  "title": "What Will Electricity Cost Tomorrow, Half-Hour by Half-Hour?",
  "initials": "WE",
  "status": "Published",
  "topics": [
   "Forecasting",
   "Prediction"
  ],
  "summary": "From the recent price history, what will the next 48 half-hourly electricity prices be?",
  "audience": "Energy traders and large power users",
  "model": "Chronos-2",
  "dataset": "Electricity Prices from the ICON 2014 Forecasting Challenge, 38,014 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From the recent price history, what will the next 48 half-hourly electricity prices be? A business that can shift its use to the cheap hours saves real money.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client, Forecast\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;electricity prices ICON 2014&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the history",
    "<p>Keep the time column and the target.</p>\n<pre><code>time = &quot;datetime&quot;\nhistory = data[[time, target]].dropna()\nhistory[time] = pd.to_datetime(history[time])\nhistory = history.sort_values(time).tail(8000)</code></pre>"
   ],
   [
    "Forecast with a range",
    "<p>Ask for the next 48 steps, one per half-hour. The median is the forecast, and the 10% and 90% columns give a low and a high case.</p>\n<pre><code>model = Forecast(model=&quot;chronos-2&quot;).fit(history, time=time, target=[target])\nresult = model.forecast(48, quantile_levels=[0.1, 0.5, 0.9])\nprint(result.to_frame()[[&quot;timestamp&quot;, &quot;median&quot;, &quot;q_0.1&quot;, &quot;q_0.9&quot;]].head(48))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Tomorrow's prices",
    "Every half hour with a range."
   ],
   [
    "The cheap hours",
    "Plan flexible use around the low points."
   ],
   [
    "An honest signal",
    "Prices are hard to forecast, and the range says how hard."
   ]
  ],
  "task": "Forecasting",
  "domain": "Energy",
  "rows": 38014,
  "cols": 18,
  "licence": "Public",
  "signal": 0.38,
  "url": "https://ergodic.dev/research/use-cases/electricity-price-forecast"
 },
 {
  "type": "usecase",
  "slug": "gas-turbine-nox",
  "title": "How Much NOx Is the Gas Turbine Emitting?",
  "initials": "MN",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the weather and the turbine's operating readings, how much nitrogen oxide is the plant putting out?",
  "audience": "Power plant engineers and environmental managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Gas Turbine CO and NOx Emissions (2011-2015), 36,733 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From the weather and the turbine's operating readings, how much nitrogen oxide is the plant putting out? A good estimate backs up the emissions analyser and helps tune the turbine to stay within limits.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;gas turbine CO NOx emissions&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "An emissions estimate",
    "NOx predicted from routine readings."
   ],
   [
    "A check on the analyser",
    "Spot hours when the measured value looks wrong."
   ],
   [
    "Settings to try",
    "See how predicted emissions change with operating conditions."
   ]
  ],
  "task": "Regression",
  "domain": "Energy",
  "rows": 36733,
  "cols": 12,
  "licence": "CC BY 4.0",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/gas-turbine-nox"
 },
 {
  "type": "usecase",
  "slug": "boiler-steam-flow",
  "title": "How Much Steam Is the Boiler Making?",
  "initials": "MS",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the feed water flow, temperature and pressure, how much steam is the refinery boiler producing?",
  "audience": "Process and plant engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "TUPRAS Boiler Sensor Measurements, 44,643 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From the feed water flow, temperature and pressure, how much steam is the refinery boiler producing? A model that tracks it gives operators a second opinion when a flow meter drifts.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;TUPRAS boiler&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A virtual steam meter",
    "An estimate of steam flow from the other sensors."
   ],
   [
    "Drift spotted",
    "A gap between the estimate and the meter flags a sensor to check."
   ],
   [
    "Small table, quick answer",
    "Seven inputs, no tuning."
   ]
  ],
  "task": "Regression",
  "domain": "Engineering and physics",
  "rows": 44643,
  "cols": 8,
  "licence": "CC0",
  "signal": 0.76,
  "url": "https://ergodic.dev/research/use-cases/boiler-steam-flow"
 },
 {
  "type": "usecase",
  "slug": "appliance-energy-use",
  "title": "How Much Energy Are This Home's Appliances Using?",
  "initials": "ME",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From room-by-room temperature and humidity and the weather outside, how much energy are the appliances in this house drawing?",
  "audience": "Smart-home and building energy researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Appliances Energy Prediction, 19,735 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Energy",
  "notebook": "research-datasets",
  "lede": "From room-by-room temperature and humidity and the weather outside, how much energy are the appliances in this house drawing? It tests how much a smart home can learn from cheap sensors.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;appliances energy prediction&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "An energy estimate",
    "Appliance use predicted from room sensors."
   ],
   [
    "A realistic test",
    "The catalogue measures a weak signal, so the baseline comparison is the point."
   ],
   [
    "Which rooms matter",
    "Compare models to see how much the sensors explain."
   ]
  ],
  "task": "Regression",
  "domain": "Energy",
  "rows": 19735,
  "cols": 28,
  "licence": "CC BY 4.0",
  "signal": 0.27,
  "url": "https://ergodic.dev/research/use-cases/appliance-energy-use"
 },
 {
  "type": "usecase",
  "slug": "predict-a-number",
  "title": "What Will This Yacht's Resistance Be?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction"
  ],
  "summary": "Predict a number from a small table of measurements, with no training and no tuning.",
  "audience": "Engineers and analysts predicting a measurement",
  "model": "TabICLv2",
  "dataset": "Yacht Hydrodynamics, 308 hull tests, from Welt's research catalogue",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/regression.ipynb",
  "area": "Engineering",
  "notebook": "regression",
  "lede": "Given a hull's shape and speed, how much will the water push back? Testing every design in a tank is slow and expensive, so engineers want a number they can trust before the test. The same pattern fits any measurement you'd like to predict from a few hundred rows: a yield, a delivery time, a price.",
  "steps": [
   [
    "Load the table",
    "<p>Search the research catalogue and load the table into a DataFrame.</p>\n<pre><code>from welt import Client\n\nwith Client() as client:\n    page = client.research_datasets(q=&quot;yacht&quot;, availability=&quot;available&quot;, limit=5)\n    yachts = client.load_research_dataset(page[&quot;items&quot;][0][&quot;id&quot;])</code></pre>"
   ],
   [
    "Hold some rows back",
    "<p>Keep 30% of the tests aside, so you can check the predictions against real measurements.</p>\n<pre><code>from sklearn.model_selection import train_test_split\n\ntarget = &quot;Residuary.resistance&quot;\ntrain, test = train_test_split(yachts, test_size=0.3, random_state=9)</code></pre>"
   ],
   [
    "Predict and check",
    "<p>Fit on the training rows and predict the held-back ones. There's nothing to tune.</p>\n<pre><code>from welt import Regressor\nfrom sklearn.metrics import mean_absolute_error\n\nmodel = Regressor(model=&quot;tabicl-v2&quot;, random_state=9)\nmodel.fit(train, target=target)\npredictions = model.predict(test.drop(columns=target))\nprint(&quot;Average error:&quot;, mean_absolute_error(test[target], predictions))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A prediction for every new design",
    "Each one comes back in the same units as the measurement."
   ],
   [
    "An honest error figure",
    "The average error on rows the model never saw tells you how far to trust it."
   ],
   [
    "A model you can reuse",
    "The fitted predictor stays in your workspace, so tomorrow's designs need no refit."
   ]
  ],
  "task": "Regression",
  "domain": "Engineering and physics",
  "rows": 308,
  "cols": 7,
  "licence": "",
  "signal": null,
  "url": "https://ergodic.dev/research/use-cases/predict-a-number"
 },
 {
  "type": "usecase",
  "slug": "shuttle-sensor-state",
  "title": "What State Is the Shuttle's System In?",
  "initials": "SI",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From nine sensor readings, which operating state is the system in?",
  "audience": "Reliability engineers and sensor analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Statlog Shuttle, 58,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From nine sensor readings, which operating state is the system in? Engineers need to catch the rare abnormal states quickly, without a hand-built rule for each one.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;statlog shuttle&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A state per reading",
    "Every new set of readings gets a state and a probability."
   ],
   [
    "Rare states caught",
    "Check the per-class scores for the states that matter most."
   ],
   [
    "No rules to maintain",
    "The model learns the boundaries from the data."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 58000,
  "cols": 10,
  "licence": "CC BY 4.0",
  "signal": 0.67,
  "url": "https://ergodic.dev/research/use-cases/shuttle-sensor-state"
 },
 {
  "type": "usecase",
  "slug": "machine-failure",
  "title": "Will This Machine Fail?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given its temperatures, speed, torque and tool wear, is this milling machine about to fail?",
  "audience": "Maintenance engineers and plant managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "AI4I 2020 Predictive Maintenance, 10,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "Given its temperatures, speed, torque and tool wear, is this milling machine about to fail? Catching failures before they happen turns an emergency stop into a planned repair.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;AI4I 2020 predictive maintenance&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A failure risk per reading",
    "Each new reading gets a probability of failure."
   ],
   [
    "Planned repairs",
    "Book maintenance for the machines most at risk."
   ],
   [
    "Rare events checked",
    "The leaderboard shows how well failures are caught, not just overall accuracy."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 10000,
  "cols": 7,
  "licence": "CC BY 4.0",
  "signal": 0.45,
  "url": "https://ergodic.dev/research/use-cases/machine-failure"
 },
 {
  "type": "usecase",
  "slug": "engine-remaining-life",
  "title": "How Long Has This Engine Got Left?",
  "initials": "LH",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "How many more cycles can this jet engine run before it needs attention?",
  "audience": "Reliability and aerospace engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "NASA PHM2008 Dataset 1, 45,918 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "How many more cycles can this jet engine run before it needs attention? An estimate of remaining life lets an operator plan maintenance around the engine instead of the calendar.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;NASA PHM2008&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "Cycles left per engine",
    "A number you can plan maintenance around."
   ],
   [
    "Worst engines first",
    "Sort the fleet by predicted remaining life."
   ],
   [
    "Sensor data as it comes",
    "The model reads the 21 readings without hand-built health indicators."
   ]
  ],
  "task": "Regression",
  "domain": "Engineering and physics",
  "rows": 45918,
  "cols": 22,
  "licence": "BSD",
  "signal": 0.61,
  "url": "https://ergodic.dev/research/use-cases/engine-remaining-life"
 },
 {
  "type": "usecase",
  "slug": "earthquake-building-damage",
  "title": "How Badly Would an Earthquake Damage This Building?",
  "initials": "BW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its age, height, footprint, materials and use, which damage grade is this building likely to reach in an earthquake?",
  "audience": "Structural engineers and disaster planners",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "BMC Training Data: Building Characteristics, 177,640 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From its age, height, footprint, materials and use, which damage grade is this building likely to reach in an earthquake? Planners want to know which buildings to inspect or strengthen before the next one.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;BMC building characteristics&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A damage grade per building",
    "With a probability for each grade."
   ],
   [
    "Where to inspect first",
    "Rank buildings by their chance of heavy damage."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal here, so the comparison with a simple guess matters."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 177640,
  "cols": 40,
  "licence": "CC0",
  "signal": 0.35,
  "url": "https://ergodic.dev/research/use-cases/earthquake-building-damage"
 },
 {
  "type": "usecase",
  "slug": "aileron-control",
  "title": "How Should the F-16's Ailerons Move?",
  "initials": "SF",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the aircraft's current state, what aileron command would the pilot give next?",
  "audience": "Control engineers and aerospace researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Ailerons Control Problem, 13,750 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "Given the aircraft's current state, what aileron command would the pilot give next? Learning that mapping from flight data is a classic test for building autopilot assistance.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;ailerons&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted control action",
    "A number for each flight state."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal, so expect a tight fit."
   ],
   [
    "A classic benchmark",
    "Compare with published results on the same table."
   ]
  ],
  "task": "Regression",
  "domain": "Engineering and physics",
  "rows": 13750,
  "cols": 34,
  "licence": "Public",
  "signal": 0.83,
  "url": "https://ergodic.dev/research/use-cases/aileron-control"
 },
 {
  "type": "usecase",
  "slug": "nyc-school-bus-delays",
  "title": "Is This School Bus Broken Down or Just Late?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the reason given, the route, the run type, the borough and the bus company, is this incident a breakdown or a delay?",
  "audience": "Transport planners and school operations teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Bus Breakdown and Delays in NYC, 2015 to 2017, 147,972 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From the reason given, the route, the run type, the borough and the bus company, is this incident a breakdown or a delay? Breakdowns need a replacement bus, and delays need a message to parents.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;bus breakdown delays NYC&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A label per incident",
    "Breakdown or delay, with a probability."
   ],
   [
    "Faster dispatch",
    "Send a replacement bus as soon as a breakdown is likely."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Transportation",
  "rows": 147972,
  "cols": 21,
  "licence": "CC0: Public Domain",
  "signal": 0.86,
  "url": "https://ergodic.dev/research/use-cases/nyc-school-bus-delays"
 },
 {
  "type": "usecase",
  "slug": "crash-injury-severity",
  "title": "How Badly Will People Be Hurt in This Crash?",
  "initials": "BW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From seat-belt use, ejection, seating position and other crash details, how severe were the injuries?",
  "audience": "Road-safety researchers and transport agencies",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "FARS Motor Vehicle Crash Person Records (PMLB), 100,968 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From seat-belt use, ejection, seating position and other crash details, how severe were the injuries? Knowing what makes the difference helps safety agencies decide where to campaign.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;FARS motor vehicle crash person&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A severity per person",
    "With a probability for each level."
   ],
   [
    "What protects people",
    "Compare predictions with and without restraints."
   ],
   [
    "Large tables handled",
    "A seeded sample keeps the run within the limits."
   ]
  ],
  "task": "Classification",
  "domain": "Transportation",
  "rows": 100968,
  "cols": 30,
  "licence": "MIT (PMLB collection)",
  "signal": 0.43,
  "url": "https://ergodic.dev/research/use-cases/crash-injury-severity"
 },
 {
  "type": "usecase",
  "slug": "sonar-mine-or-rock",
  "title": "Is That Sonar Echo a Mine or a Rock?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the energy in 60 frequency bands of a sonar return, did the pulse bounce off a metal cylinder or a rock?",
  "audience": "Signal-processing engineers and students",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Sonar: Mines versus Rocks, 208 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From the energy in 60 frequency bands of a sonar return, did the pulse bounce off a metal cylinder or a rock? With 208 echoes and 60 features, it's a small, wide table.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;sonar mines rocks&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per echo",
    "Mine or rock."
   ],
   [
    "Small, wide data handled",
    "208 rows and 60 features, no tuning."
   ],
   [
    "A classic benchmark",
    "Compare with published results."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 208,
  "cols": 61,
  "licence": "CC BY 4.0",
  "signal": 0.67,
  "url": "https://ergodic.dev/research/use-cases/sonar-mine-or-rock"
 },
 {
  "type": "usecase",
  "slug": "vehicle-silhouette",
  "title": "Is This a Bus, a Van or a Car?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From 18 measurements of its silhouette, is this vehicle a double-decker bus, a van, or one of two car models?",
  "audience": "Computer-vision students and engineers",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Vehicle Shape Features, 846 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From 18 measurements of its silhouette, is this vehicle a double-decker bus, a van, or one of two car models? It shows how far shape alone gets you.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;vehicle shape features&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A type per vehicle",
    "With a probability for each type."
   ],
   [
    "Which cars get confused",
    "Read the per-class scores."
   ],
   [
    "Small data handled",
    "846 rows fit three of the four models without sampling."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 846,
  "cols": 19,
  "licence": "CC BY 4.0",
  "signal": 0.71,
  "url": "https://ergodic.dev/research/use-cases/vehicle-silhouette"
 },
 {
  "type": "usecase",
  "slug": "gesture-phase",
  "title": "Which Phase of a Gesture Is the Hand In?",
  "initials": "WP",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the velocity and acceleration of the hands and wrists, is the speaker resting, preparing a gesture, making the stroke, holding it or returning?",
  "audience": "Human-computer interaction and sign-language researchers",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Gesture Phase Segmentation, 2,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "From the velocity and acceleration of the hands and wrists, is the speaker resting, preparing a gesture, making the stroke, holding it or returning? Splitting gestures into phases is how researchers study how people talk with their hands.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;gesture phase segmentation&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A phase per frame",
    "With a probability for each phase."
   ],
   [
    "Faster annotation",
    "Label a sample by hand and predict the rest."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 2000,
  "cols": 33,
  "licence": "CC BY 4.0",
  "signal": 0.34,
  "url": "https://ergodic.dev/research/use-cases/gesture-phase"
 },
 {
  "type": "usecase",
  "slug": "noisy-waveform",
  "title": "Which Wave Made This Noisy Signal?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Each signal is a blend of two of three simple wave shapes with random noise added. From its 21 values, which of the three classes produced it?",
  "audience": "Signal-processing students and ML researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Waveform 21, 5,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "Each signal is a blend of two of three simple wave shapes with random noise added. From its 21 values, which of the three classes produced it? Because the noise is known, you can see how close a model gets to the best possible score.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;waveform 21&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A class per signal",
    "With a probability for each class."
   ],
   [
    "A known ceiling",
    "The best possible accuracy is known, so the gap is easy to read."
   ],
   [
    "A classic benchmark",
    "Compare with decades of published results."
   ]
  ],
  "task": "Classification",
  "domain": "Synthetic benchmarks",
  "rows": 5000,
  "cols": 22,
  "licence": "CC BY 4.0",
  "signal": 0.77,
  "url": "https://ergodic.dev/research/use-cases/noisy-waveform"
 },
 {
  "type": "usecase",
  "slug": "led-digit",
  "title": "Which Digit Is This Faulty Display Showing?",
  "initials": "WD",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Each of the seven segments on this display is on or off, and some are flipped by mistake. Which digit was it meant to show?",
  "audience": "Teachers, students and anyone new to machine learning",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "LED Display Digits (7 Segments), 500 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Engineering",
  "notebook": "research-datasets",
  "lede": "Each of the seven segments on this display is on or off, and some are flipped by mistake. Which digit was it meant to show? It's a neat way to see how models cope with noise.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;LED display digits&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A digit per reading",
    "With a probability for each digit."
   ],
   [
    "Noise handled",
    "See how close the score gets to the best possible."
   ],
   [
    "Small data handled",
    "Every model in the collection can take 500 rows."
   ]
  ],
  "task": "Classification",
  "domain": "Synthetic benchmarks",
  "rows": 500,
  "cols": 8,
  "licence": "CC BY 4.0",
  "signal": 0.67,
  "url": "https://ergodic.dev/research/use-cases/led-digit"
 },
 {
  "type": "usecase",
  "slug": "gamma-ray-telescope",
  "title": "Is This Telescope Flash a Gamma Ray?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Did this flash of light in the telescope come from a gamma ray or from ordinary cosmic-ray noise?",
  "audience": "Physicists and astronomy students",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "MAGIC Gamma Telescope, 19,020 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "Did this flash of light in the telescope come from a gamma ray or from ordinary cosmic-ray noise? Telling them apart quickly is how a ground telescope finds the rare gamma-ray sources it's built to study.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;MAGIC gamma telescope&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per flash",
    "Rank events by how likely each is to be a gamma ray."
   ],
   [
    "Cleaner signal",
    "Throw away the background before any deeper analysis."
   ],
   [
    "A known benchmark",
    "Compare the result with years of published work on this table."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 19020,
  "cols": 11,
  "licence": "CC BY 4.0",
  "signal": 0.66,
  "url": "https://ergodic.dev/research/use-cases/gamma-ray-telescope"
 },
 {
  "type": "usecase",
  "slug": "higgs-boson-signal",
  "title": "Is This Collision a Higgs Boson?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Does this simulated collision contain a Higgs boson, or is it background that only looks similar?",
  "audience": "Particle physicists and ML researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Higgs Boson Detection Data (Monte Carlo Simulation), 98,050 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "Does this simulated collision contain a Higgs boson, or is it background that only looks similar? Separating the two is the first filter in any search for new particles.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Higgs boson detection&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A signal score per event",
    "Every collision gets a probability of being a Higgs event."
   ],
   [
    "A fast first cut",
    "Keep the likely events and set the rest aside."
   ],
   [
    "No feature engineering",
    "The model reads the raw and derived columns as they are."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 98050,
  "cols": 29,
  "licence": "Public",
  "signal": 0.63,
  "url": "https://ergodic.dev/research/use-cases/higgs-boson-signal"
 },
 {
  "type": "usecase",
  "slug": "neutrino-event-signal",
  "title": "Is This Detector Event a Neutrino?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Was this flash in the MiniBooNE detector caused by the electron neutrino the experiment was looking for?",
  "audience": "Particle physicists and detector analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "MiniBooNE Particle Event Measurements, 130,064 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "Was this flash in the MiniBooNE detector caused by the electron neutrino the experiment was looking for? The detector records far more background than signal, so a good filter decides what the physicists get to study.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;MiniBooNE particle&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per event",
    "Sort events from most to least signal-like."
   ],
   [
    "Background removed",
    "Spend analysis time on the events that matter."
   ],
   [
    "Wide tables handled",
    "Fifty measurements go in without picking features first."
   ]
  ],
  "task": "Classification",
  "domain": "Engineering and physics",
  "rows": 130064,
  "cols": 51,
  "licence": "CC0",
  "signal": 0.77,
  "url": "https://ergodic.dev/research/use-cases/neutrino-event-signal"
 },
 {
  "type": "usecase",
  "slug": "aqueous-solubility",
  "title": "How Well Will This Compound Dissolve in Water?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From descriptors computed from its structure, what is this compound's solubility in water?",
  "audience": "Medicinal chemists and materials scientists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "AqSolDB Aqueous Solubility Dataset, 9,982 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "From descriptors computed from its structure, what is this compound's solubility in water? Poorly soluble drug candidates fail late and expensively, so chemists screen for it early.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;AqSolDB aqueous solubility&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A solubility estimate",
    "For any compound you can describe."
   ],
   [
    "Earlier screening",
    "Drop poorly soluble candidates before synthesis."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Chemistry and materials",
  "rows": 9982,
  "cols": 25,
  "licence": "CC0: Public Domain",
  "signal": 0.74,
  "url": "https://ergodic.dev/research/use-cases/aqueous-solubility"
 },
 {
  "type": "usecase",
  "slug": "glass-type",
  "title": "Is This Glass from a Building Window?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its refractive index and oxide contents, is this glass fragment the most common type, building window glass?",
  "audience": "Forensic scientists and materials students",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Glass Binarized, 214 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "From its refractive index and oxide contents, is this glass fragment the most common type, building window glass? Forensic teams use exactly this kind of test on glass left at a scene.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;glass binarized&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per fragment",
    "Window glass or not."
   ],
   [
    "Small data handled",
    "Every model in the collection can take 214 rows."
   ],
   [
    "A classic forensic table",
    "Compare with published results."
   ]
  ],
  "task": "Classification",
  "domain": "Chemistry and materials",
  "rows": 214,
  "cols": 10,
  "licence": "CC BY 4.0",
  "signal": 0.6,
  "url": "https://ergodic.dev/research/use-cases/glass-type"
 },
 {
  "type": "usecase",
  "slug": "balance-scale",
  "title": "Which Way Will the Scale Tip?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Given the weight and distance on each side, does the scale tip left, tip right or balance?",
  "audience": "Teachers, students and anyone new to machine learning",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Balance Scale, 625 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "Given the weight and distance on each side, does the scale tip left, tip right or balance? There's a simple rule behind it, so you can see whether a model finds it.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;balance scale&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A result per set-up",
    "With a probability for each outcome."
   ],
   [
    "A known rule",
    "Check the model against the physics."
   ],
   [
    "Small data handled",
    "Three of the four models take all 625 set-ups."
   ]
  ],
  "task": "Classification",
  "domain": "Synthetic benchmarks",
  "rows": 625,
  "cols": 5,
  "licence": "CC BY 4.0",
  "signal": 0.51,
  "url": "https://ergodic.dev/research/use-cases/balance-scale"
 },
 {
  "type": "usecase",
  "slug": "student-final-performance",
  "title": "How Will This Student Finish the Course?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From earlier marks and study habits, family support and wellbeing, which performance class will this postgraduate student end up in?",
  "audience": "University staff and education researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Student Performance Analysis 1, 3,892 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "From earlier marks and study habits, family support and wellbeing, which performance class will this postgraduate student end up in? Tutors want to know who needs help while there's still time.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;student performance analysis&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted class",
    "For each student, with a probability."
   ],
   [
    "Help where it's needed",
    "Contact the students most at risk."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Classification",
  "domain": "Education",
  "rows": 3892,
  "cols": 36,
  "licence": "CC0",
  "signal": 0.56,
  "url": "https://ergodic.dev/research/use-cases/student-final-performance"
 },
 {
  "type": "usecase",
  "slug": "recalled-or-imagined-story",
  "title": "Did This Really Happen, or Was It Imagined?",
  "initials": "DT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the writer's ratings, the time they took and the event they described, is this story a real memory, an imagined one or a retelling?",
  "audience": "Psychologists and language researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Human Memory and Cognition Storytelling Dataset, 6,854 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "From the writer's ratings, the time they took and the event they described, is this story a real memory, an imagined one or a retelling? It's a window on how memory and imagination differ.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;human memory cognition storytelling&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A label per story",
    "Recalled, imagined or retold, with a probability."
   ],
   [
    "How memory differs",
    "Compare models to see what separates them."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Social science",
  "rows": 6854,
  "cols": 23,
  "licence": "CC0: Public Domain",
  "signal": 0.74,
  "url": "https://ergodic.dev/research/use-cases/recalled-or-imagined-story"
 },
 {
  "type": "usecase",
  "slug": "reading-relevance",
  "title": "Which Sentence Answers the Question?",
  "initials": "WS",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From how a reader's eyes moved over a word, is it irrelevant, relevant, or part of the answer they were looking for?",
  "audience": "Cognitive scientists and search-engine researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Eye Movements Relevance, 10,936 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Science",
  "notebook": "research-datasets",
  "lede": "From how a reader's eyes moved over a word, is it irrelevant, relevant, or part of the answer they were looking for? Search tools could one day use gaze to learn what people find useful.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;eye movements relevance&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A label per word",
    "With a probability for each class."
   ],
   [
    "Gaze as feedback",
    "See how much eye movements reveal."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Classification",
  "domain": "Social science",
  "rows": 10936,
  "cols": 28,
  "licence": "Public",
  "signal": 0.44,
  "url": "https://ergodic.dev/research/use-cases/reading-relevance"
 },
 {
  "type": "usecase",
  "slug": "theorem-proving-heuristic",
  "title": "Which Heuristic Will Prove This Theorem Fastest?",
  "initials": "WH",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "A theorem prover has several search heuristics, and the right one depends on the problem. Picking it from the problem's features before the search starts can save hours of compute.?",
  "audience": "Researchers in automated reasoning and algorithm selection",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "First-Order Theorem Proving, 2,000 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "A theorem prover has several search heuristics, and the right one depends on the problem. Picking it from the problem's features before the search starts can save hours of compute.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;first-order theorem proving&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A heuristic per problem",
    "Choose the search strategy before the prover starts."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal here, so the baseline comparison matters."
   ],
   [
    "Compute saved",
    "Better first picks mean fewer wasted runs."
   ]
  ],
  "task": "Classification",
  "domain": "Computing",
  "rows": 2000,
  "cols": 52,
  "licence": "CC BY 4.0",
  "signal": 0.31,
  "url": "https://ergodic.dev/research/use-cases/theorem-proving-heuristic"
 },
 {
  "type": "usecase",
  "slug": "optimiser-performance",
  "title": "How Well Will This Optimiser Do on a New Problem?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Before running an expensive optimiser, can you predict how well it will do from the landscape of the problem?",
  "audience": "Optimisation and AutoML researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "MA-BBOB Algorithm Performance (DiagonalCMA), 1,120 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "Before running an expensive optimiser, can you predict how well it will do from the landscape of the problem? A good prediction lets you pick the right algorithm without trying them all.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;MA-BBOB DiagonalCMA&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted score",
    "Know roughly how the optimiser will do before you run it."
   ],
   [
    "Algorithm choice",
    "Compare predictions across optimisers to pick one."
   ],
   [
    "Fewer wasted runs",
    "Skip runs that are predicted to fail."
   ]
  ],
  "task": "Regression",
  "domain": "Computing",
  "rows": 1120,
  "cols": 46,
  "licence": "CC BY 4.0",
  "signal": 0.44,
  "url": "https://ergodic.dev/research/use-cases/optimiser-performance"
 },
 {
  "type": "usecase",
  "slug": "container-solver-runtime",
  "title": "How Long Will the Solver Take to Tidy This Container Yard?",
  "initials": "LW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "Before a port's planner runs a solver to reorder its stacked containers, can it tell how long the solver will take?",
  "audience": "Logistics and operations researchers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Container Pre-Marshalling Algorithm Runtimes (CPMP 2015), 2,108 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "Before a port's planner runs a solver to reorder its stacked containers, can it tell how long the solver will take? Knowing the runtime up front stops an overnight job from running into the morning shift.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;container pre-marshalling&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted runtime",
    "Seconds per problem and solver, before you run it."
   ],
   [
    "Better scheduling",
    "Fit the slow jobs into the quiet hours."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal, and the baseline comparison shows how much it helps."
   ]
  ],
  "task": "Regression",
  "domain": "Computing",
  "rows": 2108,
  "cols": 27,
  "licence": "Public",
  "signal": 0.37,
  "url": "https://ergodic.dev/research/use-cases/container-solver-runtime"
 },
 {
  "type": "usecase",
  "slug": "phishing-website",
  "title": "Is This Website a Phishing Site?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From 30 features of its URL, page content and outside services, is this website trying to steal logins?",
  "audience": "Security analysts and browser developers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Phishing Websites, 11,055 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "From 30 features of its URL, page content and outside services, is this website trying to steal logins? A good score lets a browser warn people before they type a password.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;phishing websites&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 4,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(4000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A phishing probability",
    "For any site you can describe."
   ],
   [
    "Earlier warnings",
    "Block the riskiest sites first."
   ],
   [
    "A very strong signal",
    "The catalogue measures one of its highest signals."
   ]
  ],
  "task": "Classification",
  "domain": "Computing",
  "rows": 11055,
  "cols": 31,
  "licence": "CC BY 4.0",
  "signal": 0.91,
  "url": "https://ergodic.dev/research/use-cases/phishing-website"
 },
 {
  "type": "usecase",
  "slug": "spam-email",
  "title": "Is This Email Spam?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From how often certain words and characters appear and how long its runs of capitals are, is this email spam?",
  "audience": "Email providers and security teams",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Spambase, 4,601 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "From how often certain words and characters appear and how long its runs of capitals are, is this email spam? It's the table generations of spam filters were tested on.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;spambase&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A spam probability",
    "For each email."
   ],
   [
    "A threshold you choose",
    "Trade missed spam against lost mail using the out-of-fold scores."
   ],
   [
    "A very strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Computing",
  "rows": 4601,
  "cols": 58,
  "licence": "CC BY 4.0",
  "signal": 0.9,
  "url": "https://ergodic.dev/research/use-cases/spam-email"
 },
 {
  "type": "usecase",
  "slug": "code-smell-severity",
  "title": "How Badly Does This Java Class Need Refactoring?",
  "initials": "BD",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From size and complexity metrics, how severe is this class's data-class smell, a class that holds data but does little with it?",
  "audience": "Software engineers and engineering managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Code Smells Data Class, 86,467 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "From size and complexity metrics, how severe is this class's data-class smell, a class that holds data but does little with it? Teams use the score to decide what to clean up first.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;code smells data class&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A severity per class",
    "Rank the codebase for refactoring."
   ],
   [
    "Wide tables handled",
    "Seventy-three metrics go in without selection."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Regression",
  "domain": "Computing",
  "rows": 86467,
  "cols": 74,
  "licence": "Public",
  "signal": 0.37,
  "url": "https://ergodic.dev/research/use-cases/code-smell-severity"
 },
 {
  "type": "usecase",
  "slug": "kaggle-dataset-medal",
  "title": "Will This Kaggle Dataset Win a Medal?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its usability score, files, size, keywords, views, downloads and dates, which medal will this dataset get, if any?",
  "audience": "Data publishers and community managers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Hottest Kaggle Datasets, 5,717 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "From its usability score, files, size, keywords, views, downloads and dates, which medal will this dataset get, if any? Publishers want to know what makes a dataset useful to others.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;hottest Kaggle datasets&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A medal prediction",
    "With a probability for each outcome."
   ],
   [
    "What gets noticed",
    "Compare models to see which features matter."
   ],
   [
    "Text columns handled",
    "Keywords and dates go in as they are."
   ]
  ],
  "task": "Classification",
  "domain": "Computing",
  "rows": 5717,
  "cols": 15,
  "licence": "CC0: Public Domain",
  "signal": 0.44,
  "url": "https://ergodic.dev/research/use-cases/kaggle-dataset-medal"
 },
 {
  "type": "usecase",
  "slug": "page-layout-blocks",
  "title": "Is This Part of the Page Text, a Picture or a Line?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the shape of a block on a scanned page and how much black ink it holds, is it text, a horizontal line, a graphic, a vertical line or a picture?",
  "audience": "Document-processing engineers",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Page Blocks, 5,473 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Technology",
  "notebook": "research-datasets",
  "lede": "From the shape of a block on a scanned page and how much black ink it holds, is it text, a horizontal line, a graphic, a vertical line or a picture? Getting this right is the first step in reading a document automatically.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;page blocks&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A type per block",
    "With a probability for each type."
   ],
   [
    "Rare blocks checked",
    "Per-class scores show how pictures and lines are handled."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Signals and images",
  "rows": 5473,
  "cols": 11,
  "licence": "CC BY 4.0",
  "signal": 0.78,
  "url": "https://ergodic.dev/research/use-cases/page-layout-blocks"
 },
 {
  "type": "usecase",
  "slug": "connect-four-outcome",
  "title": "Who Wins from This Connect Four Position?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the 42 cells of the board, does the first player win, lose or draw with perfect play?",
  "audience": "Game AI researchers and puzzle fans",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Connect-4 Board States, 67,557 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From the 42 cells of the board, does the first player win, lose or draw with perfect play? Learning game outcomes from positions alone is a hard test for any model.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;connect-4&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "An outcome per position",
    "Win, loss or draw, with a probability."
   ],
   [
    "A hard test",
    "The catalogue measures a modest signal for such a rule-bound game."
   ],
   [
    "A classic benchmark",
    "Compare with published results."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 67557,
  "cols": 43,
  "licence": "MIT (PMLB collection)",
  "signal": 0.34,
  "url": "https://ergodic.dev/research/use-cases/connect-four-outcome"
 },
 {
  "type": "usecase",
  "slug": "league-of-legends-win",
  "title": "Will the Blue Team Win This League of Legends Match?",
  "initials": "WB",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From gold, minions, levels, kills and objectives at the 15-minute mark, will the blue team win?",
  "audience": "Esports analysts and players",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "League of Legends Diamond Matches: First 15 Minutes, 48,651 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From gold, minions, levels, kills and objectives at the 15-minute mark, will the blue team win? Analysts want to know how much the early game decides.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;League of Legends diamond matches 15 minutes&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 8,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(8000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A win probability",
    "For any game state at 15 minutes."
   ],
   [
    "How early it's decided",
    "The score shows how much the first 15 minutes tell you."
   ],
   [
    "Calibrated odds",
    "Check the Brier score before quoting a percentage."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 48651,
  "cols": 19,
  "licence": "CC0: Public Domain",
  "signal": 0.52,
  "url": "https://ergodic.dev/research/use-cases/league-of-legends-win"
 },
 {
  "type": "usecase",
  "slug": "overwatch-match-result",
  "title": "Will We Win This Overwatch Match?",
  "initials": "WW",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From the season, map, role, characters and both teams' skill ratings before the match, will this game be won?",
  "audience": "Esports players and analysts",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "Overwatch Competitive Matches (Seven Seasons), 3,266 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From the season, map, role, characters and both teams' skill ratings before the match, will this game be won? Players want to know which picks and maps suit them.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Overwatch competitive matches&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end. The models learn from a seeded sample of 2,000 of the rest, the most this table's width allows.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index).sample(2000, random_state=7)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A win probability",
    "Before the match starts."
   ],
   [
    "Best maps and picks",
    "Compare predictions across choices."
   ],
   [
    "A clear signal",
    "The catalogue measures a good signal."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 3266,
  "cols": 47,
  "licence": "CC0: Public Domain",
  "signal": 0.67,
  "url": "https://ergodic.dev/research/use-cases/overwatch-match-result"
 },
 {
  "type": "usecase",
  "slug": "starcraft-league",
  "title": "Which League Does This StarCraft II Player Belong In?",
  "initials": "WL",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From actions per minute, hotkey use, reaction cycles and hours played, which league is this player in?",
  "audience": "Esports coaches and cognitive scientists",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "SkillCraft1 Master Table: StarCraft 2 Player Performance, 3,395 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From actions per minute, hotkey use, reaction cycles and hours played, which league is this player in? Researchers use it to study how expertise shows up in fast decisions.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;SkillCraft1 StarCraft 2&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A league per player",
    "With a probability for each league."
   ],
   [
    "What separates the best",
    "Compare models to see which skills matter."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 3395,
  "cols": 20,
  "licence": "CC BY 4.0",
  "signal": 0.31,
  "url": "https://ergodic.dev/research/use-cases/starcraft-league"
 },
 {
  "type": "usecase",
  "slug": "pokemon-legendary",
  "title": "Is This Pokémon Legendary?",
  "initials": "IT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its types, base stats, size, capture rate and egg steps, is this Pokémon legendary?",
  "audience": "Game fans and anyone new to machine learning",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Pokemon Dataset 2020, 1,013 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From its types, base stats, size, capture rate and egg steps, is this Pokémon legendary? It's a fun table with a real lesson: some columns give the answer away.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Pokemon 2020&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A probability per Pokémon",
    "Legendary or not."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ],
   [
    "A lesson in leakage",
    "Check whether one column does all the work."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 1013,
  "cols": 40,
  "licence": "CC0: Public Domain",
  "signal": 0.81,
  "url": "https://ergodic.dev/research/use-cases/pokemon-legendary"
 },
 {
  "type": "usecase",
  "slug": "3ds-metacritic-score",
  "title": "What Will Critics Score This 3DS Game?",
  "initials": "WC",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From user ratings, playtime, ownership counts, tags and genres, what Metacritic score did this Nintendo 3DS game get?",
  "audience": "Game publishers and players",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2, TabDPT 1.3",
  "dataset": "Nintendo 3DS Games, 138 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From user ratings, playtime, ownership counts, tags and genres, what Metacritic score did this Nintendo 3DS game get? With 138 games, it's a test of how far a tiny table can go.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;Nintendo 3DS games&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;, &quot;tabdpt-1.3&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted score",
    "For each game."
   ],
   [
    "Tiny data handled",
    "Every model in the collection can take 138 rows."
   ],
   [
    "An honest signal",
    "The catalogue measures a modest signal."
   ]
  ],
  "task": "Regression",
  "domain": "Sports and games",
  "rows": 138,
  "cols": 21,
  "licence": "CC0: Public Domain",
  "signal": 0.36,
  "url": "https://ergodic.dev/research/use-cases/3ds-metacritic-score"
 },
 {
  "type": "usecase",
  "slug": "football-player-position",
  "title": "What Position Does This Footballer Play?",
  "initials": "PD",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From age, height and per-match statistics, does this player play as a goalkeeper, defender, midfielder or forward?",
  "audience": "Football scouts and analysts",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Football Player Position, 3,611 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From age, height and per-match statistics, does this player play as a goalkeeper, defender, midfielder or forward? Scouts use the same idea to find players who could switch roles.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;football player position&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. ROC AUC runs from 0.5, a coin toss, to 1, a perfect ranking, and a lower Brier score means the probabilities can be trusted more. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;classification&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;roc_auc_mean&quot;, &quot;brier_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features),\n                    &quot;probability&quot;: model.predict_proba(features).max(axis=1)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A position per player",
    "With a probability for each role."
   ],
   [
    "Players who fit two roles",
    "Look for players split between positions."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Classification",
  "domain": "Sports and games",
  "rows": 3611,
  "cols": 12,
  "licence": "CC0",
  "signal": 0.78,
  "url": "https://ergodic.dev/research/use-cases/football-player-position"
 },
 {
  "type": "usecase",
  "slug": "imdb-rating",
  "title": "What Will This Film Score on IMDb?",
  "initials": "WT",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its year, genre, runtime, votes, box office, Metascore and director, what IMDb rating did this film get?",
  "audience": "Film fans, studios and data journalists",
  "model": "TabICLv2, Kumo Tabular Medium",
  "dataset": "IMDB Movies 1972-2019, 5,834 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From its year, genre, runtime, votes, box office, Metascore and director, what IMDb rating did this film get? It's a fun way to see how much critics and audiences agree.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;IMDB movies 1972-2019&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted rating",
    "For any film you can describe."
   ],
   [
    "Critics and crowds",
    "See how much the Metascore predicts the audience."
   ],
   [
    "Text columns handled",
    "Genres and directors go in as they are."
   ]
  ],
  "task": "Regression",
  "domain": "Other",
  "rows": 5834,
  "cols": 12,
  "licence": "CC0: Public Domain",
  "signal": 0.6,
  "url": "https://ergodic.dev/research/use-cases/imdb-rating"
 },
 {
  "type": "usecase",
  "slug": "anime-rating",
  "title": "How Will Viewers Rate This Anime?",
  "initials": "WV",
  "status": "Published",
  "topics": [
   "Prediction",
   "Model evaluation"
  ],
  "summary": "From its media type, episodes, years, studio, content warnings and viewing counts, what average rating does this title get on Anime-Planet?",
  "audience": "Anime fans, streaming teams and data journalists",
  "model": "TabICLv2, Kumo Tabular Medium, Mitra-v2",
  "dataset": "Anime Dataset from Anime-Planet, 3,767 rows",
  "colab": "https://colab.research.google.com/github/ergodic-ai/welt-python/blob/1ffb86d1bd5e3575a00b245d594b0f705e518689/examples/notebooks/research-datasets.ipynb",
  "area": "Media and games",
  "notebook": "research-datasets",
  "lede": "From its media type, episodes, years, studio, content warnings and viewing counts, what average rating does this title get on Anime-Planet? Streaming teams use estimates like this to pick what to license.",
  "steps": [
   [
    "Load it from the catalogue",
    "<p>Find the table, read its recorded target and print the column names.</p>\n<pre><code>import pandas as pd\nfrom welt import Client\n\nwith Client() as client:\n    item = client.research_datasets(q=&quot;anime-planet&quot;, limit=1)[&quot;items&quot;][0]\n    info = client.research_dataset(item[&quot;id&quot;])\n    data = client.load_research_dataset(item[&quot;id&quot;])\n\ntarget = info[&quot;targets&quot;][0]\ntarget = target[&quot;name&quot;] if isinstance(target, dict) else target\nprint([column[&quot;name&quot;] for column in info[&quot;schema&quot;]], target)</code></pre>"
   ],
   [
    "Pick the rows",
    "<p>Set aside 20 rows to predict at the end, and keep the rest for the models to learn from.</p>\n<pre><code>known = data.dropna(subset=[target])\nnew_rows = known.sample(20, random_state=1)\ntable = known.drop(new_rows.index)</code></pre>"
   ],
   [
    "Compare the models and predict",
    "<p>The models compete on the same folds against a simple guess, then the top-ranked one is fitted on the whole table. RMSE and MAE are average errors in the target's own units, so lower is better. The last table puts each prediction next to the real answer.</p>\n<pre><code>with Client() as client:\n    evaluation = client.evaluate(table, target, task=&quot;regression&quot;, seed=7,\n                                 models=[&quot;tabicl-v2&quot;, &quot;kumo-medium&quot;, &quot;mitra-v2&quot;])\n    model = evaluation.fit()\n\nprint(evaluation.summary()[[&quot;name&quot;, &quot;rank&quot;, &quot;rmse_mean&quot;, &quot;mae_mean&quot;]])\nfeatures = new_rows.drop(columns=target)\nprint(pd.DataFrame({&quot;actual&quot;: new_rows[target].values, &quot;predicted&quot;: model.predict(features)}))</code></pre>"
   ]
  ],
  "gets": [
   [
    "A predicted rating",
    "For any title."
   ],
   [
    "What fans value",
    "Compare predictions across studios and formats."
   ],
   [
    "A strong signal",
    "The catalogue measures a high signal."
   ]
  ],
  "task": "Regression",
  "domain": "Other",
  "rows": 3767,
  "cols": 18,
  "licence": "CC0: Public Domain",
  "signal": 0.76,
  "url": "https://ergodic.dev/research/use-cases/anime-rating"
 }
]
