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,804 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Alfvenic turbulence diagnostics using Elsasser variables.
|
|
3
|
+
|
|
4
|
+
Notes
|
|
5
|
+
-----
|
|
6
|
+
The implementation follows the formalism outlined in Bruno & Carbone [1].
|
|
7
|
+
Lloyd Woodham <https://orcid.org/0000-0003-2845-4250> helped me define these
|
|
8
|
+
calculations at the 2018 AGU Fall Meeting and understand [1]. Please cite [3]
|
|
9
|
+
if using this module.
|
|
10
|
+
|
|
11
|
+
References
|
|
12
|
+
----------
|
|
13
|
+
[1] Bruno, R., & Carbone, V. (2013). *Living Reviews in Solar Physics*,
|
|
14
|
+
10(1), 1–208. https://doi.org/10.12942/lrsp-2013-2
|
|
15
|
+
[2] Telloni, D., & Bruno, R. (2016). *Monthly Notices of the Royal Astronomical
|
|
16
|
+
Society: Letters*, 463(1), L79–L83. https://doi.org/10.1093/mnrasl/slw135
|
|
17
|
+
[3] Woodham, L. D., Wicks, R. T., Verscharen, D., & Owen, C. J. (2018).
|
|
18
|
+
*Astrophys. J.*, 856, 49.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
import numpy as np
|
|
23
|
+
import pandas as pd
|
|
24
|
+
|
|
25
|
+
from collections import namedtuple
|
|
26
|
+
|
|
27
|
+
# We rely on views via DataFrame.xs to reduce memory size and do not
|
|
28
|
+
# `.copy(deep=True)`, so we want to make sure that this doesn't
|
|
29
|
+
# accidentally cause a problem.
|
|
30
|
+
|
|
31
|
+
from . import base
|
|
32
|
+
|
|
33
|
+
AlvenicTurbAveraging = namedtuple("AlvenicTurbAveraging", "window,min_periods")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class AlfvenicTurbulence(base.Core):
|
|
37
|
+
r"""Alfv\'enic turbulence diagnostics using Elsasser variables.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
velocity : :class:`pandas.DataFrame`
|
|
42
|
+
Plasma velocity in the same basis as ``bfield``.
|
|
43
|
+
bfield : :class:`pandas.DataFrame`
|
|
44
|
+
Magnetic field in the same basis as ``velocity``.
|
|
45
|
+
rho : :class:`pandas.Series`
|
|
46
|
+
Mass density used for normalising ``bfield``.
|
|
47
|
+
species : str
|
|
48
|
+
Species string used when converting to Alfv\'en units.
|
|
49
|
+
|
|
50
|
+
Notes
|
|
51
|
+
-----
|
|
52
|
+
Implementation follows the formalism of Bruno & Carbone (2013).
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
velocity,
|
|
58
|
+
bfield,
|
|
59
|
+
rho,
|
|
60
|
+
species,
|
|
61
|
+
raffaella_version=False,
|
|
62
|
+
sc_vector=None,
|
|
63
|
+
**kwargs,
|
|
64
|
+
):
|
|
65
|
+
r"""Initialize an :py:class:`AlfvenicTurbulence` object.
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
velocity: pd.DataFrame
|
|
70
|
+
Vector velocity measurments.
|
|
71
|
+
bfield: pd.DataFrame
|
|
72
|
+
Vector mangetic field measurements.
|
|
73
|
+
rho: pd.Series
|
|
74
|
+
Mass density measurments, used to put `bfield` into Alfven units.
|
|
75
|
+
kwargs:
|
|
76
|
+
Passed to `rolling` method when mean-subtracing in `set_data`.
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
super(AlfvenicTurbulence, self).__init__()
|
|
80
|
+
self.set_data(
|
|
81
|
+
velocity,
|
|
82
|
+
bfield,
|
|
83
|
+
rho,
|
|
84
|
+
species,
|
|
85
|
+
raffaella_version=raffaella_version,
|
|
86
|
+
sc_vector=sc_vector,
|
|
87
|
+
**kwargs,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def data(self):
|
|
92
|
+
r"""Mean-subtracted quantities used to calculated Elsasser variables."""
|
|
93
|
+
return self._data
|
|
94
|
+
|
|
95
|
+
@property
|
|
96
|
+
def averaging_info(self):
|
|
97
|
+
r"""Averaging window and minimum number of measurements / average used.
|
|
98
|
+
|
|
99
|
+
In calculating background component in :math:`\delta B` and :math:`\delta v`.
|
|
100
|
+
"""
|
|
101
|
+
return self._averaging_info
|
|
102
|
+
|
|
103
|
+
@property
|
|
104
|
+
def measurements(self):
|
|
105
|
+
r"""Measurements used to calcualte mean-subtracted `data`."""
|
|
106
|
+
return self._measurements
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def velocity(self):
|
|
110
|
+
r"""Velocity fluctuations (:math:`\delta v`) in Plasma's v-units."""
|
|
111
|
+
return self.data.loc[:, "v"]
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def v(self):
|
|
115
|
+
r"""Shortcut for :py:attr:`velocity`"""
|
|
116
|
+
return self.velocity
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def bfield(self):
|
|
120
|
+
r"""B field fluctuations (:math:`\delta b`) in Alfven units."""
|
|
121
|
+
# return self.data.loc[:, "b"]
|
|
122
|
+
b = self.data.loc[:, "b"]
|
|
123
|
+
polarity = self.polarity
|
|
124
|
+
if polarity is not None:
|
|
125
|
+
self.logger.warning("Rectifying B")
|
|
126
|
+
b = b.multiply(polarity, axis=0)
|
|
127
|
+
# b = b.copy(deep=True)
|
|
128
|
+
# b.loc[:, ["x", "y"]] = b.loc[:, ["x", "y"]].multiply(polarity, axis=0)
|
|
129
|
+
return b
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def b(self):
|
|
133
|
+
r"""Shortcut for :py:attr:`bfield`."""
|
|
134
|
+
return self.bfield
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def polarity(self):
|
|
138
|
+
r"""Magnetic field polarity."""
|
|
139
|
+
return self._polarity
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def species(self):
|
|
143
|
+
r"""Species used to create :class:`AlfvenicTurbulence`.
|
|
144
|
+
|
|
145
|
+
Defines mass density in Alfven units.
|
|
146
|
+
"""
|
|
147
|
+
return self._species
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def z_plus(self):
|
|
151
|
+
r""":math:`z^+` Elsasser variable."""
|
|
152
|
+
zp = self.v.add(self.b, axis=1)
|
|
153
|
+
return zp
|
|
154
|
+
|
|
155
|
+
@property
|
|
156
|
+
def zp(self):
|
|
157
|
+
r"""Shortcut for :py:attr:`z_plus`."""
|
|
158
|
+
return self.z_plus
|
|
159
|
+
|
|
160
|
+
@property
|
|
161
|
+
def z_minus(self):
|
|
162
|
+
r""":math:`z^-` Elsasser variable."""
|
|
163
|
+
zm = self.v.subtract(self.b, axis=1)
|
|
164
|
+
return zm
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def zm(self):
|
|
168
|
+
r"""Shortcut for :py:attr:`z_minus`."""
|
|
169
|
+
return self.z_minus
|
|
170
|
+
|
|
171
|
+
@property
|
|
172
|
+
def e_plus(self):
|
|
173
|
+
r"""Energy contained in :math:`z^+`."""
|
|
174
|
+
ep = 0.5 * self.zp.pow(2).sum(axis=1)
|
|
175
|
+
return ep
|
|
176
|
+
|
|
177
|
+
@property
|
|
178
|
+
def ep(self):
|
|
179
|
+
r"""Shortcut for :py:attr:`e_plus`."""
|
|
180
|
+
return self.e_plus
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def e_minus(self):
|
|
184
|
+
r"""Energy contained in :math:`z^-`."""
|
|
185
|
+
em = 0.5 * self.zm.pow(2).sum(axis=1)
|
|
186
|
+
return em
|
|
187
|
+
|
|
188
|
+
@property
|
|
189
|
+
def em(self):
|
|
190
|
+
r"""Shortcut for :py:attr:`e_minus`."""
|
|
191
|
+
return self.e_minus
|
|
192
|
+
|
|
193
|
+
@property
|
|
194
|
+
def kinetic_energy(self):
|
|
195
|
+
r"""Energy contained in velocity fluctuations :math:`\frac{1}{2}v^2`."""
|
|
196
|
+
ev = 0.5 * self.v.pow(2).sum(axis=1)
|
|
197
|
+
return ev
|
|
198
|
+
|
|
199
|
+
@property
|
|
200
|
+
def ev(self):
|
|
201
|
+
r"""Shortcut for :py:attr:`E_v = kinetic_energy`."""
|
|
202
|
+
return self.kinetic_energy
|
|
203
|
+
|
|
204
|
+
@property
|
|
205
|
+
def magnetic_energy(self):
|
|
206
|
+
r"""Energy contained in magnetic field fluctuations
|
|
207
|
+
|
|
208
|
+
:math:`E_b = \frac{1}{2}b^2`."""
|
|
209
|
+
eb = 0.5 * self.b.pow(2).sum(axis=1)
|
|
210
|
+
return eb
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def eb(self):
|
|
214
|
+
r"""Shortcut for :py:attr:`magnetic_energy`."""
|
|
215
|
+
return self.magnetic_energy
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
def total_energy(self):
|
|
219
|
+
r"""Total energy :math:`E_T = E_v + E_b`."""
|
|
220
|
+
return self.ev.add(self.eb, axis=0)
|
|
221
|
+
|
|
222
|
+
@property
|
|
223
|
+
def etot(self):
|
|
224
|
+
r"""Shortcut for :py:attr:`total_energy`."""
|
|
225
|
+
return self.total_energy
|
|
226
|
+
|
|
227
|
+
@property
|
|
228
|
+
def residual_energy(self):
|
|
229
|
+
r"""Residual energy :math:`E_R = E_v - E_b`."""
|
|
230
|
+
return self.ev.subtract(self.eb, axis=0)
|
|
231
|
+
|
|
232
|
+
@property
|
|
233
|
+
def eres(self):
|
|
234
|
+
r"""Shortcut for :py:attr:`residual_energy`."""
|
|
235
|
+
return self.residual_energy
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def normalized_residual_energy(self):
|
|
239
|
+
r"""Normalized residual energy :py:attr:`E_R/E_T`."""
|
|
240
|
+
return self.eres.divide(self.etot, axis=0)
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
def eres_norm(self):
|
|
244
|
+
r"""Shortcut for :py:attr:`normalized_residual_energy`."""
|
|
245
|
+
return self.normalized_residual_energy
|
|
246
|
+
|
|
247
|
+
@property
|
|
248
|
+
def sigma_r(self):
|
|
249
|
+
r"""Shortcut for :py:attr:`normalized_residual_energy`."""
|
|
250
|
+
return self.normalized_residual_energy
|
|
251
|
+
|
|
252
|
+
@property
|
|
253
|
+
def cross_helicity(self):
|
|
254
|
+
r"""Cross helicity :math:`\frac{1}{2} \delta v \cdot \delta b`."""
|
|
255
|
+
v = self.v
|
|
256
|
+
b = self.b
|
|
257
|
+
c = 0.5 * v.multiply(b).sum(axis=1)
|
|
258
|
+
return c
|
|
259
|
+
|
|
260
|
+
@property
|
|
261
|
+
def normalized_cross_helicity(self):
|
|
262
|
+
r"""Normalized cross helicity :math:`\frac{e^+ - e^-}{e^+ + e^-}`."""
|
|
263
|
+
ep = self.ep
|
|
264
|
+
em = self.em
|
|
265
|
+
num = ep.subtract(em)
|
|
266
|
+
den = ep.add(em)
|
|
267
|
+
out = num.divide(den)
|
|
268
|
+
return out
|
|
269
|
+
|
|
270
|
+
@property
|
|
271
|
+
def sigma_c(self):
|
|
272
|
+
r"""Shortcut to :py:attr:`normalized_cross_helicity`."""
|
|
273
|
+
return self.normalized_cross_helicity
|
|
274
|
+
|
|
275
|
+
@property
|
|
276
|
+
def alfven_ratio(self):
|
|
277
|
+
r"""Alfv\'en ratio :math:`E_v/E_b`."""
|
|
278
|
+
return self.ev.divide(self.eb, axis=0)
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def rA(self):
|
|
282
|
+
r"""Shortcut to :py:attr:`alfven_ratio`."""
|
|
283
|
+
return self.alfven_ratio
|
|
284
|
+
|
|
285
|
+
@property
|
|
286
|
+
def elsasser_ratio(self):
|
|
287
|
+
r"""Elsasser ratio :math:`e^-/e^+`."""
|
|
288
|
+
return self.em.divide(self.ep, axis=0)
|
|
289
|
+
|
|
290
|
+
@property
|
|
291
|
+
def rE(self):
|
|
292
|
+
r"""Shortcut to :py:attr:`elsasser_ratio`."""
|
|
293
|
+
return self.elsasser_ratio
|
|
294
|
+
|
|
295
|
+
def set_data(
|
|
296
|
+
self,
|
|
297
|
+
v_in,
|
|
298
|
+
b_in,
|
|
299
|
+
rho,
|
|
300
|
+
species,
|
|
301
|
+
raffaella_version=False,
|
|
302
|
+
sc_vector=None,
|
|
303
|
+
**kwargs,
|
|
304
|
+
):
|
|
305
|
+
r"""Set data for the class, performing routine formatting checks.
|
|
306
|
+
|
|
307
|
+
The `auto_reindex` kwarg can be set to False for batch analysis. So
|
|
308
|
+
that, if running a large batch of analysis on the same data, one can
|
|
309
|
+
reindex once outside of this class and avoid many unnecessary reindexing
|
|
310
|
+
cases within it. Be sure to carefully check your reindexing so as to not
|
|
311
|
+
introduce lots of NaNs. I ran into that bug when first writing this
|
|
312
|
+
class.
|
|
313
|
+
"""
|
|
314
|
+
|
|
315
|
+
species = self._clean_species_for_setting(species)
|
|
316
|
+
if not isinstance(v_in.index, pd.DatetimeIndex):
|
|
317
|
+
raise TypeError
|
|
318
|
+
if not isinstance(b_in.index, pd.DatetimeIndex):
|
|
319
|
+
raise TypeError
|
|
320
|
+
if not isinstance(rho.index, pd.DatetimeIndex):
|
|
321
|
+
raise TypeError
|
|
322
|
+
|
|
323
|
+
if not v_in.index.equals(b_in.index):
|
|
324
|
+
self.logger.warn("v and b have unequal indices. Results may be unexpected.")
|
|
325
|
+
if not v_in.index.equals(rho.index):
|
|
326
|
+
self.logger.warn(
|
|
327
|
+
"""v and rho have unequal indices. Results may be
|
|
328
|
+
unexpected."""
|
|
329
|
+
)
|
|
330
|
+
# Convert b -> Alfven units before averaging as in Bruno and Carbone
|
|
331
|
+
# [2013], Section B.3.1.
|
|
332
|
+
# Based on my read of Bruno and Carbone's definition in B.3.1 (p.166),
|
|
333
|
+
# we first define the magnetic field in Alfven units. Then we calculate
|
|
334
|
+
# averages. Note that I took the other option in my test cases in
|
|
335
|
+
# `TS-analysis` project. (20181120)
|
|
336
|
+
coef = self.units.b / ( # Convert b -> Alfven units.
|
|
337
|
+
np.sqrt(self.units.rho * self.constants.misc.mu0) * self.units.v
|
|
338
|
+
)
|
|
339
|
+
b_ca_units = b_in.divide(rho.pipe(np.sqrt), axis=0).multiply(coef)
|
|
340
|
+
|
|
341
|
+
data = (
|
|
342
|
+
pd.concat({"v": v_in, "b": b_ca_units}, axis=1, names=["M"], sort=True)
|
|
343
|
+
.sort_index(axis=1)
|
|
344
|
+
.copy(deep=True)
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# if auto_reindex:
|
|
348
|
+
# idx = v_in.index.union(b_in.index)
|
|
349
|
+
# i0 = idx.min()
|
|
350
|
+
# i1 = idx.max() + 1 # `stop` excludes `i1`, so use `i1 + 1`.
|
|
351
|
+
# idx = pd.RangeIndex(start=i0, stop=i1, step=1)
|
|
352
|
+
#
|
|
353
|
+
# v = v_in.reindex(idx, axis=0)
|
|
354
|
+
# b = b_ca_units.reindex(idx, axis=0)
|
|
355
|
+
#
|
|
356
|
+
# else:
|
|
357
|
+
# v = v_in
|
|
358
|
+
# b = b_ca_units
|
|
359
|
+
|
|
360
|
+
# print("<set_data>",
|
|
361
|
+
# "<species>: %s" % species,
|
|
362
|
+
# "<v_in>", type(v_in), v_in,
|
|
363
|
+
# "<v>", type(v), v,
|
|
364
|
+
# "<rho>", type(rho), rho,
|
|
365
|
+
# "<b_in>", type(b_in), b_in,
|
|
366
|
+
# "<coef>: %s" % coef,
|
|
367
|
+
# "<b>", type(b), b,
|
|
368
|
+
# sep="\n",
|
|
369
|
+
# end="\n\n")
|
|
370
|
+
|
|
371
|
+
polarity = None
|
|
372
|
+
if raffaella_version:
|
|
373
|
+
self.logger.warning("Running Raffaella's version")
|
|
374
|
+
if sc_vector is None:
|
|
375
|
+
raise ValueError(
|
|
376
|
+
"SC-Sun distance required to peform Raffaella's version."
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
# # Drop normal component
|
|
380
|
+
# data = data.drop("z", axis=1, level="C").copy(deep=True)
|
|
381
|
+
|
|
382
|
+
# Convert GSE -> RTN
|
|
383
|
+
data = data.multiply(
|
|
384
|
+
pd.Series({"x": -1, "y": -1, "z": 1}), axis=1, level="C"
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
# Project along nominal Parker Spiral
|
|
388
|
+
omega = 2.865e-6 # rad/s
|
|
389
|
+
pos = sc_vector.data.pos.copy(deep=True)
|
|
390
|
+
r_rtn = (
|
|
391
|
+
pos.loc[:, ["x", "y", "z"]]
|
|
392
|
+
.pow(2)
|
|
393
|
+
.sum(axis=1, skipna=False)
|
|
394
|
+
.pipe(np.sqrt)
|
|
395
|
+
)
|
|
396
|
+
rho_rtn = (
|
|
397
|
+
pos.loc[:, ["x", "y"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
|
|
398
|
+
)
|
|
399
|
+
cos_colat = rho_rtn.divide(r_rtn)
|
|
400
|
+
# cos_colat = 1
|
|
401
|
+
|
|
402
|
+
r = sc_vector.distance2sun * sc_vector.units.distance2sun * 1e-3 # [km]
|
|
403
|
+
|
|
404
|
+
correction = r.multiply(cos_colat, axis=0).multiply(
|
|
405
|
+
omega
|
|
406
|
+
) # [arc length speed] = [km/s]
|
|
407
|
+
vt = data.loc[:, ("v", "y")].subtract(correction)
|
|
408
|
+
data.loc[:, ("v", "y")] = vt
|
|
409
|
+
# vy = data.loc[:, ("v", "y")].add(correction)
|
|
410
|
+
# data.loc[:, ("v", "y")] = vy
|
|
411
|
+
|
|
412
|
+
polarity = (
|
|
413
|
+
data.loc[:, "v"]
|
|
414
|
+
.multiply(data.loc[:, "b"], axis=1)
|
|
415
|
+
.drop("z", axis=1)
|
|
416
|
+
.sum(axis=1)
|
|
417
|
+
.pipe(np.sign)
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
window = kwargs.pop("window", "15min")
|
|
421
|
+
min_periods = kwargs.pop("min_periods", 5)
|
|
422
|
+
|
|
423
|
+
rolled = data.rolling(window, min_periods=min_periods, **kwargs)
|
|
424
|
+
agged = rolled.agg("mean")
|
|
425
|
+
deltas = data.subtract(agged, axis=1)
|
|
426
|
+
|
|
427
|
+
data.name = "measurements"
|
|
428
|
+
deltas.name = "deltas"
|
|
429
|
+
|
|
430
|
+
self._measurements = data
|
|
431
|
+
self._data = deltas
|
|
432
|
+
self._polarity = polarity
|
|
433
|
+
self._species = species
|
|
434
|
+
self._averaging_info = AlvenicTurbAveraging(window, min_periods)
|
|
435
|
+
|
|
436
|
+
def _clean_species_for_setting(self, species):
|
|
437
|
+
if not isinstance(species, str):
|
|
438
|
+
msg = "%s.species must be a single species w/ an optional `+` or `,`"
|
|
439
|
+
raise TypeError(msg % self.__class__.__name__)
|
|
440
|
+
if species.count(",") > 1:
|
|
441
|
+
msg = "%s.species can contain at most one `,`\nspecies: %s"
|
|
442
|
+
raise ValueError(msg % (self.__class__.__name__, species))
|
|
443
|
+
|
|
444
|
+
species = ",".join(
|
|
445
|
+
["+".join(tuple(sorted(s.split("+")))) for s in species.split(",")]
|
|
446
|
+
)
|
|
447
|
+
return species
|
|
448
|
+
|
|
449
|
+
|
|
450
|
+
# lass AlfvenicTurbulenceDAmicis(base.Core):
|
|
451
|
+
# r"""Handle and calculate Alfvenic turbulence quantities using the Elsasser
|
|
452
|
+
# variables following R D'Amicis' email (20240214).
|
|
453
|
+
#
|
|
454
|
+
# Parameters
|
|
455
|
+
# ----------
|
|
456
|
+
# velocity : pd.DataFrame, pd.Series (?)
|
|
457
|
+
# The velocity vector in the same basis as `bfield`.
|
|
458
|
+
# Can be a single species, a CoM species, or a differential flow. The
|
|
459
|
+
# differential flow case is an area of curiosity for me and I do not
|
|
460
|
+
# suggest passing it as an input.
|
|
461
|
+
# Expect [v] = km/s (i.e. default stored in `units_constants.Units`).
|
|
462
|
+
# bfield : pd.DataFrame, pd.Series (?)
|
|
463
|
+
# Magnetic field vector in the same basis as `velocity`.
|
|
464
|
+
# Expect [b] = nT (i.e. default stored in `units_contants.Units`).
|
|
465
|
+
# rho : pd.Series
|
|
466
|
+
# The total mass density of the plasma used to define velocity.
|
|
467
|
+
# Expect [rho] = m_p / cm^3 (i.e. default stored in
|
|
468
|
+
# `units_constants.Units`).
|
|
469
|
+
# species: str
|
|
470
|
+
# The species string. Can contain `+`. Can contain at most one `,`.
|
|
471
|
+
#
|
|
472
|
+
# Attributes
|
|
473
|
+
# ----------
|
|
474
|
+
# data, species, z_plus, zp, z_minus, zm, e_plus, ep,
|
|
475
|
+
# e_minus, em, total_energy, etot,
|
|
476
|
+
# residual_energy, eres, normalized_residual_energy, eres_norm, sigma_r,
|
|
477
|
+
# cross_helicity, normalized_cross_helicity, sigma_c, alfven_ratio, rA,
|
|
478
|
+
# elsasser_ratio, rE
|
|
479
|
+
#
|
|
480
|
+
# Methods
|
|
481
|
+
# -------
|
|
482
|
+
# set_data
|
|
483
|
+
#
|
|
484
|
+
# Notes
|
|
485
|
+
# -----
|
|
486
|
+
#
|
|
487
|
+
# """
|
|
488
|
+
#
|
|
489
|
+
# def __init__(self, velocity, bfield, rho, species, sc_vector, **kwargs):
|
|
490
|
+
# r"""Initialize an :py:class:`AlfvenicTurbulence` object.
|
|
491
|
+
#
|
|
492
|
+
# Parameters
|
|
493
|
+
# ----------
|
|
494
|
+
# velocity: pd.DataFrame
|
|
495
|
+
# Vector velocity measurments.
|
|
496
|
+
# bfield: pd.DataFrame
|
|
497
|
+
# Vector mangetic field measurements.
|
|
498
|
+
# rho: pd.Series
|
|
499
|
+
# Mass density measurments, used to put `bfield` into Alfven units.
|
|
500
|
+
# kwargs:
|
|
501
|
+
# Passed to `rolling` method when mean-subtracing in `set_data`.
|
|
502
|
+
# """
|
|
503
|
+
# # print("<Module>",
|
|
504
|
+
# # "__init__",
|
|
505
|
+
# # sep="\n",
|
|
506
|
+
# # end="\n")
|
|
507
|
+
#
|
|
508
|
+
# super(AlfvenicTurbulenceDAmicis, self).__init__()
|
|
509
|
+
# self.set_data(velocity, bfield, rho, species, sc_vector, **kwargs)
|
|
510
|
+
#
|
|
511
|
+
# @property
|
|
512
|
+
# def data(self):
|
|
513
|
+
# r"""Mean-subtracted quantities used to calculated Elsasser variables.
|
|
514
|
+
# """
|
|
515
|
+
# return self._data
|
|
516
|
+
#
|
|
517
|
+
# @property
|
|
518
|
+
# def averaging_info(self):
|
|
519
|
+
# r"""Averaging window and minimum number of measurements / average used
|
|
520
|
+
# in calculating background component in :math:`\delta B` and :math:`\delta v`.
|
|
521
|
+
# """
|
|
522
|
+
# return self._averaging_info
|
|
523
|
+
#
|
|
524
|
+
# @property
|
|
525
|
+
# def measurements(self):
|
|
526
|
+
# r"""Measurements used to calcualte mean-subtracted `data`.
|
|
527
|
+
# """
|
|
528
|
+
# return self._measurements
|
|
529
|
+
#
|
|
530
|
+
# @property
|
|
531
|
+
# def polarity(self):
|
|
532
|
+
# r"""Magnetic field polarity.
|
|
533
|
+
# """
|
|
534
|
+
# return self._polarity
|
|
535
|
+
#
|
|
536
|
+
# @property
|
|
537
|
+
# def species(self):
|
|
538
|
+
# r"""Species used to create `AlfvenicTurbulence`. Defines mass density in Alfven
|
|
539
|
+
# units.
|
|
540
|
+
# """
|
|
541
|
+
# return self._species
|
|
542
|
+
#
|
|
543
|
+
# @property
|
|
544
|
+
# def z_plus(self):
|
|
545
|
+
# r"""Z+ Elsasser variable.
|
|
546
|
+
# """
|
|
547
|
+
# zp = self.data.loc[:, "zp"]
|
|
548
|
+
# return zp
|
|
549
|
+
#
|
|
550
|
+
# @property
|
|
551
|
+
# def zp(self):
|
|
552
|
+
# r"""Shortcut for `AlfvenicTurbulence.z_plus`.
|
|
553
|
+
# """
|
|
554
|
+
# return self.z_plus
|
|
555
|
+
#
|
|
556
|
+
# @property
|
|
557
|
+
# def z_minus(self):
|
|
558
|
+
# r"""Z- Elsasser variable.
|
|
559
|
+
# """
|
|
560
|
+
# zm = self.data.loc[:, "zm"]
|
|
561
|
+
# return zm
|
|
562
|
+
#
|
|
563
|
+
# @property
|
|
564
|
+
# def zm(self):
|
|
565
|
+
# r"""Shortcut for `AlfvenicTurbulence.z_minus`.
|
|
566
|
+
# """
|
|
567
|
+
# return self.z_minus
|
|
568
|
+
#
|
|
569
|
+
# @property
|
|
570
|
+
# def e_plus(self):
|
|
571
|
+
# # I took the averages before I created the +/-z quantities in my
|
|
572
|
+
# # previous test cases. Based on a more detailed read of Bruno and
|
|
573
|
+
# # Carbone, I calculate +/-z before I take averages. Note that because
|
|
574
|
+
# # I am adding v and b, the differene shouldn't matter.
|
|
575
|
+
# ep = 0.5 * self.zp.pow(2).sum(axis=1)
|
|
576
|
+
# return ep
|
|
577
|
+
#
|
|
578
|
+
# @property
|
|
579
|
+
# def ep(self):
|
|
580
|
+
# return self.e_plus
|
|
581
|
+
#
|
|
582
|
+
# @property
|
|
583
|
+
# def e_minus(self):
|
|
584
|
+
# em = 0.5 * self.zm.pow(2).sum(axis=1)
|
|
585
|
+
# return em
|
|
586
|
+
#
|
|
587
|
+
# @property
|
|
588
|
+
# def em(self):
|
|
589
|
+
# return self.e_minus
|
|
590
|
+
#
|
|
591
|
+
# # @property
|
|
592
|
+
# # def kinetic_energy(self):
|
|
593
|
+
# # ev = 0.5 * self.v.pow(2).sum(axis=1)
|
|
594
|
+
# # return ev
|
|
595
|
+
#
|
|
596
|
+
# # @property
|
|
597
|
+
# # def ev(self):
|
|
598
|
+
# # return self.kinetic_energy
|
|
599
|
+
#
|
|
600
|
+
# # @property
|
|
601
|
+
# # def magnetic_energy(self):
|
|
602
|
+
# # eb = 0.5 * self.b.pow(2).sum(axis=1)
|
|
603
|
+
# # return eb
|
|
604
|
+
#
|
|
605
|
+
# # @property
|
|
606
|
+
# # def eb(self):
|
|
607
|
+
# # return self.magnetic_energy
|
|
608
|
+
#
|
|
609
|
+
# # @property
|
|
610
|
+
# # def total_energy(self):
|
|
611
|
+
# # return self.ev.add(self.eb, axis=0)
|
|
612
|
+
#
|
|
613
|
+
# # @property
|
|
614
|
+
# # def etot(self):
|
|
615
|
+
# # return self.total_energy
|
|
616
|
+
#
|
|
617
|
+
# # @property
|
|
618
|
+
# # def residual_energy(self):
|
|
619
|
+
# # return self.ev.subtract(self.eb, axis=0)
|
|
620
|
+
#
|
|
621
|
+
# # @property
|
|
622
|
+
# # def eres(self):
|
|
623
|
+
# # return self.residual_energy
|
|
624
|
+
#
|
|
625
|
+
# # @property
|
|
626
|
+
# # def normalized_residual_energy(self):
|
|
627
|
+
# # return self.eres.divide(self.etot, axis=0)
|
|
628
|
+
#
|
|
629
|
+
# # @property
|
|
630
|
+
# # def eres_norm(self):
|
|
631
|
+
# # return self.normalized_residual_energy
|
|
632
|
+
#
|
|
633
|
+
# # @property
|
|
634
|
+
# # def sigma_r(self):
|
|
635
|
+
# # return self.normalized_residual_energy
|
|
636
|
+
#
|
|
637
|
+
# # @property
|
|
638
|
+
# # def cross_helicity(self):
|
|
639
|
+
# # v = self.v
|
|
640
|
+
# # b = self.b
|
|
641
|
+
# # c = 0.5 * v.multiply(b).sum(axis=1)
|
|
642
|
+
# # return c
|
|
643
|
+
#
|
|
644
|
+
# @property
|
|
645
|
+
# def normalized_cross_helicity(self):
|
|
646
|
+
# ep = self.ep
|
|
647
|
+
# em = self.em
|
|
648
|
+
# num = ep.subtract(em)
|
|
649
|
+
# den = ep.add(em)
|
|
650
|
+
# out = num.divide(den)
|
|
651
|
+
# return out
|
|
652
|
+
#
|
|
653
|
+
# @property
|
|
654
|
+
# def sigma_c(self):
|
|
655
|
+
# """Normalized cross helicity.
|
|
656
|
+
#
|
|
657
|
+
# Returns
|
|
658
|
+
# -------
|
|
659
|
+
# pd.Series
|
|
660
|
+
# Sigma_c parameter.
|
|
661
|
+
# """
|
|
662
|
+
# return self.normalized_cross_helicity
|
|
663
|
+
#
|
|
664
|
+
# # @property
|
|
665
|
+
# # def alfven_ratio(self):
|
|
666
|
+
# # return self.ev.divide(self.eb, axis=0)
|
|
667
|
+
#
|
|
668
|
+
# # @property
|
|
669
|
+
# # def rA(self):
|
|
670
|
+
# # return self.alfven_ratio
|
|
671
|
+
#
|
|
672
|
+
# @property
|
|
673
|
+
# def elsasser_ratio(self):
|
|
674
|
+
# return self.em.divide(self.ep, axis=0)
|
|
675
|
+
#
|
|
676
|
+
# @property
|
|
677
|
+
# def rE(self):
|
|
678
|
+
# """Elsasser ratio.
|
|
679
|
+
#
|
|
680
|
+
# Returns
|
|
681
|
+
# -------
|
|
682
|
+
# pd.Series
|
|
683
|
+
# Elsasser ratio parameter.
|
|
684
|
+
# """
|
|
685
|
+
# return self.elsasser_ratio
|
|
686
|
+
#
|
|
687
|
+
# def set_data(self, v_in, b_in, rho, species, sc_vector, **kwargs):
|
|
688
|
+
# r"""The `auto_reindex` kwarg can be set to False so that, if running a
|
|
689
|
+
# large batch of analysis on the same data, one can reindex once outside
|
|
690
|
+
# of this class and avoid many unnecessary reindexing cases within it.
|
|
691
|
+
#
|
|
692
|
+
# Be sure to carefully check your reindexing so as to not introduce lots
|
|
693
|
+
# of NaNs. I ran into that bug when first writing this class.
|
|
694
|
+
# """
|
|
695
|
+
#
|
|
696
|
+
# species = self._clean_species_for_setting(species)
|
|
697
|
+
# if not isinstance(v_in.index, pd.DatetimeIndex):
|
|
698
|
+
# raise TypeError
|
|
699
|
+
# if not isinstance(b_in.index, pd.DatetimeIndex):
|
|
700
|
+
# raise TypeError
|
|
701
|
+
# if not isinstance(rho.index, pd.DatetimeIndex):
|
|
702
|
+
# raise TypeError
|
|
703
|
+
#
|
|
704
|
+
# if not v_in.index.equals(b_in.index):
|
|
705
|
+
# self.logger.warn("v and b have unequal indices. Results may be unexpected.")
|
|
706
|
+
# if not v_in.index.equals(rho.index):
|
|
707
|
+
# self.logger.warn(
|
|
708
|
+
# """v and rho have unequal indices. Results may be
|
|
709
|
+
# unexpected."""
|
|
710
|
+
# )
|
|
711
|
+
# # auto_reindex = bool(auto_reindex)
|
|
712
|
+
#
|
|
713
|
+
# data = (
|
|
714
|
+
# pd.concat({"v": v_in, "b": b_in}, axis=1, names=["M"], sort=True)
|
|
715
|
+
# .sort_index(axis=1)
|
|
716
|
+
# .copy(deep=True)
|
|
717
|
+
# )
|
|
718
|
+
#
|
|
719
|
+
# # print("1", data.head().round(3), sep="\n", end="\n\n")
|
|
720
|
+
#
|
|
721
|
+
# # Convert GSE -> RTN
|
|
722
|
+
# data = data.multiply(pd.Series({"x": -1, "y": -1, "z": 1}), axis=1, level="C")
|
|
723
|
+
#
|
|
724
|
+
# # print("2", data.head().round(3), sep="\n", end="\n\n")
|
|
725
|
+
#
|
|
726
|
+
# # Project along nominal Parker Spiral
|
|
727
|
+
# omega = 2.865e-6 # rad/s
|
|
728
|
+
# pos = sc_vector.data.pos.copy(deep=True)
|
|
729
|
+
# r_rtn = (
|
|
730
|
+
# pos.loc[:, ["x", "y", "z"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
|
|
731
|
+
# )
|
|
732
|
+
# rho_rtn = pos.loc[:, ["x", "y"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
|
|
733
|
+
# cos_colat = rho_rtn.divide(r_rtn)
|
|
734
|
+
#
|
|
735
|
+
# r = sc_vector.distance2sun * sc_vector.units.distance2sun * 1e-3 # [km]
|
|
736
|
+
#
|
|
737
|
+
# correction = r.multiply(cos_colat, axis=0).multiply(
|
|
738
|
+
# omega
|
|
739
|
+
# ) # [arc length speed] = [km/s]
|
|
740
|
+
# vt = data.loc[:, ("v", "y")].subtract(correction)
|
|
741
|
+
# data.loc[:, ("v", "y")] = vt
|
|
742
|
+
#
|
|
743
|
+
# # # print("3", data.head().round(3), sep="\n", end="\n\n")
|
|
744
|
+
#
|
|
745
|
+
# polarity = (
|
|
746
|
+
# data.loc[:, "v"]
|
|
747
|
+
# .multiply(data.loc[:, "b"], axis=1)
|
|
748
|
+
# # .drop(["x", "y"], axis=1)
|
|
749
|
+
# .drop("z", axis=1)
|
|
750
|
+
# .sum(axis=1)
|
|
751
|
+
# .pipe(np.sign)
|
|
752
|
+
# )
|
|
753
|
+
#
|
|
754
|
+
# coef = self.units.b / ( # Convert b -> Alfven units.
|
|
755
|
+
# np.sqrt(self.units.rho * self.constants.misc.mu0) * self.units.v
|
|
756
|
+
# )
|
|
757
|
+
# coef = rho.pow(-0.5).multiply(coef)
|
|
758
|
+
# polarity_coef = polarity.multiply(coef)
|
|
759
|
+
#
|
|
760
|
+
# # print("Coef", polarity_coef.head(), sep="\n", end="\n\n")
|
|
761
|
+
#
|
|
762
|
+
# b_calc = data.loc[:, "b"].multiply(polarity_coef, axis=0)
|
|
763
|
+
# # b_calc = data.loc[:, "b"].multiply(coef, axis=0)
|
|
764
|
+
# v_calc = data.loc[:, "v"]
|
|
765
|
+
#
|
|
766
|
+
# # print("4", v_calc.head().round(3), b_calc.head().round(3),sep="\n", end="\n\n")
|
|
767
|
+
#
|
|
768
|
+
# zp = v_calc.add(b_calc)
|
|
769
|
+
# zm = v_calc.subtract(b_calc)
|
|
770
|
+
# z_raw = pd.concat({"zp": zp, "zm": zm}, axis=1).sort_index(axis=1)
|
|
771
|
+
#
|
|
772
|
+
# # print("5", z_raw.head().round(3), sep="\n", end="\n\n")
|
|
773
|
+
#
|
|
774
|
+
# window = kwargs.pop("window", "15min")
|
|
775
|
+
# min_periods = kwargs.pop("min_periods", 5)
|
|
776
|
+
#
|
|
777
|
+
# rolled = z_raw.rolling(window, min_periods=min_periods, **kwargs)
|
|
778
|
+
# agged = rolled.agg("mean")
|
|
779
|
+
# deltas = z_raw.subtract(agged, axis=1)
|
|
780
|
+
#
|
|
781
|
+
# # print("6", agged.head().round(3), sep="\n", end="\n\n")
|
|
782
|
+
# # print("y", deltas.head().round(3), sep="\n", end="\n\n")
|
|
783
|
+
#
|
|
784
|
+
# data.name = "measurements"
|
|
785
|
+
# deltas.name = "deltas"
|
|
786
|
+
#
|
|
787
|
+
# self._measurements = data
|
|
788
|
+
# self._data = deltas
|
|
789
|
+
# self._polarity = polarity
|
|
790
|
+
# self._species = species
|
|
791
|
+
# self._averaging_info = AlvenicTurbAveraging(window, min_periods)
|
|
792
|
+
#
|
|
793
|
+
# def _clean_species_for_setting(self, species):
|
|
794
|
+
# if not isinstance(species, str):
|
|
795
|
+
# msg = "%s.species must be a single species w/ an optional `+` or `,`"
|
|
796
|
+
# raise TypeError(msg % self.__class__.__name__)
|
|
797
|
+
# if species.count(",") > 1:
|
|
798
|
+
# msg = "%s.species can contain at most one `,`\nspecies: %s"
|
|
799
|
+
# raise ValueError(msg % (self.__class__.__name__, species))
|
|
800
|
+
#
|
|
801
|
+
# species = ",".join(
|
|
802
|
+
# ["+".join(tuple(sorted(s.split("+")))) for s in species.split(",")]
|
|
803
|
+
# )
|
|
804
|
+
# return species
|