create_notebooks.py 7.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. """Create the eight lightweight entry notebooks for the organized project."""
  2. from pathlib import Path
  3. import json
  4. ROOT = Path(__file__).resolve().parent
  5. def notebook(title, imports, analysis):
  6. def cell(kind, source):
  7. block = {"cell_type": kind, "metadata": {}, "source": source.splitlines(True)}
  8. if kind == "code":
  9. block.update({"execution_count": None, "outputs": []})
  10. return block
  11. setup = """from pathlib import Path
  12. import sys
  13. PROJECT_ROOT = Path.cwd().resolve()
  14. while not (PROJECT_ROOT / 'data.py').exists():
  15. if PROJECT_ROOT.parent == PROJECT_ROOT:
  16. raise FileNotFoundError('Open this notebook from inside organized_uncertainty_analysis.')
  17. PROJECT_ROOT = PROJECT_ROOT.parent
  18. if str(PROJECT_ROOT.parent) not in sys.path:
  19. sys.path.insert(0, str(PROJECT_ROOT.parent))
  20. """
  21. return {
  22. "cells": [
  23. cell("markdown", f"# {title}\n"),
  24. cell("code", setup + "\n" + imports),
  25. cell("code", analysis),
  26. ],
  27. "metadata": {
  28. "kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"},
  29. "language_info": {"name": "python", "version": "3"},
  30. },
  31. "nbformat": 4,
  32. "nbformat_minor": 5,
  33. }
  34. specs = {
  35. "logistic/notebooks/01_data_fit_gof.ipynb": (
  36. "Logistic regression: data, fitting, and goodness of fit",
  37. "from organized_uncertainty_analysis.logistic import data_fit_gof as fit\n",
  38. "import pandas as pd\ndata = fit.prepare_full_trim(PROJECT_ROOT)\nrows = []\nfor name, (x, y) in data.items():\n for transform in ('raw', 'log'):\n pack = fit.fit_logistic_x(x, y, transform=transform, l2=1e-8)\n x_model = x if transform == 'raw' else __import__('numpy').log(x)\n rows.append({'Dataset': name, 'Predictor': transform.upper(), **fit.goodness_of_fit(x_model, y, pack, l2=1e-8)})\ngof_table = pd.DataFrame(rows)\ngof_table.to_csv(PROJECT_ROOT / 'outputs' / 'logistic_goodness_of_fit.csv', index=False)\ngof_table\n",
  39. ),
  40. "logistic/notebooks/02_ci_estimation.ipynb": (
  41. "Logistic regression: confidence intervals and bands",
  42. "from organized_uncertainty_analysis.logistic.data_fit_gof import prepare_full_trim\nfrom organized_uncertainty_analysis.logistic import ci_estimation as ci\n",
  43. "B = 5000\ndata = prepare_full_trim(PROJECT_ROOT)\nP = {}\nfor dataset, (x, y) in data.items():\n for transform in ('raw', 'log'):\n key = f'{dataset}-{transform.upper()}'\n P[key] = ci.fit_ci_pack_rawgrid(x, y, transform=transform, name=key, l2=1e-8, B=B, seed=123)\nsummary = ci.param_ci_table_4methods(P)\nsummary.to_csv(PROJECT_ROOT / 'outputs' / 'logistic_parameter_ci.csv', index=False)\nfig, axes = ci.plot_ci_four_panels(P)\nfig.savefig(PROJECT_ROOT / 'outputs' / 'logistic_ci_bands.png', dpi=300, bbox_inches='tight')\nfig.savefig(PROJECT_ROOT / 'outputs' / 'logistic_ci_bands.pdf', bbox_inches='tight')\nsummary\n",
  44. ),
  45. "logistic/notebooks/03_elasticity.ipynb": (
  46. "Logistic regression: elasticity",
  47. "import numpy as np\nfrom organized_uncertainty_analysis.logistic.data_fit_gof import prepare_full_trim, fit_logistic_x\nfrom organized_uncertainty_analysis.logistic import elasticity as el\n",
  48. "data = prepare_full_trim(PROJECT_ROOT)\nP = {}\nfor dataset, (x, y) in data.items():\n for transform in ('raw', 'log'):\n key = f'{dataset}-{transform.upper()}'\n P[key] = {'b': fit_logistic_x(x, y, transform=transform, l2=1e-8), 'transform': transform}\nelasticity_table = el.elasticity_table_4panels(P, make_plots=False)\nelasticity_table.to_csv(PROJECT_ROOT / 'outputs' / 'logistic_elasticity.csv', index=False)\nfig, axes = el.plot_combined_elasticity(elasticity_table)\nfig.savefig(PROJECT_ROOT / 'outputs' / 'logistic_elasticity.png', dpi=600, bbox_inches='tight')\nfig.savefig(PROJECT_ROOT / 'outputs' / 'logistic_elasticity.pdf', bbox_inches='tight')\nelasticity_table\n",
  49. ),
  50. "logistic/notebooks/04_noise_measurement.ipynb": (
  51. "Logistic regression: measurement noise",
  52. "from organized_uncertainty_analysis.logistic.data_fit_gof import prepare_full_trim\nfrom organized_uncertainty_analysis.logistic import noise_measurement as noise\n",
  53. "data = prepare_full_trim(PROJECT_ROOT)\nfig, axes, full_noise, trim_noise = noise.make_noise_figure(*data['FULL'], *data['TRIM'], transform='raw', n_refit=1100, n_tta=10000, save_path=PROJECT_ROOT / 'outputs' / 'logistic_noise')\n",
  54. ),
  55. "bayesian/notebooks/01_data_fit_gof.ipynb": (
  56. "Constrained Bayesian model: data, fitting, and goodness of fit",
  57. "import os\nos.chdir(PROJECT_ROOT)\nfrom organized_uncertainty_analysis.bayesian import data_fit_gof as fit\n",
  58. "import pandas as pd\nfit_result = fit.fit_full_trim(seed=123)\ngof_table = pd.DataFrame([{'Dataset': name, **fit_result[name]['gof']} for name in ('FULL', 'TRIM')])\ngof_table.to_csv(PROJECT_ROOT / 'outputs' / 'bayesian_goodness_of_fit.csv', index=False)\ngof_table\n",
  59. ),
  60. "bayesian/notebooks/02_ci_estimation.ipynb": (
  61. "Constrained Bayesian model: confidence intervals and bands",
  62. "import os\nos.chdir(PROJECT_ROOT)\nfrom organized_uncertainty_analysis.bayesian import ci_estimation as ci\n",
  63. "ci_result = ci.run_bayesian_ci(B_nonpar=400, B_param=400, M_mca=10000, max_hessian_condition=1e6)\nparameter_table = ci.make_parameter_ci_table(ci_result)\nderived_table = ci.make_derived_ci_table(ci_result)\nparameter_table.to_csv(PROJECT_ROOT / 'outputs' / 'bayesian_parameter_ci.csv', index=False)\nderived_table.to_csv(PROJECT_ROOT / 'outputs' / 'bayesian_x50_s50_ci.csv', index=False)\nfig, axes = ci.plot_bayesian_ci(ci_result, band_support='observed')\nfig.savefig(PROJECT_ROOT / 'outputs' / 'bayesian_ci_bands.png', dpi=300, bbox_inches='tight')\nfig.savefig(PROJECT_ROOT / 'outputs' / 'bayesian_ci_bands.pdf', bbox_inches='tight')\nparameter_table, derived_table\n",
  64. ),
  65. "bayesian/notebooks/03_elasticity.ipynb": (
  66. "Constrained Bayesian model: elasticity",
  67. "import os\nos.chdir(PROJECT_ROOT)\nfrom organized_uncertainty_analysis.bayesian.data_fit_gof import fit_full_trim\nfrom organized_uncertainty_analysis.bayesian import elasticity as el\n",
  68. "fit_result = fit_full_trim(seed=123)\nelasticity_table = el.elasticity_full_trim(fit_result)\nelasticity_table.to_csv(PROJECT_ROOT / 'outputs' / 'bayesian_elasticity.csv', index=False)\nfig, axes = el.plot_combined_elasticity(elasticity_table)\nfig.savefig(PROJECT_ROOT / 'outputs' / 'bayesian_elasticity.png', dpi=600, bbox_inches='tight')\nfig.savefig(PROJECT_ROOT / 'outputs' / 'bayesian_elasticity.pdf', bbox_inches='tight')\nelasticity_table\n",
  69. ),
  70. "bayesian/notebooks/04_noise_measurement.ipynb": (
  71. "Constrained Bayesian model: measurement noise",
  72. "import os\nos.chdir(PROJECT_ROOT)\nfrom organized_uncertainty_analysis.bayesian import noise_measurement as noise\n",
  73. "noise_result = noise.run_noise_analysis(n_refit=150, n_tta=300, seed=1234)\nsummary = noise.make_noise_summary_table(noise_result)\nfig, axes = noise.plot_4panels(noise_result['full'], noise_result['trim'], save_prefix=PROJECT_ROOT / 'outputs' / 'bayesian_noise')\nsummary\n",
  74. ),
  75. }
  76. for relative_path, args in specs.items():
  77. path = ROOT / relative_path
  78. path.parent.mkdir(parents=True, exist_ok=True)
  79. path.write_text(json.dumps(notebook(*args), indent=1), encoding="utf-8")
  80. print(path.relative_to(ROOT))