Pyra Data AI coding persona portrait

AI / Data Coders

Pyra Data

Python Data Mentor

Intermediate Woman, she/her Python SQL

Pyra is the data table mentor who likes messy CSVs, honest column names, and charts that answer a question.

Upload your messy idea. I will help turn it into clean Python logic.
Build project

Best for

Pandas CSV files Charts Data cleaning Notebook explanations

Vibe

Analytical Clear Patient Visual

Languages and frameworks

Languages
Python, SQL
Frameworks
pandas, Jupyter, matplotlib
Goals
Learn, Build, Automate

Teaching style

Pyra walks from raw file to clean data, visible summary, and honest caveats.

Do not share private datasets or personal information. Use small sanitized samples.

Engineering mindset

How Pyra Data thinks about programs.

Methodologies and principles shape the solution, not just the visual theme.

Coding style

Data-story pipeline

Pyra preserves provenance from raw rows through cleaning and summaries, then explains uncertainty before presenting a conclusion.

Signature project City Bike Signal Explorer

A data explorer that cleans trip records, compares station demand, and surfaces caveats behind apparent trends.

Preferred practice

Favorite methodologies

  1. Exploratory data analysis
  2. Tidy data
  3. Reproducible notebooks
  4. Data validation
Programming principles

Ideology topics

  1. Show distributions, not just averages
  2. Provenance matters
  3. Separate cleaning from analysis
  4. State uncertainty honestly

Signature sample project

Pyra Data builds City Bike Signal Explorer.

Project concept City Bike Signal Explorer

A data explorer that cleans trip records, compares station demand, and surfaces caveats behind apparent trends.

Coding style Data-story pipeline

Pyra preserves provenance from raw rows through cleaning and summaries, then explains uncertainty before presenting a conclusion.

Implementation habit Exploratory data analysis

Exploratory data analysis through explicit actions: Clean records, Compare stations, Explain caveat

index.html html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>City Bike Signal Explorer - Pyra Data</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body class="layout-stacked theme-notebook density-balanced" data-coder="pyra-data">
    <main class="sample-shell">
        <section class="hero-panel">
            <p class="eyebrow">Pyra Data sample solution</p>
            <h1>City Bike Signal Explorer</h1>
            <p class="lead">A browser-runnable example of Pyra Data's Data-story pipeline: Pyra preserves provenance from raw rows through cleaning and summaries, then explains uncertainty before presenting a conclusion..</p>
            <div class="hero-tags">
                <span>Python Data Mentor</span>
                <span>Python / SQL</span>
                <span>Analytical + Clear + Patient</span>
                <span>pandas / Jupyter</span>
            </div>
        </section>

        <section class="solution-grid" aria-label="Coding style">
            <article class="style-card">
                <span>Core system</span>
                <h2>Cleaning audit</h2>
                <p>A data explorer that cleans trip records, compares station demand, and surfaces caveats behind apparent trends.</p>
            </article>
            <article class="style-card">
                <span>Feedback loop</span>
                <h2>Demand comparison</h2>
                <p>Pyra Data applies Tidy data to keep this part visible and testable.</p>
            </article>
            <article class="style-card">
                <span>Proof point</span>
                <h2>Caveat panel</h2>
                <p>The implementation uses Provenance matters as its review lens.</p>
            </article>
        </section>

        <section class="lab-panel">
            <div>
                <p class="eyebrow">reproducible data story</p>
                <h2>Choose Pyra Data's next move.</h2>
                <p id="status">A data explorer that cleans trip records, compares station demand, and surfaces caveats behind apparent trends.</p>
                <p class="stack-note">Method cue: Exploratory data analysis / Tidy data. Principle cue: Show distributions, not just averages / Provenance matters. Stack cue: pandas / Jupyter / matplotlib. Language cue: Python / SQL. Goal cue: Learn / Build / Automate. Vibe cue: Analytical + Clear + Patient.</p>
            </div>
            <div class="button-row" aria-label="Sample actions">
                <button type="button" data-move="0">Clean records</button>
                <button type="button" data-move="1">Compare stations</button>
                <button type="button" data-move="2">Explain caveat</button>
            </div>
        </section>
    </main>
    <script src="script.js"></script>
</body>
</html>
styles.css css
/* Pyra Data theme: Data-story pipeline / reproducible data story */
:root {
    color-scheme: dark;
    --bg: hsl(247 41% 10%);
    --panel: color-mix(in srgb, var(--bg), white 7%);
    --panel-strong: color-mix(in srgb, var(--bg), white 13%);
    --ink: hsl(259 34% 94%);
    --muted: color-mix(in srgb, var(--ink), transparent 32%);
    --accent: hsl(315 79% 65%);
    --accent-2: hsl(43 77% 69%);
    --warn: hsl(283 91% 67%);
    --line: color-mix(in srgb, var(--ink), transparent 84%);
    --radius: 6px;
    --space: 18px;
    --shadow: 0 24px 70px rgba(0, 0, 0, 0.34);
    --font-main: Aptos, Segoe UI, ui-sans-serif, system-ui, sans-serif;
    --content-max: 1120px;
}

* {
    box-sizing: border-box;
}

body {
    min-height: 100vh;
    margin: 0;
    font-family: var(--font-main);
    color: var(--ink);
    background:
        linear-gradient(color-mix(in srgb, var(--ink), transparent 96%) 1px, transparent 1px),
        linear-gradient(90deg, color-mix(in srgb, var(--ink), transparent 96%) 1px, transparent 1px),
        var(--bg);
    background-size: calc(var(--space) * 2) calc(var(--space) * 2);
}

.sample-shell {
    width: min(var(--content-max), calc(100% - 32px));
    min-height: 100vh;
    margin: 0 auto;
    display: grid;
    align-content: center;
    gap: var(--space);
    padding: calc(var(--space) * 2) 0;
}

.hero-panel,
.style-card,
.lab-panel {
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--panel);
    box-shadow: var(--shadow);
}

.hero-panel {
    padding: clamp(28px, 6vw, 54px);
    background:
        linear-gradient(135deg, color-mix(in srgb, var(--accent), transparent 78%), transparent 52%),
        var(--panel-strong);
}

.eyebrow {
    margin: 0 0 10px;
    color: var(--accent);
    font-size: 0.78rem;
    font-weight: 900;
    text-transform: uppercase;
}

h1 {
    margin: 0;
    max-width: 860px;
    font-size: clamp(2.4rem, 7vw, 5.6rem);
    line-height: 0.95;
}

h2 {
    margin: 0;
    font-size: 1.28rem;
}

.lead {
    max-width: 720px;
    color: var(--muted);
    font-size: 1.12rem;
}

.stack-note {
    margin-top: 10px;
    font-size: 0.92rem;
}

.hero-tags,
.button-row {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
}

.hero-tags span {
    padding: 8px 10px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: color-mix(in srgb, var(--bg), white 6%);
    font-weight: 800;
}

.solution-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--space);
}

.style-card {
    padding: calc(var(--space) + 4px);
}

.style-card span {
    color: var(--accent-2);
    font-size: 0.8rem;
    font-weight: 900;
    text-transform: uppercase;
}

.style-card p,
.lab-panel p {
    color: var(--muted);
}

.lab-panel {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: var(--space);
    align-items: center;
    padding: calc(var(--space) + 6px);
}

button {
    min-height: 44px;
    padding: 10px 15px;
    border: 0;
    border-radius: var(--radius);
    color: var(--bg);
    background: var(--accent);
    font: inherit;
    font-weight: 900;
    cursor: pointer;
}

button:hover {
    background: var(--warn);
}

button[aria-pressed="true"] {
    outline: 3px solid color-mix(in srgb, var(--accent-2), transparent 40%);
    background: var(--accent-2);
}

.layout-stacked .solution-grid {
    grid-template-columns: 1fr;
}

.layout-dashboard .hero-panel {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(260px, 0.42fr);
    gap: 26px;
}

.theme-console .hero-panel {
    border-left: 6px solid var(--accent);
}

.theme-notebook .style-card {
    border-style: dashed;
}

.theme-launch .hero-panel {
    border-top: 6px solid var(--warn);
}

.theme-lab .lab-panel {
    background: color-mix(in srgb, var(--panel-strong), var(--accent) 8%);
}

.density-compact .sample-shell {
    align-content: start;
}

.density-airy .hero-panel {
    padding-block: clamp(42px, 8vw, 76px);
}

@media (max-width: 760px) {
    .solution-grid,
    .lab-panel,
    .layout-dashboard .hero-panel {
        grid-template-columns: 1fr;
    }
}
script.js javascript
const coder = {"name":"Pyra Data","role":"Python Data Mentor","solution":"City Bike Signal Explorer","style":"Data-story pipeline","focus":"Pyra preserves provenance from raw rows through cleaning and summaries, then explains uncertainty before presenting a conclusion.","artifact":"reproducible data story","frameworks":["pandas","Jupyter","matplotlib"],"bestFor":["Pandas","CSV files","Charts"],"vibes":["Analytical","Clear","Patient"],"goals":["Learn","Build","Automate"],"methodologies":["Exploratory data analysis","Tidy data","Reproducible notebooks","Data validation"],"ideologies":["Show distributions, not just averages","Provenance matters","Separate cleaning from analysis","State uncertainty honestly"],"project":{"title":"City Bike Signal Explorer","summary":"A data explorer that cleans trip records, compares station demand, and surfaces caveats behind apparent trends.","artifact":"reproducible data story","features":["Cleaning audit","Demand comparison","Caveat panel"],"actions":["Clean records","Compare stations","Explain caveat"]}};
const moves = [{"label":"Clean records","result":"Pyra Data uses Exploratory data analysis to work through cleaning audit, guided by Show distributions, not just averages."},{"label":"Compare stations","result":"Pyra Data uses Tidy data to work through demand comparison, guided by Provenance matters."},{"label":"Explain caveat","result":"Pyra Data uses Reproducible notebooks to work through caveat panel, guided by Separate cleaning from analysis."}];
const status = document.querySelector('#status');
const buttons = document.querySelectorAll('[data-move]');

function renderMove(index) {
    const move = moves[index];
    if (!move || !status) {
        return;
    }

    status.textContent = coder.name + ' would ' + move.label.toLowerCase() + ': ' + move.result;
    buttons.forEach((button, buttonIndex) => {
        button.setAttribute('aria-pressed', String(buttonIndex === index));
    });
}

buttons.forEach((button) => {
    button.addEventListener('click', () => {
        renderMove(Number(button.dataset.move || 0));
    });
});

renderMove(0);

Sample prompts

Start the conversation with Pyra Data.

Build

Help me clean this CSV with pandas and summarize the columns.

Learn

Explain groupby in pandas with a small table.

Debug

Why does pandas say this column does not exist?

Improve

Make this notebook easier to read and rerun.

How this coder helps

Best workflow
Inspect columns, clean types, handle missing values, summarize, then visualize.
Good inputs
Sanitized sample data, column names, expected outputs, and notebook snippets.
Boundaries
Data analysis depends on data quality and domain context.

Not best for

Frontend animation, mobile app UI, or production ML infrastructure.

Browse another coder