AeroViz 0.1.11__tar.gz → 0.1.13__tar.gz
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 AeroViz might be problematic. Click here for more details.
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_IMPROVE.py +1 -1
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__pycache__/PyMieScatt_update.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__pycache__/mie_theory.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/VOC/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/core/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/bar.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/box.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/pie.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/radar.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/regression.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/scatter.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__pycache__/violin.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/__pycache__/distribution.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__pycache__/CBPF.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__pycache__/__init__.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/plot/meteorology/__pycache__/hysplit.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__pycache__/wind_rose.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/hysplit.py +7 -4
- aeroviz-0.1.13/AeroViz/plot/optical/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/optical/__pycache__/optical.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/ammonium_rich.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/contour.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/corr_matrix.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/diurnal_pattern.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/koschmieder.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/metal_heatmap.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/template.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/timeseries.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/_color.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/_unit.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/plt_utils.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/sklearn_utils.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/__init__.py +4 -4
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/__pycache__/__init__.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/config/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/config/__pycache__/supported_instruments.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/config/supported_instruments.py +1 -1
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/core/__init__.py +7 -2
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/core/__pycache__/__init__.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/core/__pycache__/logger.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/core/__pycache__/qc.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/core/logger.py +167 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/AE33.py +1 -1
- aeroviz-0.1.13/AeroViz/rawDataReader/script/APS.py +44 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/Minion.py +2 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/OCEC.py +4 -4
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/SMPS.py +25 -8
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__init__.py +1 -1
- aeroviz-0.1.13/AeroViz/rawDataReader/script/__pycache__/AE33.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/AE43.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/script/__pycache__/APS.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/Aurora.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/BC1054.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/EPA.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/GRIMM.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/IGAC.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/MA350.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/Minion.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/NEPH.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/script/__pycache__/OCEC.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/script/__pycache__/SMPS.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/TEOM.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/VOC.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/XRF.cpython-312.pyc +0 -0
- aeroviz-0.1.13/AeroViz/rawDataReader/script/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/__pycache__/database.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/__pycache__/dataclassifier.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz.egg-info/PKG-INFO +18 -13
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz.egg-info/SOURCES.txt +2 -2
- {aeroviz-0.1.11 → aeroviz-0.1.13}/PKG-INFO +18 -13
- {aeroviz-0.1.11 → aeroviz-0.1.13}/README.md +17 -12
- {aeroviz-0.1.11 → aeroviz-0.1.13}/pyproject.toml +1 -1
- aeroviz-0.1.11/AeroViz/plot/meteorology/__pycache__/hysplit.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/plot/optical/__pycache__/__init__.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/config/__pycache__/__init__.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/core/__pycache__/logger.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/core/logger.py +0 -100
- aeroviz-0.1.11/AeroViz/rawDataReader/script/APS_3321.py +0 -47
- aeroviz-0.1.11/AeroViz/rawDataReader/script/__pycache__/AE33.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/script/__pycache__/APS_3321.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/script/__pycache__/OCEC.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/script/__pycache__/SMPS.cpython-312.pyc +0 -0
- aeroviz-0.1.11/AeroViz/rawDataReader/script/__pycache__/__init__.cpython-312.pyc +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/data/DEFAULT_DATA.csv +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/data/DEFAULT_PNSD_DATA.csv +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/data/hysplit_example_data.txt +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_calculate.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_isoropia.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_mass_volume.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_ocec.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_partition.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/_teom.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/isrpia.cnf +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/isrpia2.exe +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/Angstrom_exponent.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/PyMieScatt_update.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_absorption.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_extinction.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_mie.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_mie_sd.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/_scattering.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/fRH.pkl +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/mie_theory.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/__merge.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_merge.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_merge_v1.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_merge_v2.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_merge_v3.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_merge_v4.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/_size_distr.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/prop.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/VOC/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/VOC/_potential_par.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/VOC/support_voc.json +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/core/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/bar.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/box.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/distribution.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/CBPF.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/wind_rose.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/optical/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/optical/optical.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/pie.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/radar.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/regression.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/scatter.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/ammonium_rich.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/contour.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/corr_matrix.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/diurnal_pattern.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/koschmieder.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/metal_heatmap.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/template.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/timeseries.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/_color.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/_unit.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/fRH.json +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/plt_utils.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/sklearn_utils.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/units.json +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/violin.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/config/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/core/qc.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/AE43.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/Aurora.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/BC1054.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/EPA.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/GRIMM.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/IGAC.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/MA350.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/NEPH.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/TEOM.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/VOC.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/XRF.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/__init__.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/database.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/dataclassifier.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/tools/dataprinter.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz.egg-info/dependency_links.txt +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz.egg-info/requires.txt +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz.egg-info/top_level.txt +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/LICENSE +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/setup.cfg +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/setup.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/tests/test_RawDataReader.py +0 -0
- {aeroviz-0.1.11 → aeroviz-0.1.13}/tests/test_import.py +0 -0
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Chemistry/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
|
@@ -41,7 +41,7 @@ def _revised(_df_mass, _df_RH):
|
|
|
41
41
|
|
|
42
42
|
_df['AS'] = 2.2 * _frhs * _df_mass['S_AS'] + 4.8 * _frhl * _df_mass['L_AS']
|
|
43
43
|
_df['AN'] = 2.4 * _frhs * _df_mass['S_AN'] + 5.1 * _frhl * _df_mass['L_AN']
|
|
44
|
-
_df['OM'] = 2.8 * _df_mass['S_OM'] + 6.1 *
|
|
44
|
+
_df['OM'] = 2.8 * _df_mass['S_OM'] + 6.1 * _df_mass['L_OM']
|
|
45
45
|
_df['Soil'] = _df_mass['Soil']
|
|
46
46
|
_df['SS'] = 1.7 * _frhss * _df_mass['SS']
|
|
47
47
|
_df['EC'] = 10 * _df_mass['EC']
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/Optical/__pycache__/mie_theory.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/SizeDistr/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/VOC/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/dataProcess/core/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/distribution/__pycache__/distribution.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/meteorology/__pycache__/wind_rose.cpython-312.pyc
RENAMED
|
Binary file
|
|
@@ -40,14 +40,17 @@ def hysplit(file: Path = DEFAULT_FILE):
|
|
|
40
40
|
# 創建地圖
|
|
41
41
|
fig, ax = plt.subplots(figsize=(4, 5), subplot_kw={'projection': ccrs.PlateCarree()})
|
|
42
42
|
|
|
43
|
+
ax.set_global()
|
|
44
|
+
# ax.stock_img()
|
|
45
|
+
|
|
43
46
|
# 設置地圖範圍
|
|
44
47
|
ax.set_extent([116, 126, 17, 30], crs=ccrs.PlateCarree())
|
|
45
48
|
|
|
46
49
|
# 添加自然地理特徵
|
|
47
|
-
ax.add_feature(cfeature.LAND)
|
|
48
|
-
ax.add_feature(cfeature.OCEAN)
|
|
49
|
-
ax.add_feature(cfeature.COASTLINE)
|
|
50
|
-
ax.add_feature(cfeature.BORDERS, linestyle=':')
|
|
50
|
+
ax.add_feature(cfeature.LAND.with_scale('10m'))
|
|
51
|
+
ax.add_feature(cfeature.OCEAN.with_scale('10m'))
|
|
52
|
+
ax.add_feature(cfeature.COASTLINE.with_scale('10m'))
|
|
53
|
+
ax.add_feature(cfeature.BORDERS.with_scale('10m'), linestyle=':')
|
|
51
54
|
|
|
52
55
|
# 添加經緯度網格
|
|
53
56
|
ax.gridlines(draw_labels=True, dms=True, x_inline=False, y_inline=False)
|
|
Binary file
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/ammonium_rich.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/contour.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/corr_matrix.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/diurnal_pattern.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/koschmieder.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/templates/__pycache__/metal_heatmap.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/template.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/timeseries/__pycache__/timeseries.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/plot/utils/__pycache__/sklearn_utils.cpython-312.pyc
RENAMED
|
Binary file
|
|
@@ -10,7 +10,7 @@ from AeroViz.rawDataReader.script import *
|
|
|
10
10
|
__all__ = ['RawDataReader']
|
|
11
11
|
|
|
12
12
|
SUPPORTED_INSTRUMENTS = [
|
|
13
|
-
NEPH, Aurora, SMPS, GRIMM,
|
|
13
|
+
NEPH, Aurora, SMPS, GRIMM, APS, AE33, AE43, BC1054,
|
|
14
14
|
MA350, TEOM, OCEC, IGAC, VOC, EPA, Minion
|
|
15
15
|
]
|
|
16
16
|
|
|
@@ -62,7 +62,7 @@ def RawDataReader(instrument_name: str,
|
|
|
62
62
|
... instrument_name='BC1054',
|
|
63
63
|
... path=Path('/path/to/data'),
|
|
64
64
|
... start=datetime(2024, 2, 1),
|
|
65
|
-
... end=datetime(2024, 7, 31
|
|
65
|
+
... end=datetime(2024, 7, 31))
|
|
66
66
|
"""
|
|
67
67
|
# Mapping of instrument names to their respective classes
|
|
68
68
|
instrument_class_map = {cls.__name__.split('.')[-1]: cls for cls in SUPPORTED_INSTRUMENTS}
|
|
@@ -71,7 +71,7 @@ def RawDataReader(instrument_name: str,
|
|
|
71
71
|
if instrument_name not in meta.keys():
|
|
72
72
|
raise ValueError(f"Instrument name '{instrument_name}' is not valid. \nMust be one of: {list(meta.keys())}")
|
|
73
73
|
|
|
74
|
-
#
|
|
74
|
+
# Check if path exists and is a directory
|
|
75
75
|
if not isinstance(path, Path):
|
|
76
76
|
path = Path(path)
|
|
77
77
|
if not path.exists() or not path.is_dir():
|
|
@@ -94,7 +94,7 @@ def RawDataReader(instrument_name: str,
|
|
|
94
94
|
if end <= start:
|
|
95
95
|
raise ValueError(f"Invalid time range: start {start} is after end {end}")
|
|
96
96
|
|
|
97
|
-
#
|
|
97
|
+
# Verify that mean_freq format
|
|
98
98
|
try:
|
|
99
99
|
Timedelta(mean_freq)
|
|
100
100
|
except ValueError:
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
@@ -143,7 +143,7 @@ class AbstractReader(ABC):
|
|
|
143
143
|
:return: Processed DataFrame
|
|
144
144
|
"""
|
|
145
145
|
# Round timestamps and remove duplicates
|
|
146
|
-
_df = _df.groupby(_df.index.
|
|
146
|
+
_df = _df.groupby(_df.index.floor('1min')).first()
|
|
147
147
|
|
|
148
148
|
# Determine frequency
|
|
149
149
|
freq = _df.index.inferred_freq or self.meta['freq']
|
|
@@ -161,7 +161,12 @@ class AbstractReader(ABC):
|
|
|
161
161
|
new_index = pd.date_range(user_start or df_start, user_end or df_end, freq=freq, name='time')
|
|
162
162
|
|
|
163
163
|
# Process data: convert to numeric, resample, and reindex
|
|
164
|
-
|
|
164
|
+
if freq in ['1min', 'min', 'T']:
|
|
165
|
+
return _df.reindex(new_index, method='nearest', tolerance='1min')
|
|
166
|
+
elif freq in ['1h', 'h', 'H']:
|
|
167
|
+
return _df.reindex(new_index, method='nearest', tolerance='1h')
|
|
168
|
+
else:
|
|
169
|
+
return _df.reindex(new_index, method='nearest', tolerance=freq)
|
|
165
170
|
|
|
166
171
|
def _outlier_process(self, _df):
|
|
167
172
|
outlier_file = self.path / 'outlier.json'
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/core/__pycache__/__init__.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import codecs
|
|
2
|
+
import logging
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ReaderLogger:
|
|
11
|
+
def __init__(self, name: str, log_path: Path):
|
|
12
|
+
self.name = name
|
|
13
|
+
self.log_path = log_path
|
|
14
|
+
|
|
15
|
+
# 檢查是否支持顏色輸出
|
|
16
|
+
self.color_support = self._check_color_support()
|
|
17
|
+
|
|
18
|
+
# 設置顏色代碼
|
|
19
|
+
if self.color_support:
|
|
20
|
+
self.CYAN = '\033[96m'
|
|
21
|
+
self.BLUE = '\033[94m'
|
|
22
|
+
self.GREEN = '\033[92m'
|
|
23
|
+
self.YELLOW = '\033[93m'
|
|
24
|
+
self.RED = '\033[91m'
|
|
25
|
+
self.RESET = '\033[0m'
|
|
26
|
+
else:
|
|
27
|
+
self.CYAN = ''
|
|
28
|
+
self.BLUE = ''
|
|
29
|
+
self.GREEN = ''
|
|
30
|
+
self.YELLOW = ''
|
|
31
|
+
self.RED = ''
|
|
32
|
+
self.RESET = ''
|
|
33
|
+
|
|
34
|
+
# 檢查 Unicode 支持
|
|
35
|
+
self.unicode_support = self._setup_unicode()
|
|
36
|
+
|
|
37
|
+
# 設置框架字符
|
|
38
|
+
if self.unicode_support:
|
|
39
|
+
self.BOX_TOP_LEFT = "╔"
|
|
40
|
+
self.BOX_TOP_RIGHT = "╗"
|
|
41
|
+
self.BOX_BOTTOM_LEFT = "╚"
|
|
42
|
+
self.BOX_BOTTOM_RIGHT = "╝"
|
|
43
|
+
self.BOX_HORIZONTAL = "═"
|
|
44
|
+
self.BOX_VERTICAL = "║"
|
|
45
|
+
self.ARROW = "▶"
|
|
46
|
+
else:
|
|
47
|
+
self.BOX_TOP_LEFT = "+"
|
|
48
|
+
self.BOX_TOP_RIGHT = "+"
|
|
49
|
+
self.BOX_BOTTOM_LEFT = "+"
|
|
50
|
+
self.BOX_BOTTOM_RIGHT = "+"
|
|
51
|
+
self.BOX_HORIZONTAL = "-"
|
|
52
|
+
self.BOX_VERTICAL = "|"
|
|
53
|
+
self.ARROW = ">"
|
|
54
|
+
|
|
55
|
+
self.logger = self._setup_logger()
|
|
56
|
+
|
|
57
|
+
def _check_color_support(self) -> bool:
|
|
58
|
+
"""檢查環境是否支持顏色輸出"""
|
|
59
|
+
# 檢查是否在 Spyder 或其他 IDE 中運行
|
|
60
|
+
if any(IDE in os.environ.get('PYTHONPATH', '') for IDE in ['spyder', 'jupyter']):
|
|
61
|
+
return False
|
|
62
|
+
|
|
63
|
+
# 檢查是否強制啟用或禁用顏色
|
|
64
|
+
if 'FORCE_COLOR' in os.environ:
|
|
65
|
+
return os.environ['FORCE_COLOR'].lower() in ('1', 'true', 'yes')
|
|
66
|
+
|
|
67
|
+
# Windows 檢查
|
|
68
|
+
if platform.system().lower() == 'windows':
|
|
69
|
+
return ('ANSICON' in os.environ or
|
|
70
|
+
'WT_SESSION' in os.environ or # Windows Terminal
|
|
71
|
+
'ConEmuANSI' in os.environ or
|
|
72
|
+
os.environ.get('TERM_PROGRAM', '').lower() == 'vscode')
|
|
73
|
+
|
|
74
|
+
# 其他系統檢查
|
|
75
|
+
return hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
|
|
76
|
+
|
|
77
|
+
def _setup_unicode(self) -> bool:
|
|
78
|
+
"""設置 Unicode 支持"""
|
|
79
|
+
if platform.system().lower() == 'windows':
|
|
80
|
+
try:
|
|
81
|
+
if hasattr(sys.stdout, 'reconfigure'):
|
|
82
|
+
sys.stdout.reconfigure(encoding='utf-8')
|
|
83
|
+
elif hasattr(sys.stdout, 'buffer'):
|
|
84
|
+
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer)
|
|
85
|
+
else:
|
|
86
|
+
return False
|
|
87
|
+
return True
|
|
88
|
+
except Exception:
|
|
89
|
+
return False
|
|
90
|
+
return True
|
|
91
|
+
|
|
92
|
+
def _setup_logger(self) -> logging.Logger:
|
|
93
|
+
"""設置logger"""
|
|
94
|
+
logger = logging.getLogger(self.name)
|
|
95
|
+
logger.setLevel(logging.INFO)
|
|
96
|
+
|
|
97
|
+
# 移除現有的 handlers
|
|
98
|
+
for handler in logger.handlers[:]:
|
|
99
|
+
handler.close()
|
|
100
|
+
logger.removeHandler(handler)
|
|
101
|
+
|
|
102
|
+
# 清理 ANSI 格式化器
|
|
103
|
+
class CleanFormatter(logging.Formatter):
|
|
104
|
+
def format(self, record):
|
|
105
|
+
formatted_msg = super().format(record)
|
|
106
|
+
return re.sub(r'\033\[[0-9;]*m', '', formatted_msg)
|
|
107
|
+
|
|
108
|
+
# 設置檔案處理器
|
|
109
|
+
try:
|
|
110
|
+
log_dir = Path(self.log_path)
|
|
111
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
112
|
+
file_handler = logging.FileHandler(
|
|
113
|
+
log_dir / f'{self.name}.log',
|
|
114
|
+
encoding='utf-8',
|
|
115
|
+
errors='replace'
|
|
116
|
+
)
|
|
117
|
+
file_handler.setFormatter(
|
|
118
|
+
CleanFormatter('%(asctime)s - %(message)s',
|
|
119
|
+
datefmt='%Y-%m-%d %H:%M:%S')
|
|
120
|
+
)
|
|
121
|
+
logger.addHandler(file_handler)
|
|
122
|
+
except Exception as e:
|
|
123
|
+
print(f"Warning: Could not set up file logging: {e}")
|
|
124
|
+
|
|
125
|
+
# 設置控制台處理器
|
|
126
|
+
console_handler = logging.StreamHandler(sys.stdout)
|
|
127
|
+
console_handler.setFormatter(logging.Formatter('%(message)s'))
|
|
128
|
+
logger.addHandler(console_handler)
|
|
129
|
+
|
|
130
|
+
return logger
|
|
131
|
+
|
|
132
|
+
def _safe_print(self, text: str) -> str:
|
|
133
|
+
"""安全打印,處理編碼問題"""
|
|
134
|
+
if not self.unicode_support:
|
|
135
|
+
text = text.encode('ascii', 'replace').decode('ascii')
|
|
136
|
+
return text
|
|
137
|
+
|
|
138
|
+
def info(self, msg: str):
|
|
139
|
+
self.logger.info(self._safe_print(msg))
|
|
140
|
+
|
|
141
|
+
def warning(self, msg: str):
|
|
142
|
+
self.logger.warning(self._safe_print(msg))
|
|
143
|
+
|
|
144
|
+
def error(self, msg: str):
|
|
145
|
+
self.logger.error(self._safe_print(msg))
|
|
146
|
+
|
|
147
|
+
def info_box(self, text: str, color_part: str = None, width: int = 80):
|
|
148
|
+
"""創建帶框的消息,可選擇性地為部分文本著色"""
|
|
149
|
+
# 處理文本
|
|
150
|
+
display_text = text.replace(color_part, " " * len(color_part)) if color_part else text
|
|
151
|
+
|
|
152
|
+
# 計算padding
|
|
153
|
+
left_padding = " " * ((width - len(display_text)) // 2)
|
|
154
|
+
right_padding = " " * (width - len(display_text) - len(left_padding))
|
|
155
|
+
|
|
156
|
+
# 處理顏色
|
|
157
|
+
if color_part and self.color_support:
|
|
158
|
+
content = text.replace(color_part, f"{self.CYAN}{color_part}{self.RESET}")
|
|
159
|
+
else:
|
|
160
|
+
content = text
|
|
161
|
+
|
|
162
|
+
__content__ = f"{left_padding}{content}{right_padding}"
|
|
163
|
+
|
|
164
|
+
# 使用當前設置的框架字符
|
|
165
|
+
self.info(f"{self.BOX_TOP_LEFT}{self.BOX_HORIZONTAL * width}{self.BOX_TOP_RIGHT}")
|
|
166
|
+
self.info(f"{self.BOX_VERTICAL}{__content__}{self.BOX_VERTICAL}")
|
|
167
|
+
self.info(f"{self.BOX_BOTTOM_LEFT}{self.BOX_HORIZONTAL * width}{self.BOX_BOTTOM_RIGHT}")
|
|
@@ -8,7 +8,7 @@ class Reader(AbstractReader):
|
|
|
8
8
|
|
|
9
9
|
def _raw_reader(self, file):
|
|
10
10
|
if file.stat().st_size / 1024 < 550:
|
|
11
|
-
self.logger.info(f'\t {file} may not be a whole daily data. Make sure the file is correct.')
|
|
11
|
+
self.logger.info(f'\t {file.name} may not be a whole daily data. Make sure the file is correct.')
|
|
12
12
|
|
|
13
13
|
_df = read_table(file, parse_dates={'time': [0, 1]}, index_col='time',
|
|
14
14
|
delimiter=r'\s+', skiprows=5, usecols=range(67))
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from pandas import to_datetime, read_table
|
|
3
|
+
|
|
4
|
+
from AeroViz.rawDataReader.core import AbstractReader
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Reader(AbstractReader):
|
|
8
|
+
nam = 'APS'
|
|
9
|
+
|
|
10
|
+
def _raw_reader(self, file):
|
|
11
|
+
with open(file, 'r', encoding='utf-8', errors='ignore') as f:
|
|
12
|
+
_df = read_table(f, skiprows=6, parse_dates={'Time': ['Date', 'Start Time']},
|
|
13
|
+
date_format='%m/%d/%y %H:%M:%S').set_index('Time')
|
|
14
|
+
|
|
15
|
+
# 542 nm ~ 1981 nm
|
|
16
|
+
_df = _df.iloc[:, 3:54].rename(columns=lambda x: round(float(x), 4))
|
|
17
|
+
|
|
18
|
+
_df_idx = to_datetime(_df.index, format='%m/%d/%y %H:%M:%S', errors='coerce')
|
|
19
|
+
|
|
20
|
+
return _df.set_index(_df_idx).loc[_df_idx.dropna()]
|
|
21
|
+
|
|
22
|
+
# QC data
|
|
23
|
+
def _QC(self, _df):
|
|
24
|
+
_df = _df.copy()
|
|
25
|
+
_index = _df.index.copy()
|
|
26
|
+
|
|
27
|
+
# mask out the data size lower than 7
|
|
28
|
+
_df.loc[:, 'total'] = _df.sum(axis=1, min_count=1) * (np.diff(np.log(_df.keys().to_numpy(float)))).mean()
|
|
29
|
+
|
|
30
|
+
hourly_counts = (_df['total']
|
|
31
|
+
.dropna()
|
|
32
|
+
.resample('h')
|
|
33
|
+
.size()
|
|
34
|
+
.resample('6min')
|
|
35
|
+
.ffill()
|
|
36
|
+
.reindex(_df.index, method='ffill', tolerance='6min'))
|
|
37
|
+
|
|
38
|
+
# Remove data with less than 6 data per hour
|
|
39
|
+
_df = _df.mask(hourly_counts < 6)
|
|
40
|
+
|
|
41
|
+
# remove total conc. lower than 700 or lower than 1
|
|
42
|
+
_df = _df.mask((_df['total'] > 700) | (_df['total'] < 1))
|
|
43
|
+
|
|
44
|
+
return _df[_df.keys()[:-1]]
|
|
@@ -187,6 +187,8 @@ class Reader(AbstractReader):
|
|
|
187
187
|
['Cl-', 'NO2-', 'NO3-', 'SO42-'],
|
|
188
188
|
['SO42-', 'NO3-', 'NH4+'])
|
|
189
189
|
|
|
190
|
+
CA_range = () # CA, AC Q3=1.5 * IQR
|
|
191
|
+
|
|
190
192
|
_df['+_mole'] = _df[_cation].div([23, 18, 39, (24 / 2), (40 / 2)]).sum(axis=1, skipna=True)
|
|
191
193
|
_df['-_mole'] = _df[_anion].div([35.5, 46, 62, (96 / 2)]).sum(axis=1, skipna=True)
|
|
192
194
|
|
|
@@ -9,12 +9,12 @@ class Reader(AbstractReader):
|
|
|
9
9
|
|
|
10
10
|
def _raw_reader(self, file):
|
|
11
11
|
with open(file, 'r', encoding='utf-8', errors='ignore') as f:
|
|
12
|
-
_df = read_csv(f, skiprows=3)
|
|
12
|
+
_df = read_csv(f, skiprows=3, on_bad_lines='skip')
|
|
13
13
|
|
|
14
14
|
_df['Start Date/Time'] = _df['Start Date/Time'].str.strip()
|
|
15
15
|
_df['time'] = to_datetime(_df['Start Date/Time'], format='%m/%d/%Y %I:%M:%S %p', errors='coerce')
|
|
16
16
|
|
|
17
|
-
if _df['time'].isna().
|
|
17
|
+
if _df['time'].isna().all():
|
|
18
18
|
_df['time'] = to_datetime(_df['Start Date/Time'], format='%m/%d/%Y %H:%M:%S', errors='coerce')
|
|
19
19
|
|
|
20
20
|
_df = _df.set_index('time')
|
|
@@ -73,8 +73,8 @@ class Reader(AbstractReader):
|
|
|
73
73
|
|
|
74
74
|
# QC data
|
|
75
75
|
def _QC(self, _df):
|
|
76
|
-
MDL = {'Thermal_OC': 0.3,
|
|
77
|
-
'Optical_OC': 0.3,
|
|
76
|
+
MDL = {'Thermal_OC': 0.3, # 0.89
|
|
77
|
+
'Optical_OC': 0.3, # 0.08
|
|
78
78
|
'Thermal_EC': 0.015,
|
|
79
79
|
'Optical_EC': 0.015
|
|
80
80
|
}
|
|
@@ -59,25 +59,42 @@ class Reader(AbstractReader):
|
|
|
59
59
|
if _df_smps.columns[0] != self.size_range[0] or _df_smps.columns[-1] != self.size_range[1]:
|
|
60
60
|
self.logger.info(f'\tSMPS file: {file.name} is not match the default size range {self.size_range}, '
|
|
61
61
|
f'it is ({_df_smps.columns[0]}, {_df_smps.columns[-1]})')
|
|
62
|
+
return None
|
|
62
63
|
|
|
63
64
|
return _df_smps.apply(to_numeric, errors='coerce')
|
|
64
65
|
|
|
65
66
|
# QC data
|
|
66
67
|
def _QC(self, _df):
|
|
68
|
+
_df = _df.copy()
|
|
69
|
+
_index = _df.index.copy()
|
|
70
|
+
|
|
67
71
|
size_range_mask = (_df.columns.astype(float) >= self.size_range[0]) & (
|
|
68
|
-
|
|
72
|
+
_df.columns.astype(float) <= self.size_range[1])
|
|
69
73
|
_df = _df.loc[:, size_range_mask]
|
|
70
74
|
|
|
71
75
|
# mask out the data size lower than 7
|
|
72
|
-
_df['total'] = _df.sum(axis=1, min_count=1) * (np.diff(np.log(_df.
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
_df.loc[:, 'total'] = _df.sum(axis=1, min_count=1) * (np.diff(np.log(_df.columns[:-1].to_numpy(float)))).mean()
|
|
77
|
+
|
|
78
|
+
hourly_counts = (_df['total']
|
|
79
|
+
.dropna()
|
|
80
|
+
.resample('h')
|
|
81
|
+
.size()
|
|
82
|
+
.resample('6min')
|
|
83
|
+
.ffill()
|
|
84
|
+
.reindex(_df.index, method='ffill', tolerance='6min'))
|
|
75
85
|
|
|
76
|
-
#
|
|
86
|
+
# Remove data with less than 6 data per hour
|
|
87
|
+
_df = _df.mask(hourly_counts < 6)
|
|
88
|
+
|
|
89
|
+
# remove total conc. (dN) lower than 2000
|
|
77
90
|
_df = _df.mask(_df['total'] < 2000)
|
|
91
|
+
_df = _df.drop('total', axis=1)
|
|
92
|
+
|
|
93
|
+
# remove single bin conc. (dN/dlogdp) larger than 1e6
|
|
94
|
+
_df = _df.mask((_df > 1e6).any(axis=1))
|
|
78
95
|
|
|
79
96
|
# remove the bin over 400 nm which num. conc. larger than 4000
|
|
80
|
-
|
|
81
|
-
_df
|
|
97
|
+
large_bins = _df.columns[_df.columns.astype(float) >= 400]
|
|
98
|
+
_df = _df.mask((_df[large_bins] > 4000).any(axis=1))
|
|
82
99
|
|
|
83
|
-
return _df
|
|
100
|
+
return _df
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/AE43.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/Aurora.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/BC1054.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/EPA.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/GRIMM.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/IGAC.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/MA350.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/Minion.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/NEPH.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/TEOM.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/VOC.cpython-312.pyc
RENAMED
|
Binary file
|
{aeroviz-0.1.11 → aeroviz-0.1.13}/AeroViz/rawDataReader/script/__pycache__/XRF.cpython-312.pyc
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|