Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/workflows/parity-drift.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Parity drift

# Detects when the upstream R packages (moderndive, infer) change in a way the
# Python port hasn't caught up with — a version bump, an added/removed export, or
# a dataset whose dimensions/columns changed — and opens (or comments on) an issue.
on:
schedule:
- cron: "0 6 * * MON"
workflow_dispatch:

permissions:
contents: read
issues: write

concurrency:
group: parity-drift
cancel-in-progress: true

jobs:
drift:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- name: Set up R
uses: r-lib/actions/setup-r@v2
with:
use-public-rspm: true

- name: Install upstream R packages (latest from GitHub)
run: |
Rscript -e 'install.packages(c("remotes", "jsonlite"))'
Rscript -e 'remotes::install_github(c("moderndive/moderndive", "tidymodels/infer"), upgrade = "never")'

- name: Set up uv
uses: astral-sh/setup-uv@v7
with:
python-version: "3.12"

- name: Install the Python package
run: uv sync

- name: Probe upstream
run: Rscript tools/parity_probe.R > upstream.json

- name: Check parity
id: check
run: |
set +e
uv run python tools/check_parity.py upstream.json | tee report.md
code=${PIPESTATUS[0]}
set -e
if [ "$code" -ne 0 ]; then echo "drift=1" >> "$GITHUB_OUTPUT"; else echo "drift=0" >> "$GITHUB_OUTPUT"; fi

- name: Open or update a drift issue
if: steps.check.outputs.drift == '1'
env:
GH_TOKEN: ${{ github.token }}
run: |
title="Upstream parity drift detected"
num=$(gh issue list --state open --search "$title in:title" --json number --jq '.[0].number // empty')
if [ -n "$num" ]; then
gh issue comment "$num" --body-file report.md
else
gh issue create --title "$title" --body-file report.md
fi
5 changes: 5 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ build:
os: ubuntu-24.04
tools:
python: "3.12"
jobs:
# The docs execute {python} cells with myst-nb and render plotly figures as
# static PNGs via kaleido, which (>=1.0) needs a Chrome it doesn't bundle.
post_install:
- python -c "import kaleido; kaleido.get_chrome_sync()"

sphinx:
configuration: doc/conf.py
Expand Down
Binary file modified doc/_build/html/.doctrees/api.doctree
Binary file not shown.
Binary file added doc/_build/html/.doctrees/coming-from-r.doctree
Binary file not shown.
Binary file added doc/_build/html/.doctrees/datasets.doctree
Binary file not shown.
Binary file modified doc/_build/html/.doctrees/environment.pickle
Binary file not shown.
Binary file added doc/_build/html/.doctrees/getting-started.doctree
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added doc/_build/html/.doctrees/guides/sampling.doctree
Binary file not shown.
Binary file not shown.
Binary file modified doc/_build/html/.doctrees/index.doctree
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 17 additions & 2 deletions doc/_build/html/_modules/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="../_static/mystnb.11b39860a7a0cbfd473a3ad8a317855267ff0bd372690045ca344a6b62be495e.css" />
<link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=8dab3a3b" />


Expand Down Expand Up @@ -194,9 +195,23 @@
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Contents</span></p>
<p class="caption" role="heading"><span class="caption-text">Get started</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../getting-started.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../coming-from-r.html">Coming from R</a></li>
<li class="toctree-l1"><a class="reference internal" href="../datasets.html">Datasets</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Guides</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../guides/sampling.html">Sampling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/confidence-intervals.html">Bootstrapping &amp; confidence intervals</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/hypothesis-testing.html">Hypothesis testing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/regression.html">Regression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/theory-based.html">Theory-based inference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/plotting.html">Plotting: plotly &amp; plotnine</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../index.html">moderndive (Python)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../api.html">API reference</a></li>
</ul>

Expand Down
19 changes: 17 additions & 2 deletions doc/_build/html/_modules/moderndive/correlation.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="../../_static/mystnb.11b39860a7a0cbfd473a3ad8a317855267ff0bd372690045ca344a6b62be495e.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />


Expand Down Expand Up @@ -194,9 +195,23 @@
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Contents</span></p>
<p class="caption" role="heading"><span class="caption-text">Get started</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../getting-started.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../coming-from-r.html">Coming from R</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets.html">Datasets</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Guides</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../guides/sampling.html">Sampling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/confidence-intervals.html">Bootstrapping &amp; confidence intervals</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/hypothesis-testing.html">Hypothesis testing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/regression.html">Regression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/theory-based.html">Theory-based inference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/plotting.html">Plotting: plotly &amp; plotnine</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../index.html">moderndive (Python)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api.html">API reference</a></li>
</ul>

Expand Down
19 changes: 17 additions & 2 deletions doc/_build/html/_modules/moderndive/data.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="../../_static/mystnb.11b39860a7a0cbfd473a3ad8a317855267ff0bd372690045ca344a6b62be495e.css" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />


Expand Down Expand Up @@ -194,9 +195,23 @@
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Contents</span></p>
<p class="caption" role="heading"><span class="caption-text">Get started</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../getting-started.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../coming-from-r.html">Coming from R</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../datasets.html">Datasets</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Guides</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../guides/sampling.html">Sampling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/confidence-intervals.html">Bootstrapping &amp; confidence intervals</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/hypothesis-testing.html">Hypothesis testing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/regression.html">Regression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/theory-based.html">Theory-based inference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/plotting.html">Plotting: plotly &amp; plotnine</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../index.html">moderndive (Python)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../api.html">API reference</a></li>
</ul>

Expand Down
46 changes: 44 additions & 2 deletions doc/_build/html/_modules/moderndive/infer/core.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css?v=76b2166b" />
<link rel="stylesheet" type="text/css" href="../../../_static/mystnb.11b39860a7a0cbfd473a3ad8a317855267ff0bd372690045ca344a6b62be495e.css" />
<link rel="stylesheet" type="text/css" href="../../../_static/styles/furo-extensions.css?v=8dab3a3b" />


Expand Down Expand Up @@ -194,9 +195,23 @@
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Contents</span></p>
<p class="caption" role="heading"><span class="caption-text">Get started</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../getting-started.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../coming-from-r.html">Coming from R</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../datasets.html">Datasets</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Guides</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/sampling.html">Sampling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/confidence-intervals.html">Bootstrapping &amp; confidence intervals</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/hypothesis-testing.html">Hypothesis testing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/regression.html">Regression</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/theory-based.html">Theory-based inference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/plotting.html">Plotting: plotly &amp; plotnine</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">Reference</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">moderndive (Python)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../api.html">API reference</a></li>
</ul>

Expand Down Expand Up @@ -768,6 +783,33 @@ <h1>Source code for moderndive.infer.core</h1><div class="highlight"><pre>
<span class="k">return</span> <span class="n">spec</span><span class="o">.</span><span class="n">hypothesize</span><span class="p">(</span><span class="n">null</span><span class="o">=</span><span class="n">null</span><span class="p">,</span> <span class="n">mu</span><span class="o">=</span><span class="n">mu</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">p</span><span class="p">,</span> <span class="n">sigma</span><span class="o">=</span><span class="n">sigma</span><span class="p">)</span><span class="o">.</span><span class="n">calculate</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="n">order</span><span class="p">)</span>
<span class="k">return</span> <span class="n">spec</span><span class="o">.</span><span class="n">calculate</span><span class="p">(</span><span class="n">stat</span><span class="p">,</span> <span class="n">order</span><span class="o">=</span><span class="n">order</span><span class="p">,</span> <span class="n">mu</span><span class="o">=</span><span class="n">mu</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">p</span><span class="p">,</span> <span class="n">sigma</span><span class="o">=</span><span class="n">sigma</span><span class="p">)</span></div>



<span class="k">def</span><span class="w"> </span><span class="nf">_dataframe_specify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">response</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">explanatory</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">formula</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">success</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Start an inference pipeline from this DataFrame (see :func:`specify`).&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">specify</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">response</span><span class="o">=</span><span class="n">response</span><span class="p">,</span> <span class="n">explanatory</span><span class="o">=</span><span class="n">explanatory</span><span class="p">,</span> <span class="n">formula</span><span class="o">=</span><span class="n">formula</span><span class="p">,</span> <span class="n">success</span><span class="o">=</span><span class="n">success</span>
<span class="p">)</span>


<span class="k">def</span><span class="w"> </span><span class="nf">register_dataframe_accessor</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Attach a ``.specify()`` method to polars and pandas DataFrames.</span>

<span class="sd"> Lets you write ``df.specify(response=&quot;y&quot;)`` — mirroring the R</span>
<span class="sd"> ``df %&gt;% specify(...)`` flow — instead of ``specify(df, response=&quot;y&quot;)``.</span>
<span class="sd"> Called once on import; skips a frame library that is not installed and never</span>
<span class="sd"> overwrites an existing ``specify`` attribute.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">polars</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pl</span>

<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">pl</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span> <span class="s2">&quot;specify&quot;</span><span class="p">):</span>
<span class="n">pl</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">specify</span> <span class="o">=</span> <span class="n">_dataframe_specify</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> <span class="c1"># pragma: no cover - pandas is a dependency, always present</span>
<span class="k">return</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">,</span> <span class="s2">&quot;specify&quot;</span><span class="p">):</span>
<span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="o">.</span><span class="n">specify</span> <span class="o">=</span> <span class="n">_dataframe_specify</span>
</pre></div>
</article>
</div>
Expand Down
Loading