solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.0__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.
- plans/.velocity/metrics.json +96 -0
- plans/0-overview-template.md +268 -0
- plans/N-phase-template.md +106 -0
- plans/PLAN_AUDIT_SUMMARY.md +173 -0
- plans/TEMPLATE-USAGE-GUIDE.md +198 -0
- plans/__init__.py +1 -0
- plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
- plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
- plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
- plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
- plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
- plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
- plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
- plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
- plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
- plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
- plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
- plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
- plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
- plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
- plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
- plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
- plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
- plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
- plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
- plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
- plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
- plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
- plans/cicd-architecture-redesign/0-Overview.md +193 -0
- plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
- plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
- plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
- plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
- plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
- plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
- plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
- plans/cicd-architecture-redesign/8-Documentation.md +285 -0
- plans/cicd-architecture-redesign/Closeout.md +225 -0
- plans/closeout-template.md +259 -0
- plans/completed/circular-import-audit/0-Overview.md +152 -0
- plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
- plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
- plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
- plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
- plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
- plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
- plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
- plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
- plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
- plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
- plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
- plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
- plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
- plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
- plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
- plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
- plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
- plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
- plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
- plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
- plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
- plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
- plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
- plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
- plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
- plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
- plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
- plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
- plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
- plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
- plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
- plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
- plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
- plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
- plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
- plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
- plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
- plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
- plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
- plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
- plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
- plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
- plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
- plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
- plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
- plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
- plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
- plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
- plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
- plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
- plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
- plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
- plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
- plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
- plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
- plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
- plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
- plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
- plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
- plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
- plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
- plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
- plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
- plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
- plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
- plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
- plans/completed/pr-review-remediation/0-Overview.md +138 -0
- plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
- plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
- plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
- plans/completed/pr-review-remediation/compacted_state.md +66 -0
- plans/completed/python-310-migration/0-Overview.md +390 -0
- plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
- plans/completed/python-310-migration/2-Implementation.md +256 -0
- plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
- plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
- plans/completed/python-310-migration/5-Closeout.md +252 -0
- plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
- plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
- plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
- plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
- plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
- plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
- plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
- plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
- plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
- plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
- plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
- plans/completed/test-directory-consolidation/0-Overview.md +51 -0
- plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
- plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
- plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
- plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
- plans/completed/test-directory-consolidation/5-Validation.md +152 -0
- plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
- plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
- plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
- plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
- plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
- plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
- plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
- plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
- plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
- plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
- plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
- plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
- plans/documentation-code-audit/0-Overview.md +393 -0
- plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
- plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
- plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
- plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
- plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
- plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
- plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
- plans/documentation-code-audit/8-Closeout.md +456 -0
- plans/documentation-rebuild-session/compacted_state.md +109 -0
- plans/documentation-rendering-fixes/0-Overview.md +104 -0
- plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
- plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
- plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
- plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
- plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
- plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
- plans/documentation-rendering-fixes/compacted_state.md +132 -0
- plans/documentation-template-fix/0-Overview.md +197 -0
- plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
- plans/documentation-template-fix/2-Template-Modification.md +609 -0
- plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
- plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
- plans/documentation-template-fix/5-Documentation-Training.md +602 -0
- plans/documentation-workflow-fix/0-Overview.md +222 -0
- plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
- plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
- plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
- plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
- plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
- plans/duplicate-object-warnings-fix-plan.md +130 -0
- plans/github-issues-migration/0-Overview.md +510 -0
- plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
- plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
- plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
- plans/github-issues-migration/4-Validated-Migration.md +252 -0
- plans/github-issues-migration/5-Documentation-Training.md +171 -0
- plans/github-issues-migration/6-Closeout.md +179 -0
- plans/github-workflows-repair/repair-plan.md +299 -0
- plans/issues_from_plans.py +342 -0
- plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
- plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
- plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
- plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
- plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
- plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
- plans/python-310-migration/0-Overview.md +390 -0
- plans/python-310-migration/1-Planning-Setup.md +164 -0
- plans/python-310-migration/2-Implementation.md +256 -0
- plans/python-310-migration/3-Testing-Validation.md +335 -0
- plans/python-310-migration/4-Documentation-Release.md +274 -0
- plans/python-310-migration/5-Closeout.md +252 -0
- plans/readthedocs-simplified/0-Overview.md +243 -0
- plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
- plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
- plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
- plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
- plans/readthedocs-simplified/5-Closeout.md +231 -0
- plans/readthedocs-simplified/compacted_state.md +127 -0
- plans/session-compaction-2025-08-12/compacted_state.md +114 -0
- plans/session-compaction-2025-08-13/compacted_state.md +145 -0
- plans/session-continuity-protocol/0-Overview.md +35 -0
- plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
- plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
- plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
- plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
- plans/sphinx-warnings-analysis.md +222 -0
- plans/systemprompt-optimization/0-Overview.md +447 -0
- plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
- plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
- plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
- plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
- plans/systemprompt-optimization/9-Closeout.md +165 -0
- plans/systemprompt-optimization/compacted_state.md +143 -0
- plans/template-value-propositions/0-Overview.md +357 -0
- plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
- plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
- plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
- plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
- plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
- plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
- plans/tests-audit/0-Overview.md +410 -0
- plans/tests-audit/1-Discovery-Inventory.md +170 -0
- plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
- plans/tests-audit/3-Architecture-Compliance.md +195 -0
- plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
- plans/tests-audit/5-Documentation-Enhancement.md +220 -0
- plans/tests-audit/6-Audit-Deliverables.md +220 -0
- plans/tests-audit/7-Closeout.md +252 -0
- plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
- plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
- plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
- plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
- plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
- plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
- plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
- plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
- plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
- plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
- plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
- plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
- plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
- plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
- plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
- plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
- plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
- plans/tests-audit/artifacts/test_parser.py +395 -0
- solarwindpy/README.md +3 -0
- solarwindpy/Untitled.ipynb +54 -0
- solarwindpy/__init__.py +74 -0
- solarwindpy/core/__init__.py +23 -0
- solarwindpy/core/alfvenic_turbulence.py +804 -0
- solarwindpy/core/base.py +267 -0
- solarwindpy/core/ions.py +309 -0
- solarwindpy/core/plasma.py +2133 -0
- solarwindpy/core/spacecraft.py +256 -0
- solarwindpy/core/tensor.py +90 -0
- solarwindpy/core/units_constants.py +199 -0
- solarwindpy/core/vector.py +328 -0
- solarwindpy/fitfunctions/__init__.py +20 -0
- solarwindpy/fitfunctions/core.py +734 -0
- solarwindpy/fitfunctions/exponentials.py +188 -0
- solarwindpy/fitfunctions/gaussians.py +264 -0
- solarwindpy/fitfunctions/lines.py +116 -0
- solarwindpy/fitfunctions/moyal.py +71 -0
- solarwindpy/fitfunctions/plots.py +751 -0
- solarwindpy/fitfunctions/power_laws.py +209 -0
- solarwindpy/fitfunctions/tex_info.py +568 -0
- solarwindpy/fitfunctions/trend_fits.py +482 -0
- solarwindpy/instabilities/__init__.py +16 -0
- solarwindpy/instabilities/beta_ani.py +82 -0
- solarwindpy/instabilities/verscharen2016.py +631 -0
- solarwindpy/plotting/__init__.py +33 -0
- solarwindpy/plotting/agg_plot.py +489 -0
- solarwindpy/plotting/base.py +465 -0
- solarwindpy/plotting/hist1d.py +405 -0
- solarwindpy/plotting/hist2d.py +1035 -0
- solarwindpy/plotting/histograms.py +1845 -0
- solarwindpy/plotting/labels/__init__.py +104 -0
- solarwindpy/plotting/labels/base.py +686 -0
- solarwindpy/plotting/labels/chemistry.py +19 -0
- solarwindpy/plotting/labels/composition.py +100 -0
- solarwindpy/plotting/labels/datetime.py +235 -0
- solarwindpy/plotting/labels/elemental_abundance.py +73 -0
- solarwindpy/plotting/labels/special.py +794 -0
- solarwindpy/plotting/orbits.py +515 -0
- solarwindpy/plotting/scatter.py +99 -0
- solarwindpy/plotting/select_data_from_figure.py +329 -0
- solarwindpy/plotting/spiral.py +980 -0
- solarwindpy/plotting/tools.py +434 -0
- solarwindpy/scripts/__init__.py +1 -0
- solarwindpy/scripts/logs/.gitignore +1 -0
- solarwindpy/solar_activity/__init__.py +53 -0
- solarwindpy/solar_activity/base.py +605 -0
- solarwindpy/solar_activity/lisird/__init__.py +3 -0
- solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
- solarwindpy/solar_activity/lisird/lisird.py +319 -0
- solarwindpy/solar_activity/plots.py +116 -0
- solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
- solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
- solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
- solarwindpy/tools/__init__.py +162 -0
- solarwindpy-0.1.0.dist-info/METADATA +181 -0
- solarwindpy-0.1.0.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.0.dist-info/top_level.txt +3 -0
- tests/__init__.py +1 -0
- tests/conftest.py +10 -0
- tests/core/__init__.py +1 -0
- tests/core/test_alfvenic_turbulence.py +544 -0
- tests/core/test_base.py +112 -0
- tests/core/test_base_head_tail.py +29 -0
- tests/core/test_base_mi_tuples.py +11 -0
- tests/core/test_core_verify_datetimeindex.py +32 -0
- tests/core/test_ions.py +325 -0
- tests/core/test_plasma.py +2581 -0
- tests/core/test_plasma_io.py +12 -0
- tests/core/test_quantities.py +507 -0
- tests/core/test_spacecraft.py +210 -0
- tests/core/test_units_constants.py +22 -0
- tests/data/epoch.csv +4 -0
- tests/data/plasma.csv +4 -0
- tests/data/spacecraft.csv +4 -0
- tests/fitfunctions/conftest.py +60 -0
- tests/fitfunctions/test_core.py +193 -0
- tests/fitfunctions/test_exponentials.py +342 -0
- tests/fitfunctions/test_gaussians.py +142 -0
- tests/fitfunctions/test_lines.py +349 -0
- tests/fitfunctions/test_moyal.py +258 -0
- tests/fitfunctions/test_plots.py +258 -0
- tests/fitfunctions/test_power_laws.py +365 -0
- tests/fitfunctions/test_tex_info.py +183 -0
- tests/fitfunctions/test_trend_fit_properties.py +31 -0
- tests/fitfunctions/test_trend_fits.py +244 -0
- tests/plotting/__init__.py +1 -0
- tests/plotting/labels/__init__.py +1 -0
- tests/plotting/labels/test_chemistry.py +243 -0
- tests/plotting/labels/test_composition.py +345 -0
- tests/plotting/labels/test_datetime.py +445 -0
- tests/plotting/labels/test_elemental_abundance.py +366 -0
- tests/plotting/labels/test_init.py +66 -0
- tests/plotting/labels/test_labels_base.py +347 -0
- tests/plotting/labels/test_special.py +550 -0
- tests/plotting/test_agg_plot.py +602 -0
- tests/plotting/test_base.py +752 -0
- tests/plotting/test_fixtures_utilities.py +775 -0
- tests/plotting/test_histograms.py +546 -0
- tests/plotting/test_integration.py +675 -0
- tests/plotting/test_orbits.py +435 -0
- tests/plotting/test_performance.py +708 -0
- tests/plotting/test_scatter.py +752 -0
- tests/plotting/test_select_data_from_figure.py +1209 -0
- tests/plotting/test_spiral.py +573 -0
- tests/plotting/test_tools.py +607 -0
- tests/plotting/test_visual_validation.py +465 -0
- tests/solar_activity/__init__.py +1 -0
- tests/solar_activity/lisird/__init__.py +1 -0
- tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
- tests/solar_activity/lisird/test_lisird_id.py +187 -0
- tests/solar_activity/sunspot_number/__init__.py +1 -0
- tests/solar_activity/sunspot_number/test_init.py +399 -0
- tests/solar_activity/sunspot_number/test_sidc.py +465 -0
- tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
- tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
- tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
- tests/solar_activity/test_base.py +656 -0
- tests/solar_activity/test_init.py +396 -0
- tests/solar_activity/test_plots.py +371 -0
- tests/test_circular_imports.py +408 -0
- tests/test_issue_titles.py +25 -0
- tests/test_statusline.py +298 -0
- solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
- solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
- solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r"""Fit functions for exponential models.
|
|
3
|
+
|
|
4
|
+
Classes in this module implement exponential decay and related forms
|
|
5
|
+
using the :class:`~solarwindpy.fitfunctions.core.FitFunction` API.
|
|
6
|
+
They provide reasonable starting parameters and formatted LaTeX output
|
|
7
|
+
for visualization.
|
|
8
|
+
"""
|
|
9
|
+
import pdb # noqa: F401
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from numbers import Number
|
|
13
|
+
|
|
14
|
+
from .core import FitFunction
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Exponential(FitFunction):
|
|
18
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
19
|
+
"""Fit ``A * exp(-c x)`` to the data.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
xobs : array-like
|
|
24
|
+
Independent variable values.
|
|
25
|
+
yobs : array-like
|
|
26
|
+
Observed dependent variable values.
|
|
27
|
+
**kwargs
|
|
28
|
+
Additional options forwarded to :class:`FitFunction`.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def function(self):
|
|
35
|
+
def exp(x, c, A):
|
|
36
|
+
return A * np.exp(-(c * x))
|
|
37
|
+
|
|
38
|
+
return exp
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def p0(self):
|
|
42
|
+
r"""Return initial guesses ``[c, A]`` for the fit."""
|
|
43
|
+
assert self.sufficient_data
|
|
44
|
+
|
|
45
|
+
y = self.observations.used.y
|
|
46
|
+
|
|
47
|
+
c = 1.0
|
|
48
|
+
try:
|
|
49
|
+
A = y.max()
|
|
50
|
+
except ValueError as e:
|
|
51
|
+
chk = (
|
|
52
|
+
r"zero-size array to reduction operation maximum "
|
|
53
|
+
"which has no identity"
|
|
54
|
+
)
|
|
55
|
+
if e.message.startswith(chk):
|
|
56
|
+
msg = (
|
|
57
|
+
"There is no maximum of a zero-size array. "
|
|
58
|
+
"Please check input data."
|
|
59
|
+
)
|
|
60
|
+
raise ValueError(msg)
|
|
61
|
+
|
|
62
|
+
p0 = [c, A]
|
|
63
|
+
return p0
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def TeX_function(self):
|
|
67
|
+
TeX = r"f(x)=A \cdot e^{-cx}"
|
|
68
|
+
return TeX
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class ExponentialPlusC(FitFunction):
|
|
72
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
73
|
+
"""Fit ``A * exp(-c x) + d`` to the data.
|
|
74
|
+
|
|
75
|
+
Parameters
|
|
76
|
+
----------
|
|
77
|
+
xobs : array-like
|
|
78
|
+
Independent variable values.
|
|
79
|
+
yobs : array-like
|
|
80
|
+
Observed dependent variable values.
|
|
81
|
+
**kwargs
|
|
82
|
+
Additional options forwarded to :class:`FitFunction`.
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def function(self):
|
|
89
|
+
def expc(x, c, A, d):
|
|
90
|
+
return (A * np.exp(-(c * x))) + d
|
|
91
|
+
|
|
92
|
+
return expc
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def p0(self):
|
|
96
|
+
r"""Return initial guesses ``[c, A, d]`` for the fit."""
|
|
97
|
+
assert self.sufficient_data
|
|
98
|
+
|
|
99
|
+
y = self.observations.used.y
|
|
100
|
+
|
|
101
|
+
c = 1.0
|
|
102
|
+
d = 0.0
|
|
103
|
+
try:
|
|
104
|
+
A = y.max()
|
|
105
|
+
except ValueError as e:
|
|
106
|
+
chk = (
|
|
107
|
+
r"zero-size array to reduction operation maximum "
|
|
108
|
+
"which has no identity"
|
|
109
|
+
)
|
|
110
|
+
if e.message.startswith(chk):
|
|
111
|
+
msg = (
|
|
112
|
+
"There is no maximum of a zero-size array. "
|
|
113
|
+
"Please check input data."
|
|
114
|
+
)
|
|
115
|
+
raise ValueError(msg)
|
|
116
|
+
|
|
117
|
+
p0 = [c, A, d]
|
|
118
|
+
return p0
|
|
119
|
+
|
|
120
|
+
@property
|
|
121
|
+
def TeX_function(self):
|
|
122
|
+
TeX = r"f(x)=A \cdot e^{-cx} + d"
|
|
123
|
+
return TeX
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class ExponentialCDF(FitFunction):
|
|
127
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
128
|
+
"""Fit an exponential cumulative distribution function.
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
xobs : array-like
|
|
133
|
+
Independent variable values.
|
|
134
|
+
yobs : array-like
|
|
135
|
+
Observed cumulative counts.
|
|
136
|
+
**kwargs
|
|
137
|
+
Additional options forwarded to :class:`FitFunction`.
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def function(self):
|
|
144
|
+
def exp_cdf(x, c):
|
|
145
|
+
return self.y0 * (1.0 - np.exp(-(c * x)))
|
|
146
|
+
|
|
147
|
+
return exp_cdf
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def y0(self):
|
|
151
|
+
r"""Amplitude of the CDF."""
|
|
152
|
+
return self._y0
|
|
153
|
+
|
|
154
|
+
def set_y0(self, new):
|
|
155
|
+
assert isinstance(new, Number)
|
|
156
|
+
self._y0 = new
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def p0(self):
|
|
160
|
+
r"""Return initial guess ``[c]`` for the fit."""
|
|
161
|
+
assert self.sufficient_data
|
|
162
|
+
|
|
163
|
+
y = self.observations.used.y
|
|
164
|
+
|
|
165
|
+
c = y.mean()
|
|
166
|
+
|
|
167
|
+
p0 = [c]
|
|
168
|
+
return p0
|
|
169
|
+
|
|
170
|
+
@property
|
|
171
|
+
def TeX_function(self):
|
|
172
|
+
TeX = r"f(x)=A \left(1 - e^{-cx}\right)"
|
|
173
|
+
return TeX
|
|
174
|
+
|
|
175
|
+
def set_TeX_info(self, **kwargs):
|
|
176
|
+
"""Include ``A`` value in the TeX annotation."""
|
|
177
|
+
|
|
178
|
+
# HACK: assumes integer A
|
|
179
|
+
# If not integer, will need to format float or exp.
|
|
180
|
+
additional_info = kwargs.pop("additional_info", [])
|
|
181
|
+
if not isinstance(additional_info, list):
|
|
182
|
+
additional_info = [additional_info]
|
|
183
|
+
info_A = r"$A = %s$" % self.y0
|
|
184
|
+
additional_info = [info_A] + additional_info
|
|
185
|
+
|
|
186
|
+
super(ExponentialCDF, self).set_TeX_info(
|
|
187
|
+
additional_info=additional_info, **kwargs
|
|
188
|
+
)
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r"""Gaussian-based fit functions.
|
|
3
|
+
|
|
4
|
+
The classes here implement standard Gaussian shapes and common
|
|
5
|
+
variations used throughout the package. Each class inherits from
|
|
6
|
+
:class:`~solarwindpy.fitfunctions.core.FitFunction` and defines the
|
|
7
|
+
target function, initial parameter estimates, and LaTeX output helpers.
|
|
8
|
+
"""
|
|
9
|
+
import pdb # noqa: F401
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from .core import FitFunction
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Gaussian(FitFunction):
|
|
16
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
17
|
+
"""Fit a standard Gaussian profile."""
|
|
18
|
+
|
|
19
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def function(self):
|
|
23
|
+
def gaussian(x, mu, sigma, A):
|
|
24
|
+
arg = -0.5 * (((x - mu) / sigma) ** 2.0)
|
|
25
|
+
return A * np.exp(arg)
|
|
26
|
+
|
|
27
|
+
return gaussian
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def p0(self):
|
|
31
|
+
r"""Return initial guesses ``[mu, sigma, A]`` for the fit."""
|
|
32
|
+
assert self.sufficient_data
|
|
33
|
+
|
|
34
|
+
x, y = self.observations.used.x, self.observations.used.y
|
|
35
|
+
mean = (x * y).sum() / y.sum()
|
|
36
|
+
std = np.sqrt(((x - mean) ** 2.0 * y).sum() / y.sum())
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
peak = y.max()
|
|
40
|
+
except ValueError as e:
|
|
41
|
+
chk = (
|
|
42
|
+
r"zero-size array to reduction operation maximum "
|
|
43
|
+
"which has no identity"
|
|
44
|
+
)
|
|
45
|
+
if e.message.startswith(chk):
|
|
46
|
+
msg = (
|
|
47
|
+
"There is no maximum of a zero-size array. "
|
|
48
|
+
"Please check input data."
|
|
49
|
+
)
|
|
50
|
+
raise ValueError(msg)
|
|
51
|
+
|
|
52
|
+
p0 = [mean, std, peak]
|
|
53
|
+
return p0
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def TeX_function(self):
|
|
57
|
+
# TeX = r"f(x)=\frac{1}{\sqrt{2 \pi} \sigma} A\cdot e^{-\frac{1}{2} (\frac{x-\mu}{\sigma})^2}"
|
|
58
|
+
TeX = r"f(x)=A \cdot e^{-\frac{1}{2} \left(\frac{x-\mu}{\sigma}\right)^2}"
|
|
59
|
+
return TeX
|
|
60
|
+
|
|
61
|
+
def make_fit(self, *args, **kwargs):
|
|
62
|
+
super().make_fit(*args, **kwargs)
|
|
63
|
+
try:
|
|
64
|
+
self.TeX_info.set_TeX_argnames(mu=r"\mu", sigma=r"\sigma")
|
|
65
|
+
except AttributeError: # Fit failed
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class GaussianNormalized(FitFunction):
|
|
70
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
71
|
+
"""Fit a normalized Gaussian where the integral equals ``n``."""
|
|
72
|
+
|
|
73
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def function(self):
|
|
77
|
+
def gaussian_normalized(x, mu, sigma, n):
|
|
78
|
+
arg = -0.5 * (((x - mu) / sigma) ** 2.0)
|
|
79
|
+
A = n / (np.sqrt(2 * np.pi) * sigma)
|
|
80
|
+
return A * np.exp(arg)
|
|
81
|
+
|
|
82
|
+
return gaussian_normalized
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def p0(self):
|
|
86
|
+
r"""Return initial guesses ``[mu, sigma, n]`` for the fit."""
|
|
87
|
+
assert self.sufficient_data
|
|
88
|
+
|
|
89
|
+
x, y = self.observations.used.x, self.observations.used.y
|
|
90
|
+
mean = (x * y).sum() / y.sum()
|
|
91
|
+
std = np.sqrt(((x - mean) ** 2.0 * y).sum() / y.sum())
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
peak = y.max()
|
|
95
|
+
except ValueError as e:
|
|
96
|
+
chk = (
|
|
97
|
+
r"zero-size array to reduction operation maximum "
|
|
98
|
+
"which has no identity"
|
|
99
|
+
)
|
|
100
|
+
if e.message.startswith(chk):
|
|
101
|
+
msg = (
|
|
102
|
+
"There is no maximum of a zero-size array. "
|
|
103
|
+
"Please check input data."
|
|
104
|
+
)
|
|
105
|
+
raise ValueError(msg)
|
|
106
|
+
|
|
107
|
+
n = peak * std * np.sqrt(2 * np.pi)
|
|
108
|
+
p0 = [mean, std, n]
|
|
109
|
+
return p0
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def TeX_function(self):
|
|
113
|
+
TeX = r"f(x)=\frac{n}{\sqrt{2 \pi} \sigma} e^{-\frac{1}{2} \left(\frac{x-\mu}{\sigma}\right)^2}"
|
|
114
|
+
# TeX = r"f(x)=A \cdot e^{-\frac{1}{2} (\frac{x-\mu}{\sigma})^2}"
|
|
115
|
+
return TeX
|
|
116
|
+
|
|
117
|
+
def make_fit(self, *args, **kwargs):
|
|
118
|
+
super().make_fit(*args, **kwargs)
|
|
119
|
+
try:
|
|
120
|
+
self.TeX_info.set_TeX_argnames(mu=r"\mu", sigma=r"\sigma")
|
|
121
|
+
except AttributeError: # Fit failed
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class GaussianLn(FitFunction):
|
|
126
|
+
r"""Gaussian where taking :math:`\ln(x)`.
|
|
127
|
+
|
|
128
|
+
[1] https://mathworld.wolfram.com/LogNormalDistribution.html
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
132
|
+
"""Fit a Gaussian in logarithmic space."""
|
|
133
|
+
|
|
134
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
135
|
+
self.set_TeX_report_normal_parameters(False)
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def function(self):
|
|
139
|
+
# def gaussian_ln(x, m, s, A):
|
|
140
|
+
# x = np.log(x)
|
|
141
|
+
# coeff = (np.sqrt(2.0 * np.pi) * s) ** (-1.0)
|
|
142
|
+
# arg = -0.5 * (((x - m) / s) ** 2.0)
|
|
143
|
+
# return A * coeff * np.exp(arg)
|
|
144
|
+
|
|
145
|
+
def gaussian_ln(x, m, s, A):
|
|
146
|
+
lnx = np.log(x)
|
|
147
|
+
|
|
148
|
+
coeff = A
|
|
149
|
+
# coeff *= (np.sqrt(2.0 * np.pi) * s * x) ** (-1.0)
|
|
150
|
+
|
|
151
|
+
arg = -0.5 * (((lnx - m) / s) ** 2.0)
|
|
152
|
+
|
|
153
|
+
return coeff * np.exp(arg)
|
|
154
|
+
|
|
155
|
+
# def gaussian_ln(x, m, s, A):
|
|
156
|
+
# arg = m + (s * x)
|
|
157
|
+
# return A * np.exp(arg)
|
|
158
|
+
|
|
159
|
+
return gaussian_ln
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def p0(self):
|
|
163
|
+
r"""Return initial guesses ``[ln(mu), ln(sigma), ln(A)]``."""
|
|
164
|
+
assert self.sufficient_data
|
|
165
|
+
|
|
166
|
+
x, y = self.observations.used.x, self.observations.used.y
|
|
167
|
+
|
|
168
|
+
mean = (x * y).sum() / y.sum()
|
|
169
|
+
std = ((x - mean) ** 2.0 * y).sum() / y.sum()
|
|
170
|
+
|
|
171
|
+
try:
|
|
172
|
+
peak = y.max()
|
|
173
|
+
except ValueError as e:
|
|
174
|
+
chk = (
|
|
175
|
+
r"zero-size array to reduction operation maximum "
|
|
176
|
+
"which has no identity"
|
|
177
|
+
)
|
|
178
|
+
if e.message.startswith(chk):
|
|
179
|
+
msg = (
|
|
180
|
+
"There is no maximum of a zero-size array. "
|
|
181
|
+
"Please check input data."
|
|
182
|
+
)
|
|
183
|
+
raise ValueError(msg)
|
|
184
|
+
|
|
185
|
+
p0 = [mean, std, peak]
|
|
186
|
+
p0 = [np.log(x) for x in p0]
|
|
187
|
+
return p0
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def TeX_function(self):
|
|
191
|
+
TeX = (
|
|
192
|
+
r"f(x) = A \cdot "
|
|
193
|
+
r"\mathrm{exp}\left[-\frac{1}{2} "
|
|
194
|
+
r"(\frac{\mathrm{ln}(x)-m}{s})^2\right]"
|
|
195
|
+
)
|
|
196
|
+
TeX = (
|
|
197
|
+
r"f(x) ="
|
|
198
|
+
r"A \cdot"
|
|
199
|
+
# r"\frac{1}{\sqrt{2\pi} s x}"
|
|
200
|
+
r"\exp\left["
|
|
201
|
+
r"\frac{\left(\ln x - m\right)^2}{2 s^2}"
|
|
202
|
+
r"\right]"
|
|
203
|
+
)
|
|
204
|
+
return TeX
|
|
205
|
+
|
|
206
|
+
@property
|
|
207
|
+
def normal_parameters(self):
|
|
208
|
+
r"""Calculate the normal parameters from log-normal parameters.
|
|
209
|
+
|
|
210
|
+
.. math::
|
|
211
|
+
|
|
212
|
+
\mu = \exp[m + (s^2)/2]
|
|
213
|
+
\sigma = \sqrt{\exp[s^2 + 2m] (\exp[s^2] - 1)}
|
|
214
|
+
"""
|
|
215
|
+
m = self.popt["m"]
|
|
216
|
+
s = self.popt["s"]
|
|
217
|
+
|
|
218
|
+
mu = np.exp(m + ((s**2.0) / 2.0))
|
|
219
|
+
sigma = np.exp(s**2.0 + 2.0 * m)
|
|
220
|
+
sigma *= np.exp(s**2.0) - 1.0
|
|
221
|
+
sigma = np.sqrt(sigma)
|
|
222
|
+
|
|
223
|
+
return dict(mu=mu, sigma=sigma)
|
|
224
|
+
|
|
225
|
+
@property
|
|
226
|
+
def TeX_report_normal_parameters(self):
|
|
227
|
+
r"""Report normal parameters, not log-normal parameters in the TeX info."""
|
|
228
|
+
try:
|
|
229
|
+
return self._use_normal_parameters
|
|
230
|
+
except AttributeError:
|
|
231
|
+
return False
|
|
232
|
+
|
|
233
|
+
def set_TeX_report_normal_parameters(self, new):
|
|
234
|
+
new = bool(new)
|
|
235
|
+
self._use_normal_parameters = new
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def TeX_popt(self):
|
|
239
|
+
r"""Create a dictionary with ``(k, v)`` pairs corresponding to parameter values.
|
|
240
|
+
|
|
241
|
+
``(self.argnames, :math:`p_{\mathrm{opt}} \pm \sigma_p`)`` with the
|
|
242
|
+
appropriate uncertainty.
|
|
243
|
+
|
|
244
|
+
See ``set_TeX_trans_argnames`` to translate the argnames for TeX.
|
|
245
|
+
"""
|
|
246
|
+
TeX_popt = super(GaussianLn, self).TeX_popt
|
|
247
|
+
|
|
248
|
+
if self.TeX_report_normal_parameters:
|
|
249
|
+
# psigma = self.psigma
|
|
250
|
+
popt = self.normal_parameters.items()
|
|
251
|
+
# use -9999 to indicate fill value that hasn't been set.
|
|
252
|
+
# I need to figure out how to calculate the transformation
|
|
253
|
+
# of the uncertainty of log normal to normal.
|
|
254
|
+
normal_popt = {k: self.val_uncert_2_string(v, np.nan) for k, v in popt}
|
|
255
|
+
normal_popt = {k: v.split(r" \pm")[0] for k, v in normal_popt.items()}
|
|
256
|
+
|
|
257
|
+
translate = dict(mu=r"\mu", sigma=r"\sigma")
|
|
258
|
+
for k0, k1 in translate.items():
|
|
259
|
+
normal_popt[k1] = normal_popt[k0]
|
|
260
|
+
del normal_popt[k0]
|
|
261
|
+
|
|
262
|
+
TeX_popt.update(normal_popt)
|
|
263
|
+
|
|
264
|
+
return TeX_popt
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r"""Simple linear fit functions.
|
|
3
|
+
|
|
4
|
+
This module defines :class:`~solarwindpy.fitfunctions.core.FitFunction`
|
|
5
|
+
subclasses for straight-line models. They are primarily used for
|
|
6
|
+
quick trend estimation and serve as basic examples of the
|
|
7
|
+
FitFunction interface.
|
|
8
|
+
"""
|
|
9
|
+
import pdb # noqa: F401
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from .core import FitFunction
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Line(FitFunction):
|
|
16
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
17
|
+
"""Create a line fit to ``(xobs, yobs)`` data."""
|
|
18
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def function(self):
|
|
22
|
+
def line(x, m, b):
|
|
23
|
+
return (m * x) + b
|
|
24
|
+
|
|
25
|
+
return line
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def p0(self):
|
|
29
|
+
r"""Calculate the initial guess for the line parameters.
|
|
30
|
+
|
|
31
|
+
If this fails, return :py:meth:`curve_fit`'s default value `None`.
|
|
32
|
+
|
|
33
|
+
Return
|
|
34
|
+
------
|
|
35
|
+
p0 : list
|
|
36
|
+
The initial guesses as [m, b].
|
|
37
|
+
"""
|
|
38
|
+
assert self.sufficient_data
|
|
39
|
+
|
|
40
|
+
x = self.observations.used.x
|
|
41
|
+
y = self.observations.used.y
|
|
42
|
+
dy, dx = np.ediff1d(y), np.ediff1d(x)
|
|
43
|
+
|
|
44
|
+
m = dy / dx
|
|
45
|
+
m = np.median(m)
|
|
46
|
+
b = (m * x) - y
|
|
47
|
+
b = np.median(b)
|
|
48
|
+
|
|
49
|
+
p0 = [m, b]
|
|
50
|
+
|
|
51
|
+
if not (np.all(np.isfinite(dx)) and (np.all(np.abs(dx) > 0))):
|
|
52
|
+
self.logger.warning(f"Slope estimate failed (dx = {dx}).\nReturning None.")
|
|
53
|
+
p0 = None
|
|
54
|
+
|
|
55
|
+
return p0
|
|
56
|
+
|
|
57
|
+
@property
|
|
58
|
+
def TeX_function(self):
|
|
59
|
+
TeX = r"f(x)=m \cdot x + b"
|
|
60
|
+
return TeX
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def x_intercept(self):
|
|
64
|
+
return -self.popt["b"] / self.popt["m"]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class LineXintercept(FitFunction):
|
|
68
|
+
def __init__(self, xobs, yobs, **kwargs):
|
|
69
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def function(self):
|
|
73
|
+
def line(x, m, x0):
|
|
74
|
+
return m * (x - x0)
|
|
75
|
+
|
|
76
|
+
return line
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def p0(self):
|
|
80
|
+
r"""Calculate the initial guess for the line parameters.
|
|
81
|
+
|
|
82
|
+
If this fails, return :py:meth:`curve_fit`'s default value `None`.
|
|
83
|
+
|
|
84
|
+
Return
|
|
85
|
+
------
|
|
86
|
+
p0 : list
|
|
87
|
+
The initial guesses as [m, b].
|
|
88
|
+
"""
|
|
89
|
+
assert self.sufficient_data
|
|
90
|
+
|
|
91
|
+
x = self.observations.used.x
|
|
92
|
+
y = self.observations.used.y
|
|
93
|
+
dy, dx = np.ediff1d(y), np.ediff1d(x)
|
|
94
|
+
|
|
95
|
+
m = dy / dx
|
|
96
|
+
m = np.median(m)
|
|
97
|
+
b = (m * x) - y
|
|
98
|
+
b = np.median(b)
|
|
99
|
+
|
|
100
|
+
x0 = -b / m
|
|
101
|
+
p0 = [m, x0]
|
|
102
|
+
|
|
103
|
+
if not (np.all(np.isfinite(dx)) and (np.all(np.abs(dx) > 0))):
|
|
104
|
+
self.logger.warning(f"Slope estimate failed (dx = {dx}).\nReturning None.")
|
|
105
|
+
p0 = None
|
|
106
|
+
|
|
107
|
+
return p0
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def TeX_function(self):
|
|
111
|
+
TeX = r"f(x)=m \cdot (x - x_0)"
|
|
112
|
+
return TeX
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def y_intercept(self):
|
|
116
|
+
return -self.popt["x0"] * self.popt["m"]
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r""":py:mod:`Gaussian` and related `FitFunction` sublcasses."""
|
|
3
|
+
import pdb # noqa: F401
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
from .core import FitFunction
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Moyal(FitFunction):
|
|
10
|
+
def __init__(self, sigma, xobs, yobs, **kwargs):
|
|
11
|
+
super().__init__(xobs, yobs, **kwargs)
|
|
12
|
+
|
|
13
|
+
# self._sigma = float(sigma)
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def function(self):
|
|
17
|
+
def moyal(x, mu, sigma, A):
|
|
18
|
+
center = x - mu
|
|
19
|
+
# sigma = self.sigma
|
|
20
|
+
ms_sq = (center / sigma) ** 2
|
|
21
|
+
arg0 = 0.5 * (ms_sq - np.exp(ms_sq))
|
|
22
|
+
arg1 = np.exp(arg0)
|
|
23
|
+
out = A * (np.exp(arg1) - 1)
|
|
24
|
+
return out
|
|
25
|
+
|
|
26
|
+
return moyal
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def sigma(self):
|
|
30
|
+
r"""Initial guess for mean value."""
|
|
31
|
+
return self._sigma
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def p0(self):
|
|
35
|
+
r"""Calculate the initial guess for the Gaussian parameters.
|
|
36
|
+
|
|
37
|
+
Return
|
|
38
|
+
------
|
|
39
|
+
p0 : list
|
|
40
|
+
The initial guesses as [mu, sigma, A].
|
|
41
|
+
"""
|
|
42
|
+
assert self.sufficient_data
|
|
43
|
+
|
|
44
|
+
x, y = self.observations.used.x, self.observations.used.y
|
|
45
|
+
mean = (x * y).sum() / y.sum()
|
|
46
|
+
std = np.sqrt(((x - mean) ** 2.0 * y).sum() / y.sum())
|
|
47
|
+
# std = self.sigma
|
|
48
|
+
|
|
49
|
+
try:
|
|
50
|
+
peak = y.max()
|
|
51
|
+
except ValueError as e:
|
|
52
|
+
chk = (
|
|
53
|
+
r"zero-size array to reduction operation maximum "
|
|
54
|
+
"which has no identity"
|
|
55
|
+
)
|
|
56
|
+
if e.message.startswith(chk):
|
|
57
|
+
msg = (
|
|
58
|
+
"There is no maximum of a zero-size array. "
|
|
59
|
+
"Please check input data."
|
|
60
|
+
)
|
|
61
|
+
raise ValueError(msg)
|
|
62
|
+
|
|
63
|
+
p0 = [mean, std, peak]
|
|
64
|
+
return p0
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def TeX_function(self):
|
|
68
|
+
# TeX = r"f(x)=\frac{1}{\sqrt{2 \pi} \sigma} A\cdot e^{-\frac{1}{2} (\frac{x-\mu}{\sigma})^2}"
|
|
69
|
+
TeX = r"f(x)=A \cdot e^{-\frac{1}{2} (\frac{x-\mu}{\sigma})^2 - e^{\frac{x-\mu}{\sigma}}^2}"
|
|
70
|
+
TeX = "lala"
|
|
71
|
+
return TeX
|