solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of solarwindpy might be problematic. Click here for more details.

Files changed (412) hide show
  1. plans/.velocity/metrics.json +96 -0
  2. plans/0-overview-template.md +268 -0
  3. plans/N-phase-template.md +106 -0
  4. plans/PLAN_AUDIT_SUMMARY.md +173 -0
  5. plans/TEMPLATE-USAGE-GUIDE.md +198 -0
  6. plans/__init__.py +1 -0
  7. plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
  8. plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
  9. plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
  10. plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
  11. plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
  12. plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
  13. plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
  14. plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
  15. plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
  16. plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
  17. plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
  18. plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
  19. plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
  20. plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
  21. plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
  22. plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
  23. plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
  24. plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
  25. plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
  26. plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
  27. plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
  28. plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
  29. plans/cicd-architecture-redesign/0-Overview.md +193 -0
  30. plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
  31. plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
  32. plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
  33. plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
  34. plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
  35. plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
  36. plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
  37. plans/cicd-architecture-redesign/8-Documentation.md +285 -0
  38. plans/cicd-architecture-redesign/Closeout.md +225 -0
  39. plans/closeout-template.md +259 -0
  40. plans/completed/circular-import-audit/0-Overview.md +152 -0
  41. plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
  42. plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
  43. plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
  44. plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
  45. plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
  46. plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
  47. plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
  48. plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
  49. plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
  50. plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
  51. plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
  52. plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
  53. plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
  54. plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
  55. plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
  56. plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
  57. plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
  58. plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
  59. plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
  60. plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
  61. plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
  62. plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
  63. plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
  64. plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
  65. plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
  66. plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
  67. plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
  68. plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
  69. plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
  70. plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
  71. plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
  72. plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
  73. plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
  74. plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
  75. plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
  76. plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
  77. plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
  78. plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
  79. plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
  80. plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
  81. plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
  82. plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
  83. plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
  84. plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
  85. plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
  86. plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
  87. plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
  88. plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
  89. plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
  90. plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
  91. plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
  92. plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
  93. plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
  94. plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
  95. plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
  96. plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
  97. plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
  98. plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
  99. plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
  100. plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
  101. plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
  102. plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
  103. plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
  104. plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
  105. plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
  106. plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
  107. plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
  108. plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
  109. plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
  110. plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
  111. plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
  112. plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
  113. plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
  114. plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
  115. plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
  116. plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
  117. plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
  118. plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
  119. plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
  120. plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
  121. plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
  122. plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
  123. plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
  124. plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
  125. plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
  126. plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
  127. plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
  128. plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
  129. plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
  130. plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
  131. plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
  132. plans/completed/pr-review-remediation/0-Overview.md +138 -0
  133. plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
  134. plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
  135. plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
  136. plans/completed/pr-review-remediation/compacted_state.md +66 -0
  137. plans/completed/python-310-migration/0-Overview.md +390 -0
  138. plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
  139. plans/completed/python-310-migration/2-Implementation.md +256 -0
  140. plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
  141. plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
  142. plans/completed/python-310-migration/5-Closeout.md +252 -0
  143. plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
  144. plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
  145. plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
  146. plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
  147. plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
  148. plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
  149. plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
  150. plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
  151. plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
  152. plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
  153. plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
  154. plans/completed/test-directory-consolidation/0-Overview.md +51 -0
  155. plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
  156. plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
  157. plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
  158. plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
  159. plans/completed/test-directory-consolidation/5-Validation.md +152 -0
  160. plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
  161. plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
  162. plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
  163. plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
  164. plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
  165. plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
  166. plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
  167. plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
  168. plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
  169. plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
  170. plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
  171. plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
  172. plans/documentation-code-audit/0-Overview.md +393 -0
  173. plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
  174. plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
  175. plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
  176. plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
  177. plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
  178. plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
  179. plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
  180. plans/documentation-code-audit/8-Closeout.md +456 -0
  181. plans/documentation-rebuild-session/compacted_state.md +109 -0
  182. plans/documentation-rendering-fixes/0-Overview.md +104 -0
  183. plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
  184. plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
  185. plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
  186. plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
  187. plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
  188. plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
  189. plans/documentation-rendering-fixes/compacted_state.md +132 -0
  190. plans/documentation-template-fix/0-Overview.md +197 -0
  191. plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
  192. plans/documentation-template-fix/2-Template-Modification.md +609 -0
  193. plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
  194. plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
  195. plans/documentation-template-fix/5-Documentation-Training.md +602 -0
  196. plans/documentation-workflow-fix/0-Overview.md +222 -0
  197. plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
  198. plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
  199. plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
  200. plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
  201. plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
  202. plans/duplicate-object-warnings-fix-plan.md +130 -0
  203. plans/github-issues-migration/0-Overview.md +510 -0
  204. plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
  205. plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
  206. plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
  207. plans/github-issues-migration/4-Validated-Migration.md +252 -0
  208. plans/github-issues-migration/5-Documentation-Training.md +171 -0
  209. plans/github-issues-migration/6-Closeout.md +179 -0
  210. plans/github-workflows-repair/repair-plan.md +299 -0
  211. plans/issues_from_plans.py +342 -0
  212. plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
  213. plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
  214. plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
  215. plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
  216. plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
  217. plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
  218. plans/python-310-migration/0-Overview.md +390 -0
  219. plans/python-310-migration/1-Planning-Setup.md +164 -0
  220. plans/python-310-migration/2-Implementation.md +256 -0
  221. plans/python-310-migration/3-Testing-Validation.md +335 -0
  222. plans/python-310-migration/4-Documentation-Release.md +274 -0
  223. plans/python-310-migration/5-Closeout.md +252 -0
  224. plans/readthedocs-simplified/0-Overview.md +243 -0
  225. plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
  226. plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
  227. plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
  228. plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
  229. plans/readthedocs-simplified/5-Closeout.md +231 -0
  230. plans/readthedocs-simplified/compacted_state.md +127 -0
  231. plans/session-compaction-2025-08-12/compacted_state.md +114 -0
  232. plans/session-compaction-2025-08-13/compacted_state.md +145 -0
  233. plans/session-continuity-protocol/0-Overview.md +35 -0
  234. plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
  235. plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
  236. plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
  237. plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
  238. plans/sphinx-warnings-analysis.md +222 -0
  239. plans/systemprompt-optimization/0-Overview.md +447 -0
  240. plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
  241. plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
  242. plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
  243. plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
  244. plans/systemprompt-optimization/9-Closeout.md +165 -0
  245. plans/systemprompt-optimization/compacted_state.md +143 -0
  246. plans/template-value-propositions/0-Overview.md +357 -0
  247. plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
  248. plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
  249. plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
  250. plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
  251. plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
  252. plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
  253. plans/tests-audit/0-Overview.md +410 -0
  254. plans/tests-audit/1-Discovery-Inventory.md +170 -0
  255. plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
  256. plans/tests-audit/3-Architecture-Compliance.md +195 -0
  257. plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
  258. plans/tests-audit/5-Documentation-Enhancement.md +220 -0
  259. plans/tests-audit/6-Audit-Deliverables.md +220 -0
  260. plans/tests-audit/7-Closeout.md +252 -0
  261. plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
  262. plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
  263. plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
  264. plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
  265. plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
  266. plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
  267. plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
  268. plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
  269. plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
  270. plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
  271. plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
  272. plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
  273. plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
  274. plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
  275. plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
  276. plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
  277. plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
  278. plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
  279. plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
  280. plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
  281. plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
  282. plans/tests-audit/artifacts/test_parser.py +395 -0
  283. solarwindpy/README.md +3 -0
  284. solarwindpy/Untitled.ipynb +54 -0
  285. solarwindpy/__init__.py +74 -0
  286. solarwindpy/core/__init__.py +23 -0
  287. solarwindpy/core/alfvenic_turbulence.py +804 -0
  288. solarwindpy/core/base.py +267 -0
  289. solarwindpy/core/ions.py +309 -0
  290. solarwindpy/core/plasma.py +2133 -0
  291. solarwindpy/core/spacecraft.py +256 -0
  292. solarwindpy/core/tensor.py +90 -0
  293. solarwindpy/core/units_constants.py +199 -0
  294. solarwindpy/core/vector.py +328 -0
  295. solarwindpy/fitfunctions/__init__.py +20 -0
  296. solarwindpy/fitfunctions/core.py +734 -0
  297. solarwindpy/fitfunctions/exponentials.py +188 -0
  298. solarwindpy/fitfunctions/gaussians.py +264 -0
  299. solarwindpy/fitfunctions/lines.py +116 -0
  300. solarwindpy/fitfunctions/moyal.py +71 -0
  301. solarwindpy/fitfunctions/plots.py +751 -0
  302. solarwindpy/fitfunctions/power_laws.py +209 -0
  303. solarwindpy/fitfunctions/tex_info.py +568 -0
  304. solarwindpy/fitfunctions/trend_fits.py +482 -0
  305. solarwindpy/instabilities/__init__.py +16 -0
  306. solarwindpy/instabilities/beta_ani.py +82 -0
  307. solarwindpy/instabilities/verscharen2016.py +631 -0
  308. solarwindpy/plotting/__init__.py +33 -0
  309. solarwindpy/plotting/agg_plot.py +489 -0
  310. solarwindpy/plotting/base.py +465 -0
  311. solarwindpy/plotting/hist1d.py +405 -0
  312. solarwindpy/plotting/hist2d.py +1035 -0
  313. solarwindpy/plotting/histograms.py +1845 -0
  314. solarwindpy/plotting/labels/__init__.py +104 -0
  315. solarwindpy/plotting/labels/base.py +686 -0
  316. solarwindpy/plotting/labels/chemistry.py +19 -0
  317. solarwindpy/plotting/labels/composition.py +100 -0
  318. solarwindpy/plotting/labels/datetime.py +235 -0
  319. solarwindpy/plotting/labels/elemental_abundance.py +73 -0
  320. solarwindpy/plotting/labels/special.py +794 -0
  321. solarwindpy/plotting/orbits.py +515 -0
  322. solarwindpy/plotting/scatter.py +99 -0
  323. solarwindpy/plotting/select_data_from_figure.py +329 -0
  324. solarwindpy/plotting/spiral.py +980 -0
  325. solarwindpy/plotting/tools.py +434 -0
  326. solarwindpy/scripts/__init__.py +1 -0
  327. solarwindpy/scripts/logs/.gitignore +1 -0
  328. solarwindpy/solar_activity/__init__.py +53 -0
  329. solarwindpy/solar_activity/base.py +605 -0
  330. solarwindpy/solar_activity/lisird/__init__.py +3 -0
  331. solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
  332. solarwindpy/solar_activity/lisird/lisird.py +319 -0
  333. solarwindpy/solar_activity/plots.py +116 -0
  334. solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
  335. solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
  336. solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
  337. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
  338. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
  339. solarwindpy/tools/__init__.py +162 -0
  340. solarwindpy-0.1.1.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.1.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.1.dist-info/top_level.txt +3 -0
  345. tests/__init__.py +1 -0
  346. tests/conftest.py +10 -0
  347. tests/core/__init__.py +1 -0
  348. tests/core/test_alfvenic_turbulence.py +544 -0
  349. tests/core/test_base.py +112 -0
  350. tests/core/test_base_head_tail.py +29 -0
  351. tests/core/test_base_mi_tuples.py +11 -0
  352. tests/core/test_core_verify_datetimeindex.py +32 -0
  353. tests/core/test_ions.py +325 -0
  354. tests/core/test_plasma.py +2581 -0
  355. tests/core/test_plasma_io.py +12 -0
  356. tests/core/test_quantities.py +507 -0
  357. tests/core/test_spacecraft.py +210 -0
  358. tests/core/test_units_constants.py +22 -0
  359. tests/data/epoch.csv +4 -0
  360. tests/data/plasma.csv +4 -0
  361. tests/data/spacecraft.csv +4 -0
  362. tests/fitfunctions/conftest.py +60 -0
  363. tests/fitfunctions/test_core.py +193 -0
  364. tests/fitfunctions/test_exponentials.py +342 -0
  365. tests/fitfunctions/test_gaussians.py +142 -0
  366. tests/fitfunctions/test_lines.py +349 -0
  367. tests/fitfunctions/test_moyal.py +258 -0
  368. tests/fitfunctions/test_plots.py +258 -0
  369. tests/fitfunctions/test_power_laws.py +365 -0
  370. tests/fitfunctions/test_tex_info.py +183 -0
  371. tests/fitfunctions/test_trend_fit_properties.py +31 -0
  372. tests/fitfunctions/test_trend_fits.py +244 -0
  373. tests/plotting/__init__.py +1 -0
  374. tests/plotting/labels/__init__.py +1 -0
  375. tests/plotting/labels/test_chemistry.py +243 -0
  376. tests/plotting/labels/test_composition.py +345 -0
  377. tests/plotting/labels/test_datetime.py +445 -0
  378. tests/plotting/labels/test_elemental_abundance.py +366 -0
  379. tests/plotting/labels/test_init.py +66 -0
  380. tests/plotting/labels/test_labels_base.py +347 -0
  381. tests/plotting/labels/test_special.py +550 -0
  382. tests/plotting/test_agg_plot.py +602 -0
  383. tests/plotting/test_base.py +752 -0
  384. tests/plotting/test_fixtures_utilities.py +775 -0
  385. tests/plotting/test_histograms.py +546 -0
  386. tests/plotting/test_integration.py +675 -0
  387. tests/plotting/test_orbits.py +435 -0
  388. tests/plotting/test_performance.py +708 -0
  389. tests/plotting/test_scatter.py +752 -0
  390. tests/plotting/test_select_data_from_figure.py +1209 -0
  391. tests/plotting/test_spiral.py +573 -0
  392. tests/plotting/test_tools.py +607 -0
  393. tests/plotting/test_visual_validation.py +465 -0
  394. tests/solar_activity/__init__.py +1 -0
  395. tests/solar_activity/lisird/__init__.py +1 -0
  396. tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
  397. tests/solar_activity/lisird/test_lisird_id.py +187 -0
  398. tests/solar_activity/sunspot_number/__init__.py +1 -0
  399. tests/solar_activity/sunspot_number/test_init.py +399 -0
  400. tests/solar_activity/sunspot_number/test_sidc.py +465 -0
  401. tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
  402. tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
  403. tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
  404. tests/solar_activity/test_base.py +656 -0
  405. tests/solar_activity/test_init.py +396 -0
  406. tests/solar_activity/test_plots.py +371 -0
  407. tests/test_circular_imports.py +408 -0
  408. tests/test_issue_titles.py +25 -0
  409. tests/test_statusline.py +298 -0
  410. solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
  411. solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
  412. solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
@@ -0,0 +1,489 @@
1
+ #!/usr/bin/env python
2
+ r"""Abstract helpers for aggregated plotting.
3
+
4
+ These classes calculate bin edges, perform data aggregation, and provide
5
+ common functionality used by :mod:`solarwindpy` histogram plots.
6
+ """
7
+
8
+ import pdb # noqa: F401
9
+
10
+ import numpy as np
11
+ import pandas as pd
12
+
13
+ from numbers import Number
14
+ from abc import abstractproperty, abstractmethod
15
+
16
+ try:
17
+ from astropy.stats import knuth_bin_width
18
+ except ModuleNotFoundError:
19
+ pass
20
+
21
+ from . import base
22
+
23
+ # import os
24
+ # import psutil
25
+
26
+
27
+ # def log_mem_usage():
28
+ # usage = psutil.Process(os.getpid()).memory_info()
29
+ # usage = "\n".join(
30
+ # ["{} {:.3f} GB".format(k, v * 1e-9) for k, v in usage._asdict().items()]
31
+ # )
32
+ # logging.getLogger("main").warning("Memory usage\n%s", usage)
33
+
34
+
35
+ class AggPlot(base.Base):
36
+ r"""ABC for aggregating data in 1D and 2D.
37
+
38
+ Attributes
39
+ ----------
40
+ logger, data, bins, clip, cut, logx, labels.x, labels.y, clim, agg_axes
41
+ path, _gb_axes (abstract)
42
+
43
+ Methods
44
+ -------
45
+ set_<>:
46
+ Set property <>.
47
+
48
+ calc_bins, make_cut, agg, clip_data, make_plot
49
+ __init__, set_labels.y, set_path, set_data, _format_axis, make_plot (abstract)
50
+ """
51
+
52
+ @property
53
+ def edges(self):
54
+ return {k: v.left.union(v.right) for k, v in self.intervals.items()}
55
+
56
+ @property
57
+ def categoricals(self):
58
+ return dict(self._categoricals)
59
+
60
+ @property
61
+ def intervals(self):
62
+ # return dict(self._intervals)
63
+ return {k: pd.IntervalIndex(v) for k, v in self.categoricals.items()}
64
+
65
+ @property
66
+ def cut(self):
67
+ return self._cut
68
+
69
+ @property
70
+ def clim(self):
71
+ return self._clim
72
+
73
+ @property
74
+ def alim(self):
75
+ return self._alim
76
+
77
+ @property
78
+ def agg_axes(self):
79
+ r"""The axis to aggregate into, e.g. the z variable in an (x, y, z) heatmap."""
80
+ tko = [c for c in self.data.columns if c not in self._gb_axes]
81
+ assert len(tko) == 1
82
+ tko = tko[0]
83
+ return tko
84
+
85
+ @property
86
+ def joint(self):
87
+ r"""Combines the categorical and continuous data for `Groupby`."""
88
+ # cut = self.cut
89
+ # tko = self.agg_axes
90
+
91
+ # self.logger.debug(f"Joining data ({tko}) with cat ({cut.columns.values})")
92
+
93
+ # other = self.data.loc[cut.index, tko]
94
+
95
+ # # joint = pd.concat([cut, other.to_frame(name=tko)], axis=1, sort=True)
96
+ # joint = cut.copy(deep=True)
97
+ # joint.loc[:, tko] = other
98
+ # joint.sort_index(axis=1, inplace=True)
99
+ # return joint
100
+
101
+ cut = self.cut
102
+ tk_target = self.agg_axes
103
+ target = self.data.loc[cut.index, tk_target]
104
+
105
+ mi = pd.MultiIndex.from_frame(cut)
106
+ target.index = mi
107
+
108
+ return target
109
+
110
+ @property
111
+ def grouped(self):
112
+ r"""`joint.groupby` with appropriate axes passes."""
113
+ # tko = self.agg_axes
114
+ # gb = self.data.loc[:, tko].groupby([v for k, v in self.cut.items()], observed=False)
115
+ # gb = self.joint.groupby(list(self._gb_axes))
116
+
117
+ # cut = self.cut
118
+ # tk_target = self.agg_axes
119
+ # target = self.data.loc[cut.index, tk_target]
120
+
121
+ # mi = pd.MultiIndex.from_frame(cut)
122
+ # target.index = mi
123
+
124
+ target = self.joint
125
+ gb_axes = list(self._gb_axes)
126
+ gb = target.groupby(gb_axes, axis=0, observed=True)
127
+
128
+ # agg_axes = self.agg_axes
129
+ # gb = (
130
+ # self.joint.set_index(gb_axes)
131
+ # .loc[:, agg_axes]
132
+ # .groupby(gb_axes, axis=0, observed=False)
133
+ # )
134
+ return gb
135
+
136
+ @property
137
+ def axnorm(self):
138
+ r"""Data normalization in plot.
139
+
140
+ Not `mpl.colors.Normalize` instance. That is passed as a `kwarg` to
141
+ `make_plot`.
142
+ """
143
+ return self._axnorm
144
+
145
+ # Old version that cuts at percentiles.
146
+ @staticmethod
147
+ def clip_data(data, clip):
148
+ q0 = 0.0001
149
+ q1 = 0.9999
150
+ pct = data.quantile([q0, q1])
151
+ lo = pct.loc[q0]
152
+ up = pct.loc[q1]
153
+
154
+ if isinstance(data, pd.Series):
155
+ ax = 0
156
+ elif isinstance(data, pd.DataFrame):
157
+ ax = 1
158
+ else:
159
+ raise TypeError("Unexpected object %s" % type(data))
160
+
161
+ if isinstance(clip, str) and clip.lower()[0] == "l":
162
+ data = data.clip_lower(lo, axis=ax)
163
+ elif isinstance(clip, str) and clip.lower()[0] == "u":
164
+ data = data.clip_upper(up, axis=ax)
165
+ else:
166
+ data = data.clip(lo, up, axis=ax)
167
+ return data
168
+
169
+ # New version that uses binning to cut.
170
+ # @staticmethod
171
+ # def clip_data(data, bins, clip):
172
+ # q0 = 0.001
173
+ # q1 = 0.999
174
+ # pct = data.quantile([q0, q1])
175
+ # lo = pct.loc[q0]
176
+ # up = pct.loc[q1]
177
+ # lo = bins.iloc[0]
178
+ # up = bins.iloc[-1]
179
+ # if isinstance(clip, str) and clip.lower()[0] == "l":
180
+ # data = data.clip_lower(lo)
181
+ # elif isinstance(clip, str) and clip.lower()[0] == "u":
182
+ # data = data.clip_upper(up)
183
+ # else:
184
+ # data = data.clip(lo, up)
185
+ # return data
186
+
187
+ def set_clim(self, lower=None, upper=None):
188
+ """Set the minimum (lower) and maximum (upper) allowed number of.
189
+
190
+ counts per bin to return after calling :py:meth:`agg`.
191
+ """
192
+ assert isinstance(lower, Number) or lower is None
193
+ assert isinstance(upper, Number) or upper is None
194
+ self._clim = (lower, upper)
195
+
196
+ def set_alim(self, lower=None, upper=None):
197
+ r"""Set the minimum (lower) and maximum (upper) allowed value when.
198
+
199
+ aggregating. This is different from `clim` because it uses the
200
+ `agg_fcn`. So behavior will change based on `axnorm`, etc.
201
+ """
202
+ assert isinstance(lower, Number) or lower is None
203
+ assert isinstance(upper, Number) or upper is None
204
+ self._alim = (lower, upper)
205
+
206
+ def calc_bins_intervals(self, nbins=101, precision=None):
207
+ r"""Calculate histogram bins.
208
+
209
+ nbins: int, str, array-like
210
+ If int, use np.histogram to calculate the bin edges.
211
+ If str and nbins == "knuth", use `astropy.stats.knuth_bin_width`
212
+ to calculate optimal bin widths.
213
+ If str and nbins != "knuth", use `np.histogram(data, bins=nbins)`
214
+ to calculate bins.
215
+ If array-like, treat as bins.
216
+
217
+ precision: int or None
218
+ Precision at which to store intervals. If None, default to 3.
219
+ """
220
+ data = self.data
221
+ bins = {}
222
+ intervals = {}
223
+
224
+ if precision is None:
225
+ precision = 5
226
+
227
+ gb_axes = self._gb_axes
228
+
229
+ if isinstance(nbins, (str, int)) or (
230
+ hasattr(nbins, "__iter__") and len(nbins) != len(gb_axes)
231
+ ):
232
+ # Single paramter for `nbins`.
233
+ nbins = {k: nbins for k in gb_axes}
234
+
235
+ elif len(nbins) == len(gb_axes):
236
+ # Passed one bin spec per axis
237
+ nbins = {k: v for k, v in zip(gb_axes, nbins)}
238
+
239
+ else:
240
+ msg = f"Unrecognized `nbins`\ntype: {type(nbins)}\n bins:{nbins}"
241
+ raise ValueError(msg)
242
+
243
+ for k in self._gb_axes:
244
+ b = nbins[k]
245
+ # Numpy and Astropy don't like NaNs when calculating bins.
246
+ # Infinities in bins (typically from log10(0)) also create problems.
247
+ d = data.loc[:, k].replace([-np.inf, np.inf], np.nan).dropna()
248
+
249
+ if isinstance(b, str):
250
+ b = b.lower()
251
+
252
+ if isinstance(b, str) and b == "knuth":
253
+ try:
254
+ assert knuth_bin_width
255
+ except NameError:
256
+ raise NameError("Astropy is unavailable.")
257
+
258
+ dx, b = knuth_bin_width(d, return_bins=True)
259
+
260
+ else:
261
+ try:
262
+ b = np.histogram_bin_edges(d, b)
263
+ except MemoryError:
264
+ # Clip the extremely large values and extremely small outliers.
265
+ lo, up = d.quantile([0.0005, 0.9995])
266
+ b = np.histogram_bin_edges(d.clip(lo, up), b)
267
+ except AttributeError:
268
+ c, b = np.histogram(d, b)
269
+
270
+ assert np.unique(b).size == b.size
271
+ try:
272
+ assert not np.isnan(b).any()
273
+ except TypeError:
274
+ assert not b.isna().any()
275
+
276
+ b = b.round(precision)
277
+
278
+ zipped = zip(b[:-1], b[1:])
279
+ i = [pd.Interval(*b0b1, closed="right") for b0b1 in zipped]
280
+
281
+ bins[k] = b
282
+ # intervals[k] = pd.IntervalIndex(i)
283
+ intervals[k] = pd.CategoricalIndex(i)
284
+
285
+ bins = tuple(bins.items())
286
+ intervals = tuple(intervals.items())
287
+ # self._intervals = intervals
288
+ self._categoricals = intervals
289
+
290
+ def make_cut(self):
291
+ r"""Calculate the `Categorical` quantities for the aggregation axes."""
292
+ intervals = self.intervals
293
+ data = self.data
294
+
295
+ cut = {}
296
+ for k in self._gb_axes:
297
+ d = data.loc[:, k]
298
+ i = intervals[k]
299
+
300
+ if self.clip:
301
+ d = self.clip_data(d, self.clip)
302
+
303
+ c = pd.cut(d, i)
304
+ cut[k] = c
305
+
306
+ cut = pd.DataFrame.from_dict(cut, orient="columns")
307
+ self._cut = cut
308
+
309
+ def _agg_runner(self, cut, tko, gb, fcn, **kwargs):
310
+ r"""Refactored out the aggregation.
311
+
312
+ This enables compatibility with :py:class:`OrbitPlot` aggregation of
313
+ different orbit legs (Inbound, Outbound, and Both).
314
+ """
315
+ self.logger.debug(f"aggregating {tko} data along {cut.columns.values}")
316
+
317
+ if fcn is None:
318
+ other = self.data.loc[cut.index, tko]
319
+ if other.dropna().unique().size == 1:
320
+ fcn = "count"
321
+ else:
322
+ fcn = "mean"
323
+
324
+ agg = gb.agg(fcn, **kwargs) # .loc[:, tko]
325
+
326
+ c0, c1 = self.clim
327
+ if c0 is not None or c1 is not None:
328
+ cnt = gb.agg("count") # .loc[:, tko]
329
+ tk = pd.Series(True, index=agg.index)
330
+ # tk = pd.DataFrame(True,
331
+ # index=agg.index,
332
+ # columns=agg.columns
333
+ # )
334
+ if c0 is not None:
335
+ tk = tk & (cnt >= c0)
336
+ if c1 is not None:
337
+ tk = tk & (cnt <= c1)
338
+
339
+ agg = agg.where(tk)
340
+
341
+ # # Using `observed=False` in `self.grouped` raised a TypeError because mixed Categoricals and np.nans. (20200229)
342
+ # # Ensure all bins are represented in the data. (20190605)
343
+ # # for k, v in self.intervals.items():
344
+ # for k, v in self.categoricals.items():
345
+ # # if > 1 intervals, pass level. Otherwise, don't as this raises a NotImplementedError. (20190619)
346
+ # agg = agg.reindex(index=v, level=k if agg.index.nlevels > 1 else None)
347
+
348
+ return agg
349
+
350
+ def _agg_reindexer(self, agg):
351
+ # Using `observed=False` in `self.grouped` raised a TypeError because mixed Categoricals and np.nans. (20200229)
352
+ # Ensure all bins are represented in the data. (20190605)
353
+ # for k, v in self.intervals.items():
354
+ for k, v in self.categoricals.items():
355
+ # if > 1 intervals, pass level. Otherwise, don't as this raises a NotImplementedError. (20190619)
356
+ agg = agg.reindex(index=v, level=k if agg.index.nlevels > 1 else None)
357
+
358
+ return agg
359
+
360
+ def agg(self, fcn=None, **kwargs):
361
+ r"""Perform the aggregation along the agg axes.
362
+
363
+ If either of the count limits specified in `clim` are not None, apply them.
364
+
365
+ `fcn` allows you to specify a specific function for aggregation. Otherwise,
366
+ automatically choose "count" or "mean" based on the uniqueness of the aggregated
367
+ values.
368
+ """
369
+ cut = self.cut
370
+ tko = self.agg_axes
371
+
372
+ lbls = {k: str(v).replace("\n", " ") for k, v in self.labels._asdict().items()}
373
+ self.logger.info(
374
+ f"Starting {self.__class__.__name__!s} aggregation of ({tko}) in ({cut.columns.values})\n%s",
375
+ "\n".join([f"""{k!s}: {v!s}""" for k, v in lbls.items()]),
376
+ )
377
+
378
+ gb = self.grouped
379
+
380
+ agg = self._agg_runner(cut, tko, gb, fcn, **kwargs)
381
+
382
+ return agg
383
+
384
+ def get_plotted_data_boolean_series(self):
385
+ """Return a boolean ``pd.Series`` identifying each plotted measurement.
386
+
387
+ The series shares the same index as the stored data. To align with a different
388
+ index you may need to adjust the returned series.
389
+ """
390
+ agg = self.agg().dropna()
391
+ cut = self.cut
392
+
393
+ tk = pd.Series(True, index=cut.index)
394
+ for k, v in cut.items():
395
+ idx = agg.index.get_level_values(k)
396
+ # Use the codes directly because the categoricals are
397
+ # failing with some Pandas numpy ufunc use. (20200611)
398
+ # Also need to ensure codes are consistent between the
399
+ # two objects. (20201111)
400
+ cat = v.unique()
401
+ codes = cat.codes
402
+ mapper = pd.Series(codes, index=cat)
403
+ mapped_idx = idx.map(mapper)
404
+ mapped_v = v.map(mapper)
405
+
406
+ tk_ax = mapped_v.isin(mapped_idx)
407
+ tk = tk & tk_ax
408
+
409
+ self.logger.info(
410
+ f"Taking {tk.sum()!s} ({100 * tk.mean():.1f}%) {self.__class__.__name__} spectra"
411
+ )
412
+
413
+ return tk
414
+
415
+ def get_subset_above_threshold(self, threshold, fcn="count"):
416
+ r"""Get the subset of data above a given threshold using `fcn` to.
417
+
418
+ aggregate. If `axnorm` set, this is used.
419
+ """
420
+ agg = self.agg(fcn=fcn)
421
+ tk = agg >= threshold
422
+ tk = tk.loc[tk]
423
+
424
+ tk_h2 = pd.Series(True, index=self.data.index)
425
+ for k, v in self.cut.items():
426
+ tk_ax = pd.IntervalIndex(v).isin(tk.index.get_level_values(k).unique())
427
+ tk_h2 = tk_h2 & tk_ax
428
+
429
+ subset = self.data.loc[tk_h2].copy(deep=True)
430
+ for k, log in self.log._asdict().items():
431
+ if log:
432
+ subset.loc[:, k] = 10 ** subset.loc[:, k]
433
+
434
+ return subset, tk_h2
435
+
436
+ # Old version that cuts at percentiles.
437
+ # @staticmethod
438
+ # def clip_data(data, clip):
439
+ # q0 = 0.0001
440
+ # q1 = 0.9999
441
+ # pct = data.quantile([q0, q1])
442
+ # lo = pct.loc[q0]
443
+ # up = pct.loc[q1]
444
+ #
445
+ # if isinstance(data, pd.Series):
446
+ # ax = 0
447
+ # elif isinstance(data, pd.DataFrame):
448
+ # ax = 1
449
+ # else:
450
+ # raise TypeError("Unexpected object %s" % type(data))
451
+ #
452
+ # if isinstance(clip, str) and clip.lower()[0] == "l":
453
+ # data = data.clip_lower(lo, axis=ax)
454
+ # elif isinstance(clip, str) and clip.lower()[0] == "u":
455
+ # data = data.clip_upper(up, axis=ax)
456
+ # else:
457
+ # data = data.clip(lo, up, axis=ax)
458
+ # return data
459
+ #
460
+ # New version that uses binning to cut.
461
+ # @staticmethod
462
+ # def clip_data(data, bins, clip):
463
+ # q0 = 0.001
464
+ # q1 = 0.999
465
+ # pct = data.quantile([q0, q1])
466
+ # lo = pct.loc[q0]
467
+ # up = pct.loc[q1]
468
+ # lo = bins.iloc[0]
469
+ # up = bins.iloc[-1]
470
+ # if isinstance(clip, str) and clip.lower()[0] == "l":
471
+ # data = data.clip_lower(lo)
472
+ # elif isinstance(clip, str) and clip.lower()[0] == "u":
473
+ # data = data.clip_upper(up)
474
+ # else:
475
+ # data = data.clip(lo, up)
476
+ # return data
477
+
478
+ @abstractproperty
479
+ def _gb_axes(self):
480
+ r"""The axes or columns over which the `groupby` aggregation takes place.
481
+
482
+ 1D cases aggregate over `x`. 2D cases aggregate over `x` and `y`.
483
+ """
484
+ pass
485
+
486
+ @abstractmethod
487
+ def set_axnorm(self, new):
488
+ r"""The method by which the gridded data is normalized."""
489
+ pass