File size: 2,897 Bytes
36724cf
 
 
 
 
 
 
 
880ab76
60150c3
ba7260d
36724cf
880ab76
 
 
 
60150c3
880ab76
 
 
 
 
36724cf
ba7260d
880ab76
36724cf
880ab76
 
966c1fd
880ab76
 
 
 
ba7260d
880ab76
 
36724cf
 
ba7260d
966c1fd
ba7260d
 
60150c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba7260d
 
 
 
60150c3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ba7260d
 
36724cf
60150c3
880ab76
36724cf
 
880ab76
 
 
 
60150c3
36724cf
 
60150c3
880ab76
945e7e9
 
 
 
 
 
 
36724cf
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import marimo

__generated_with = "0.18.4"
app = marimo.App(width="full", app_title="🤩 Data")


@app.cell
def _():
    from pathlib import Path
    import altair as alt
    import duckdb
    import marimo as mo
    import sys

    ROOT = Path(__file__).parent.parent
    sys.path.append(ROOT.as_posix())
    return ROOT, alt, duckdb, mo


@app.cell
def _():
    # internal imports
    from src.marimo_apps import UI

    return (UI,)


@app.cell
def _(ROOT, mo):
    df = mo.sql(
        f"""
        FROM '{ROOT / "data/isotopes.csv"}'
        """,
        output=False,
    )
    return (df,)


@app.cell
def _(alt, mo):
    df2 = mo.sql(
        """
        SELECT *,
            CASE
                WHEN Number BETWEEN 58 AND 71 THEN 9
                WHEN Number BETWEEN 90 AND 103 THEN 10
                WHEN Number <= 2 THEN 1
                WHEN Number <= 10 THEN 2
                WHEN Number <= 18 THEN 3
                WHEN Number <= 36 THEN 4
                WHEN Number <= 54 THEN 5
                WHEN Number <= 86 THEN 6
                ELSE 7
            END AS period,
            CASE
                WHEN Number BETWEEN 58 AND 71 THEN (Number - 58) % 14 + 3
                WHEN Number BETWEEN 90 AND 103 THEN (Number - 90) % 14 + 3
                WHEN Number <= 4 THEN 2 - Number % 2
                WHEN Number <= 10 THEN Number + 8
                WHEN Number <= 12 THEN Number - 10
                WHEN Number <= 18 THEN Number
                WHEN Number <= 20 THEN Number % 2 + 1
                WHEN Number <= 57 THEN (Number - 1) % 18 + 1
                WHEN Number <= 86 THEN (Number - 33) % 18 + 1
                WHEN Number <= 89 THEN Number - 86
                ELSE Number - 100
            END AS group,
        FROM df
        """,
        output=False,
    )
    ptable = (
        alt.Chart(df2)
        .mark_text(
            align="left",
            baseline="middle",
            font="DejaVu",
            fontSize=13,
            fontWeight=600,
            opacity=1,
        )
        .encode(
            x=alt.X("group:N").axis(None),
            y=alt.Y(
                "period:Q",  # sort="-period"
            )
            .scale(domain=(10.5, 0.5), nice=False)
            .axis(None),
            text="Symbol",
            tooltip=["count()"],
        )
    )  # .configure_view(continuousHeight=480)
    return (df2, ptable)


@app.cell
def _(UI, df2, mo, ptable):
    md = mo.md(f"""
    # Yes, Notebooks In Production | PyCon 2026

    This app illustrates database queries, various ways to look at tabular data, and interactive Altair plots.

    ## Sample Data: Isotopes of Chemical Elements

    {mo.ui.table(df2)}
    """)

    dashboard = mo.vstack([md, ptable])

    mo.hstack([UI.NAV, dashboard], widths=[1, 5])
    return


@app.cell
def _(UI):
    UI.BUILD_DETAILS
    return


if __name__ == "__main__":
    app.run()