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
2 changes: 1 addition & 1 deletion docs/examples/action_timeline.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion docs/examples/baseline_drift.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@
</style>
<div class="fd-report"><h2>freshdata drift report — baseline</h2><div class="fd-meta">FAIL · 1 error(s), 1 warning(s) · baseline v1.0.0</div><div class="fd-cards"><div class="fd-card"><div class="v">FAIL</div><div class="l">verdict</div></div><div class="fd-card"><div class="v">1</div><div class="l">errors</div></div><div class="fd-card"><div class="v">1</div><div class="l">warnings</div></div></div>
<h3>What likely matters</h3><ul><li>50 new record(s) since the baseline.</li></ul>
<h3>Findings</h3><div class="fd-controls"><input data-col="1" placeholder="filter column…" oninput="fdFilter_fd-drift()"></div><table class="fd-table" id="fd-drift"><thead><tr><th>check</th><th>column</th><th>status</th><th>message</th></tr></thead><tbody><tr><td>drift.ks</td><td>customer_id</td><td><span class="fd-badge" style="background:#9a6700">medium</span></td><td>KS 0.244 &gt;= warn threshold 0.1</td></tr><tr><td>drift.psi</td><td>customer_id</td><td><span class="fd-badge" style="background:#cf222e">high</span></td><td>PSI 0.877 &gt;= fail threshold 0.25</td></tr></tbody></table><script>function fdFilter_fd-drift(){var t=document.getElementById('fd-drift');var inp=t.parentNode.querySelectorAll('.fd-controls input');var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;inp.forEach(function(b){var c=+b.dataset.col,q=b.value.toLowerCase();if(q&&rows[i].cells[c].innerText.toLowerCase().indexOf(q)<0)show=false;});rows[i].style.display=show?'':'none';}}</script>
<h3>Findings</h3><div class="fd-controls"><input data-col="1" placeholder="filter column…"></div><table class="fd-table" id="fd-drift"><thead><tr><th>check</th><th>column</th><th>status</th><th>message</th></tr></thead><tbody><tr><td>drift.ks</td><td>customer_id</td><td><span class="fd-badge" style="background:#9a6700">medium</span></td><td>KS 0.244 &gt;= warn threshold 0.1</td></tr><tr><td>drift.psi</td><td>customer_id</td><td><span class="fd-badge" style="background:#cf222e">high</span></td><td>PSI 0.877 &gt;= fail threshold 0.25</td></tr></tbody></table><script>(function(){var s=document.currentScript;if(!s)return;var t=s.previousElementSibling;if(!t||t.tagName!=='TABLE'||!t.tBodies.length)return;var c=t.previousElementSibling;if(!c||(' '+c.className+' ').indexOf(' fd-controls ')<0)return;var inp=c.querySelectorAll('input[data-col]');function run(){var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;for(var j=0;j<inp.length;j++){var q=inp[j].value.toLowerCase();if(!q)continue;var cell=rows[i].cells[+inp[j].getAttribute('data-col')];if(!cell||(cell.textContent||'').toLowerCase().indexOf(q)<0){show=false;break;}}rows[i].style.display=show?'':'none';}}for(var k=0;k<inp.length;k++){inp[k].addEventListener('input',run);}})();</script>
<a download="drift_report.json" href="data:application/json;base64,ewogICJiYXNlbGluZV9uYW1lIjogImJhc2VsaW5lIiwKICAiYmFzZWxpbmVfdmVyc2lvbiI6ICIxLjAuMCIsCiAgInBhc3NlZCI6IGZhbHNlLAogICJuX2ZpbmRpbmdzIjogMiwKICAibl9lcnJvcnMiOiAxLAogICJuX3dhcm5pbmdzIjogMSwKICAidHJ1c3Rfc2NvcmUiOiBudWxsLAogICJmaW5kaW5ncyI6IFsKICAgIHsKICAgICAgImNoZWNrX2lkIjogImRyaWZ0LmtzIiwKICAgICAgImxldmVsIjogIndhcm5pbmciLAogICAgICAic3RhdHVzIjogIndhcm5lZCIsCiAgICAgICJjb2x1bW4iOiAiY3VzdG9tZXJfaWQiLAogICAgICAibWVzc2FnZSI6ICJLUyAwLjI0NCA+PSB3YXJuIHRocmVzaG9sZCAwLjEiLAogICAgICAiYmFzZWxpbmVfdmFsdWUiOiBudWxsLAogICAgICAiY3VycmVudF92YWx1ZSI6IDAuMjQzOTAyLAogICAgICAibWV0cmljIjogImtzIiwKICAgICAgInRocmVzaG9sZCI6IDAuMSwKICAgICAgImRldGFpbHMiOiB7fQogICAgfSwKICAgIHsKICAgICAgImNoZWNrX2lkIjogImRyaWZ0LnBzaSIsCiAgICAgICJsZXZlbCI6ICJlcnJvciIsCiAgICAgICJzdGF0dXMiOiAiZmFpbGVkIiwKICAgICAgImNvbHVtbiI6ICJjdXN0b21lcl9pZCIsCiAgICAgICJtZXNzYWdlIjogIlBTSSAwLjg3NyA+PSBmYWlsIHRocmVzaG9sZCAwLjI1IiwKICAgICAgImJhc2VsaW5lX3ZhbHVlIjogbnVsbCwKICAgICAgImN1cnJlbnRfdmFsdWUiOiAwLjg3NjczNywKICAgICAgIm1ldHJpYyI6ICJwc2kiLAogICAgICAidGhyZXNob2xkIjogMC4yNSwKICAgICAgImRldGFpbHMiOiB7fQogICAgfQogIF0sCiAgImRpc3RyaWJ1dGlvbl9kcmlmdCI6IHsKICAgICJjdXN0b21lcl9pZCI6IHsKICAgICAgImtzIjogMC4yNDM5MDIsCiAgICAgICJwc2kiOiAwLjg3NjczNywKICAgICAgInJhbmdlIjogewogICAgICAgICJiYXNlbGluZSI6IFsKICAgICAgICAgIDEuMCwKICAgICAgICAgIDE1MC4wCiAgICAgICAgXQogICAgICB9CiAgICB9LAogICAgInJldmVudWUiOiB7CiAgICAgICJrcyI6IDAuMDM2NTg1LAogICAgICAicHNpIjogMC4wMjk4NTUsCiAgICAgICJyYW5nZSI6IHsKICAgICAgICAiYmFzZWxpbmUiOiBbCiAgICAgICAgICA0MDguNjcsCiAgICAgICAgICAxMTAwMDAwLjAKICAgICAgICBdCiAgICAgIH0KICAgIH0sCiAgICAidGllciI6IHsKICAgICAgInBzaSI6IDAuMDA0NzU3CiAgICB9CiAgfSwKICAiY29udHJhY3RfcmVzdWx0cyI6IHt9LAogICJrZXlfY2hhbmdlcyI6IHsKICAgICJrZXkiOiBbCiAgICAgICJjdXN0b21lcl9pZCIKICAgIF0sCiAgICAiYmFzZWxpbmVfcmVjb3JkcyI6IDE1MCwKICAgICJjdXJyZW50X3JlY29yZHMiOiAyMDAsCiAgICAiYWRkZWQiOiA1MCwKICAgICJyZW1vdmVkIjogMCwKICAgICJjaGFuZ2VkIjogMCwKICAgICJ1bmNoYW5nZWQiOiAxNTAKICB9Cn0=" style="font-size:.8rem;margin-right:.6rem">⬇ JSON</a></div>
2 changes: 1 addition & 1 deletion docs/examples/compare_plans_grid.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,4 @@
.fd-del-pos{color:#1a7f37}.fd-del-neg{color:#cf222e}
.fd-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.8rem}
</style>
<div class="fd-report"><h2>freshdata strategy comparison</h2><div class="fd-meta">strategy diff grid</div><div class="fd-controls"><input data-col="0" placeholder="filter column…" oninput="fdFilter_fd-cmp-plans()"><input data-col="1" placeholder="filter strategy…" oninput="fdFilter_fd-cmp-plans()"></div><table class="fd-table" id="fd-cmp-plans"><thead><tr><th>column</th><th>strategy</th><th>missing_model</th><th>outlier_action</th><th>n_outliers</th></tr></thead><tbody><tr><td>email</td><td>balanced</td><td>preserve</td><td></td><td>0</td></tr><tr><td>revenue</td><td>balanced</td><td></td><td></td><td>5</td></tr><tr><td>tier</td><td>balanced</td><td>sentinel</td><td></td><td>0</td></tr><tr><td>email</td><td>aggressive</td><td>preserve</td><td></td><td>0</td></tr><tr><td>revenue</td><td>aggressive</td><td></td><td></td><td>5</td></tr><tr><td>tier</td><td>aggressive</td><td>sentinel</td><td></td><td>0</td></tr></tbody></table><script>function fdFilter_fd-cmp-plans(){var t=document.getElementById('fd-cmp-plans');var inp=t.parentNode.querySelectorAll('.fd-controls input');var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;inp.forEach(function(b){var c=+b.dataset.col,q=b.value.toLowerCase();if(q&&rows[i].cells[c].innerText.toLowerCase().indexOf(q)<0)show=false;});rows[i].style.display=show?'':'none';}}</script></div>
<div class="fd-report"><h2>freshdata strategy comparison</h2><div class="fd-meta">strategy diff grid</div><div class="fd-controls"><input data-col="0" placeholder="filter column…"><input data-col="1" placeholder="filter strategy…"></div><table class="fd-table" id="fd-cmp-plans"><thead><tr><th>column</th><th>strategy</th><th>missing_model</th><th>outlier_action</th><th>n_outliers</th></tr></thead><tbody><tr><td>email</td><td>balanced</td><td>preserve</td><td></td><td>0</td></tr><tr><td>revenue</td><td>balanced</td><td></td><td></td><td>5</td></tr><tr><td>tier</td><td>balanced</td><td>sentinel</td><td></td><td>0</td></tr><tr><td>email</td><td>aggressive</td><td>preserve</td><td></td><td>0</td></tr><tr><td>revenue</td><td>aggressive</td><td></td><td></td><td>5</td></tr><tr><td>tier</td><td>aggressive</td><td>sentinel</td><td></td><td>0</td></tr></tbody></table><script>(function(){var s=document.currentScript;if(!s)return;var t=s.previousElementSibling;if(!t||t.tagName!=='TABLE'||!t.tBodies.length)return;var c=t.previousElementSibling;if(!c||(' '+c.className+' ').indexOf(' fd-controls ')<0)return;var inp=c.querySelectorAll('input[data-col]');function run(){var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;for(var j=0;j<inp.length;j++){var q=inp[j].value.toLowerCase();if(!q)continue;var cell=rows[i].cells[+inp[j].getAttribute('data-col')];if(!cell||(cell.textContent||'').toLowerCase().indexOf(q)<0){show=false;break;}}rows[i].style.display=show?'':'none';}}for(var k=0;k<inp.length;k++){inp[k].addEventListener('input',run);}})();</script></div>
2 changes: 1 addition & 1 deletion docs/examples/profile_cockpit.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
</style>
<div class="fd-report"><h2>freshdata profile</h2><div class="fd-meta">inline quality cockpit</div><div class="fd-cards"><div class="fd-card"><div class="v">82/100</div><div class="l">quality score</div></div><div class="fd-card"><div class="v">205</div><div class="l">rows</div></div><div class="fd-card"><div class="v">5</div><div class="l">columns</div></div><div class="fd-card"><div class="v">7.4%</div><div class="l">missing</div></div><div class="fd-card"><div class="v">5</div><div class="l">duplicate rows</div></div><div class="fd-card"><div class="v">4</div><div class="l">issues</div></div></div>
<h3>Type inference</h3><ul><li class='fd-mono'>signup_date: object → datetime64[ns]</li></ul>
<h3>Columns (issue-ranked)</h3><div class="fd-controls"><input data-col="0" placeholder="filter column…" oninput="fdFilter_fd-profile-cols()"><input data-col="4" placeholder="filter issues…" oninput="fdFilter_fd-profile-cols()"></div><table class="fd-table" id="fd-profile-cols"><thead><tr><th>column</th><th>dtype</th><th>missing</th><th>unique</th><th>issues</th></tr></thead><tbody><tr><td>tier</td><td>object</td><td><div class="fd-bar"><span style="width:25%;background:#cf222e"></span></div> 25%</td><td>3</td><td>25.4% missing</td></tr><tr><td>email</td><td>object</td><td><div class="fd-bar"><span style="width:12%;background:#cf222e"></span></div> 12%</td><td>177</td><td>11.7% missing</td></tr><tr><td>revenue</td><td>float64</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>199</td><td>7 potential outlier(s) (iqr)</td></tr><tr><td>signup_date</td><td>object</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>200</td><td>would convert to datetime64[ns]</td></tr><tr><td>customer_id</td><td>int64</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>200</td><td>—</td></tr></tbody></table><script>function fdFilter_fd-profile-cols(){var t=document.getElementById('fd-profile-cols');var inp=t.parentNode.querySelectorAll('.fd-controls input');var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;inp.forEach(function(b){var c=+b.dataset.col,q=b.value.toLowerCase();if(q&&rows[i].cells[c].innerText.toLowerCase().indexOf(q)<0)show=false;});rows[i].style.display=show?'':'none';}}</script>
<h3>Columns (issue-ranked)</h3><div class="fd-controls"><input data-col="0" placeholder="filter column…"><input data-col="4" placeholder="filter issues…"></div><table class="fd-table" id="fd-profile-cols"><thead><tr><th>column</th><th>dtype</th><th>missing</th><th>unique</th><th>issues</th></tr></thead><tbody><tr><td>tier</td><td>object</td><td><div class="fd-bar"><span style="width:25%;background:#cf222e"></span></div> 25%</td><td>3</td><td>25.4% missing</td></tr><tr><td>email</td><td>object</td><td><div class="fd-bar"><span style="width:12%;background:#cf222e"></span></div> 12%</td><td>177</td><td>11.7% missing</td></tr><tr><td>revenue</td><td>float64</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>199</td><td>7 potential outlier(s) (iqr)</td></tr><tr><td>signup_date</td><td>object</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>200</td><td>would convert to datetime64[ns]</td></tr><tr><td>customer_id</td><td>int64</td><td><div class="fd-bar"><span style="width:0%;background:#cf222e"></span></div> 0%</td><td>200</td><td>—</td></tr></tbody></table><script>(function(){var s=document.currentScript;if(!s)return;var t=s.previousElementSibling;if(!t||t.tagName!=='TABLE'||!t.tBodies.length)return;var c=t.previousElementSibling;if(!c||(' '+c.className+' ').indexOf(' fd-controls ')<0)return;var inp=c.querySelectorAll('input[data-col]');function run(){var rows=t.tBodies[0].rows;for(var i=0;i<rows.length;i++){var show=true;for(var j=0;j<inp.length;j++){var q=inp[j].value.toLowerCase();if(!q)continue;var cell=rows[i].cells[+inp[j].getAttribute('data-col')];if(!cell||(cell.textContent||'').toLowerCase().indexOf(q)<0){show=false;break;}}rows[i].style.display=show?'':'none';}}for(var k=0;k<inp.length;k++){inp[k].addEventListener('input',run);}})();</script>
<h3>Outlier warnings</h3><div>revenue</div>
<h3>Correlations</h3><div class='fd-meta'>Numeric correlations are computed on demand to keep this view fast. Call <span class='fd-mono'>profile.to_frame()</span> or compute <span class='fd-mono'>df.corr()</span> when you need them.</div>
<a download="profile.json" href="data:application/json;base64,ewogICJuX3Jvd3MiOiAyMDUsCiAgIm5fY29scyI6IDUsCiAgIm1lbW9yeV9ieXRlcyI6IDM3ODQyLAogICJkdXBsaWNhdGVfcm93cyI6IDUsCiAgIm1pc3NpbmdfY2VsbHMiOiA3NiwKICAibWlzc2luZ19wY3QiOiA3LjQxNDYzNDE0NjM0MTQ2NCwKICAiY29sdW1ucyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VzdG9tZXJfaWQiLAogICAgICAiZHR5cGUiOiAiaW50NjQiLAogICAgICAibm9uX251bGwiOiAyMDUsCiAgICAgICJtaXNzaW5nIjogMCwKICAgICAgIm1pc3NpbmdfcGN0IjogMC4wLAogICAgICAidW5pcXVlIjogMjAwLAogICAgICAic2FtcGxlX3ZhbHVlcyI6IFsKICAgICAgICAxLAogICAgICAgIDIsCiAgICAgICAgMwogICAgICBdLAogICAgICAic3VnZ2VzdGVkX2R0eXBlIjogbnVsbCwKICAgICAgImlzc3VlcyI6IFtdCiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJlbWFpbCIsCiAgICAgICJkdHlwZSI6ICJvYmplY3QiLAogICAgICAibm9uX251bGwiOiAxODEsCiAgICAgICJtaXNzaW5nIjogMjQsCiAgICAgICJtaXNzaW5nX3BjdCI6IDExLjcwNzMxNzA3MzE3MDczMSwKICAgICAgInVuaXF1ZSI6IDE3NywKICAgICAgInNhbXBsZV92YWx1ZXMiOiBbCiAgICAgICAgInVzZXIxQGV4YW1wbGUuY29tIiwKICAgICAgICAidXNlcjJAZXhhbXBsZS5jb20iLAogICAgICAgICJ1c2VyM0BleGFtcGxlLmNvbSIKICAgICAgXSwKICAgICAgInN1Z2dlc3RlZF9kdHlwZSI6IG51bGwsCiAgICAgICJpc3N1ZXMiOiBbCiAgICAgICAgIjExLjclIG1pc3NpbmciCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJuYW1lIjogInJldmVudWUiLAogICAgICAiZHR5cGUiOiAiZmxvYXQ2NCIsCiAgICAgICJub25fbnVsbCI6IDIwNSwKICAgICAgIm1pc3NpbmciOiAwLAogICAgICAibWlzc2luZ19wY3QiOiAwLjAsCiAgICAgICJ1bmlxdWUiOiAxOTksCiAgICAgICJzYW1wbGVfdmFsdWVzIjogWwogICAgICAgIDEwMzEuNDMsCiAgICAgICAgOTY2Ljk3LAogICAgICAgIDExNjAuMTEKICAgICAgXSwKICAgICAgInN1Z2dlc3RlZF9kdHlwZSI6IG51bGwsCiAgICAgICJpc3N1ZXMiOiBbCiAgICAgICAgIjcgcG90ZW50aWFsIG91dGxpZXIocykgKGlxcikiCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJuYW1lIjogInNpZ251cF9kYXRlIiwKICAgICAgImR0eXBlIjogIm9iamVjdCIsCiAgICAgICJub25fbnVsbCI6IDIwNSwKICAgICAgIm1pc3NpbmciOiAwLAogICAgICAibWlzc2luZ19wY3QiOiAwLjAsCiAgICAgICJ1bmlxdWUiOiAyMDAsCiAgICAgICJzYW1wbGVfdmFsdWVzIjogWwogICAgICAgICIyMDI1LTAxLTAxIiwKICAgICAgICAiMjAyNS0wMS0wMiIsCiAgICAgICAgIjIwMjUtMDEtMDMiCiAgICAgIF0sCiAgICAgICJzdWdnZXN0ZWRfZHR5cGUiOiAiZGF0ZXRpbWU2NFtuc10iLAogICAgICAiaXNzdWVzIjogWwogICAgICAgICJ3b3VsZCBjb252ZXJ0IHRvIGRhdGV0aW1lNjRbbnNdIgogICAgICBdCiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJ0aWVyIiwKICAgICAgImR0eXBlIjogIm9iamVjdCIsCiAgICAgICJub25fbnVsbCI6IDE1MywKICAgICAgIm1pc3NpbmciOiA1MiwKICAgICAgIm1pc3NpbmdfcGN0IjogMjUuMzY1ODUzNjU4NTM2NTg3LAogICAgICAidW5pcXVlIjogMywKICAgICAgInNhbXBsZV92YWx1ZXMiOiBbCiAgICAgICAgImdvbGQiLAogICAgICAgICJicm9uemUiLAogICAgICAgICJzaWx2ZXIiCiAgICAgIF0sCiAgICAgICJzdWdnZXN0ZWRfZHR5cGUiOiBudWxsLAogICAgICAiaXNzdWVzIjogWwogICAgICAgICIyNS40JSBtaXNzaW5nIgogICAgICBdCiAgICB9CiAgXQp9" style="font-size:.8rem;margin-right:.6rem">⬇ JSON</a></div>
Loading
Loading