AeroViz 0.1.15__tar.gz → 0.1.16__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.

Files changed (184) hide show
  1. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/__pycache__/__init__.cpython-312.pyc +0 -0
  2. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/__pycache__/__init__.cpython-312.pyc +0 -0
  3. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/__pycache__/PyMieScatt_update.cpython-312.pyc +0 -0
  4. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/__pycache__/__init__.cpython-312.pyc +0 -0
  5. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/__pycache__/mie_theory.cpython-312.pyc +0 -0
  6. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_scattering.py +1 -1
  7. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/__pycache__/__init__.cpython-312.pyc +0 -0
  8. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/VOC/__pycache__/__init__.cpython-312.pyc +0 -0
  9. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/__pycache__/__init__.cpython-312.pyc +0 -0
  10. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/core/__pycache__/__init__.cpython-312.pyc +0 -0
  11. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/__init__.cpython-312.pyc +0 -0
  12. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/bar.cpython-312.pyc +0 -0
  13. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/box.cpython-312.pyc +0 -0
  14. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/pie.cpython-312.pyc +0 -0
  15. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/radar.cpython-312.pyc +0 -0
  16. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/regression.cpython-312.pyc +0 -0
  17. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/scatter.cpython-312.pyc +0 -0
  18. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__pycache__/violin.cpython-312.pyc +0 -0
  19. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/distribution/__pycache__/__init__.cpython-312.pyc +0 -0
  20. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/distribution/__pycache__/distribution.cpython-312.pyc +0 -0
  21. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/__pycache__/CBPF.cpython-312.pyc +0 -0
  22. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/__pycache__/__init__.cpython-312.pyc +0 -0
  23. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/__pycache__/hysplit.cpython-312.pyc +0 -0
  24. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/__pycache__/wind_rose.cpython-312.pyc +0 -0
  25. aeroviz-0.1.16/AeroViz/plot/optical/__pycache__/__init__.cpython-312.pyc +0 -0
  26. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/optical/__pycache__/optical.cpython-312.pyc +0 -0
  27. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/__init__.cpython-312.pyc +0 -0
  28. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/ammonium_rich.cpython-312.pyc +0 -0
  29. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/contour.cpython-312.pyc +0 -0
  30. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/corr_matrix.cpython-312.pyc +0 -0
  31. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/diurnal_pattern.cpython-312.pyc +0 -0
  32. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/koschmieder.cpython-312.pyc +0 -0
  33. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__pycache__/metal_heatmap.cpython-312.pyc +0 -0
  34. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/__pycache__/__init__.cpython-312.pyc +0 -0
  35. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/__pycache__/template.cpython-312.pyc +0 -0
  36. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/__pycache__/timeseries.cpython-312.pyc +0 -0
  37. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__pycache__/__init__.cpython-312.pyc +0 -0
  38. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__pycache__/_color.cpython-312.pyc +0 -0
  39. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__pycache__/_unit.cpython-312.pyc +0 -0
  40. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__pycache__/plt_utils.cpython-312.pyc +0 -0
  41. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__pycache__/sklearn_utils.cpython-312.pyc +0 -0
  42. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/__pycache__/__init__.cpython-312.pyc +0 -0
  43. aeroviz-0.1.16/AeroViz/rawDataReader/config/__pycache__/__init__.cpython-312.pyc +0 -0
  44. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/config/__pycache__/supported_instruments.cpython-312.pyc +0 -0
  45. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/core/__init__.py +76 -25
  46. aeroviz-0.1.16/AeroViz/rawDataReader/core/__pycache__/__init__.cpython-312.pyc +0 -0
  47. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/core/__pycache__/logger.cpython-312.pyc +0 -0
  48. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/core/__pycache__/qc.cpython-312.pyc +0 -0
  49. aeroviz-0.1.16/AeroViz/rawDataReader/script/TEOM.py +101 -0
  50. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/AE33.cpython-312.pyc +0 -0
  51. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/AE43.cpython-312.pyc +0 -0
  52. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/APS.cpython-312.pyc +0 -0
  53. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/Aurora.cpython-312.pyc +0 -0
  54. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/BAM1020.cpython-312.pyc +0 -0
  55. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/BC1054.cpython-312.pyc +0 -0
  56. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/EPA.cpython-312.pyc +0 -0
  57. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/GRIMM.cpython-312.pyc +0 -0
  58. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/IGAC.cpython-312.pyc +0 -0
  59. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/MA350.cpython-312.pyc +0 -0
  60. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/Minion.cpython-312.pyc +0 -0
  61. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/NEPH.cpython-312.pyc +0 -0
  62. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/OCEC.cpython-312.pyc +0 -0
  63. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/SMPS.cpython-312.pyc +0 -0
  64. aeroviz-0.1.16/AeroViz/rawDataReader/script/__pycache__/TEOM.cpython-312.pyc +0 -0
  65. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/VOC.cpython-312.pyc +0 -0
  66. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/XRF.cpython-312.pyc +0 -0
  67. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__pycache__/__init__.cpython-312.pyc +0 -0
  68. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  69. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/__pycache__/database.cpython-312.pyc +0 -0
  70. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/__pycache__/dataclassifier.cpython-312.pyc +0 -0
  71. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz.egg-info/PKG-INFO +2 -2
  72. {aeroviz-0.1.15 → aeroviz-0.1.16}/PKG-INFO +2 -2
  73. {aeroviz-0.1.15 → aeroviz-0.1.16}/README.md +1 -1
  74. {aeroviz-0.1.15 → aeroviz-0.1.16}/pyproject.toml +1 -1
  75. aeroviz-0.1.15/AeroViz/plot/optical/__pycache__/__init__.cpython-312.pyc +0 -0
  76. aeroviz-0.1.15/AeroViz/rawDataReader/config/__pycache__/__init__.cpython-312.pyc +0 -0
  77. aeroviz-0.1.15/AeroViz/rawDataReader/core/__pycache__/__init__.cpython-312.pyc +0 -0
  78. aeroviz-0.1.15/AeroViz/rawDataReader/script/TEOM.py +0 -64
  79. aeroviz-0.1.15/AeroViz/rawDataReader/script/__pycache__/TEOM.cpython-312.pyc +0 -0
  80. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/__init__.py +0 -0
  81. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/data/DEFAULT_DATA.csv +0 -0
  82. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/data/DEFAULT_PNSD_DATA.csv +0 -0
  83. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/data/hysplit_example_data.txt +0 -0
  84. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/__init__.py +0 -0
  85. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_calculate.py +0 -0
  86. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_isoropia.py +0 -0
  87. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_mass_volume.py +0 -0
  88. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_ocec.py +0 -0
  89. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_partition.py +0 -0
  90. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/_teom.py +0 -0
  91. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/isrpia.cnf +0 -0
  92. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Chemistry/isrpia2.exe +0 -0
  93. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/Angstrom_exponent.py +0 -0
  94. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/PyMieScatt_update.py +0 -0
  95. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_IMPROVE.py +0 -0
  96. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/__init__.py +0 -0
  97. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_absorption.py +0 -0
  98. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_extinction.py +0 -0
  99. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_mie.py +0 -0
  100. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/_mie_sd.py +0 -0
  101. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/fRH.pkl +0 -0
  102. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/Optical/mie_theory.py +0 -0
  103. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/__init__.py +0 -0
  104. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/__merge.py +0 -0
  105. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_merge.py +0 -0
  106. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_merge_v1.py +0 -0
  107. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_merge_v2.py +0 -0
  108. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_merge_v3.py +0 -0
  109. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_merge_v4.py +0 -0
  110. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/_size_distr.py +0 -0
  111. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/SizeDistr/prop.py +0 -0
  112. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/VOC/__init__.py +0 -0
  113. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/VOC/_potential_par.py +0 -0
  114. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/VOC/support_voc.json +0 -0
  115. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/__init__.py +0 -0
  116. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/dataProcess/core/__init__.py +0 -0
  117. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/__init__.py +0 -0
  118. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/bar.py +0 -0
  119. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/box.py +0 -0
  120. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/distribution/__init__.py +0 -0
  121. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/distribution/distribution.py +0 -0
  122. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/CBPF.py +0 -0
  123. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/__init__.py +0 -0
  124. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/hysplit.py +0 -0
  125. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/meteorology/wind_rose.py +0 -0
  126. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/optical/__init__.py +0 -0
  127. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/optical/optical.py +0 -0
  128. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/pie.py +0 -0
  129. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/radar.py +0 -0
  130. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/regression.py +0 -0
  131. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/scatter.py +0 -0
  132. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/__init__.py +0 -0
  133. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/ammonium_rich.py +0 -0
  134. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/contour.py +0 -0
  135. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/corr_matrix.py +0 -0
  136. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/diurnal_pattern.py +0 -0
  137. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/koschmieder.py +0 -0
  138. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/templates/metal_heatmap.py +0 -0
  139. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/__init__.py +0 -0
  140. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/template.py +0 -0
  141. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/timeseries/timeseries.py +0 -0
  142. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/__init__.py +0 -0
  143. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/_color.py +0 -0
  144. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/_unit.py +0 -0
  145. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/fRH.json +0 -0
  146. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/plt_utils.py +0 -0
  147. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/sklearn_utils.py +0 -0
  148. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/utils/units.json +0 -0
  149. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/plot/violin.py +0 -0
  150. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/__init__.py +0 -0
  151. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/config/__init__.py +0 -0
  152. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/config/supported_instruments.py +0 -0
  153. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/core/logger.py +0 -0
  154. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/core/qc.py +0 -0
  155. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/AE33.py +0 -0
  156. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/AE43.py +0 -0
  157. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/APS.py +0 -0
  158. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/Aurora.py +0 -0
  159. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/BAM1020.py +0 -0
  160. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/BC1054.py +0 -0
  161. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/EPA.py +0 -0
  162. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/GRIMM.py +0 -0
  163. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/IGAC.py +0 -0
  164. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/MA350.py +0 -0
  165. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/Minion.py +0 -0
  166. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/NEPH.py +0 -0
  167. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/OCEC.py +0 -0
  168. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/SMPS.py +0 -0
  169. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/VOC.py +0 -0
  170. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/XRF.py +0 -0
  171. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/rawDataReader/script/__init__.py +0 -0
  172. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/__init__.py +0 -0
  173. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/database.py +0 -0
  174. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/dataclassifier.py +0 -0
  175. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz/tools/dataprinter.py +0 -0
  176. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz.egg-info/SOURCES.txt +0 -0
  177. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz.egg-info/dependency_links.txt +0 -0
  178. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz.egg-info/requires.txt +0 -0
  179. {aeroviz-0.1.15 → aeroviz-0.1.16}/AeroViz.egg-info/top_level.txt +0 -0
  180. {aeroviz-0.1.15 → aeroviz-0.1.16}/LICENSE +0 -0
  181. {aeroviz-0.1.15 → aeroviz-0.1.16}/setup.cfg +0 -0
  182. {aeroviz-0.1.15 → aeroviz-0.1.16}/setup.py +0 -0
  183. {aeroviz-0.1.15 → aeroviz-0.1.16}/tests/test_RawDataReader.py +0 -0
  184. {aeroviz-0.1.15 → aeroviz-0.1.16}/tests/test_import.py +0 -0
@@ -14,7 +14,7 @@ def _scaCoe(df, instru, specified_band: list):
14
14
  df_sca = df.copy().dropna()
15
15
 
16
16
  if instru == 'Neph':
17
- df_out = df_sca[['B']].copy()
17
+ df_out = df_sca[['G']].copy()
18
18
  df_out.columns = [f'sca_{_band}' for _band in specified_band]
19
19
  else:
20
20
  df_out = df_sca.apply(get_species_wavelength, axis=1, result_type='expand', args=(specified_band,))
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  from abc import ABC, abstractmethod
3
3
  from contextlib import contextmanager
4
- from datetime import datetime, timedelta
4
+ from datetime import datetime
5
5
  from pathlib import Path
6
6
  from typing import Generator
7
7
 
@@ -179,20 +179,27 @@ class AbstractReader(ABC):
179
179
  else:
180
180
  self.__calculate_rates(raw_data, qc_data, all_keys=True, with_log=True)
181
181
 
182
- # 計算週和月的數據
182
+ # 使用 Grouper 對數據按週和月進行分組
183
183
  current_time = datetime.now()
184
- week_mask = raw_data.index >= current_time - timedelta(days=7)
185
- month_mask = raw_data.index >= current_time - timedelta(days=30)
184
+
185
+ # 按週分組 (使用星期一作為每週的開始)
186
+ weekly_raw_groups = raw_data.groupby(pd.Grouper(freq='W-MON'))
187
+ weekly_qc_groups = qc_data.groupby(pd.Grouper(freq='W-MON'))
188
+
189
+ # 按月分組 (使用月初作為每月的開始)
190
+ monthly_raw_groups = raw_data.groupby(pd.Grouper(freq='MS'))
191
+ monthly_qc_groups = qc_data.groupby(pd.Grouper(freq='MS'))
186
192
 
187
193
  # 生成報告
188
- self.__generate_report(
194
+ self.__generate_grouped_report(
189
195
  current_time,
190
- raw_data[week_mask], qc_data[week_mask],
191
- raw_data[month_mask], qc_data[month_mask]
196
+ weekly_raw_groups, weekly_qc_groups,
197
+ monthly_raw_groups, monthly_qc_groups
192
198
  )
193
199
 
194
- def __generate_report(self, current_time, week_raw_data, week_qc_data, month_raw_data, month_qc_data):
195
- """生成獲取率和良率的報告"""
200
+ def __generate_grouped_report(self, current_time, weekly_raw_groups, weekly_qc_groups,
201
+ monthly_raw_groups, monthly_qc_groups):
202
+ """生成基於分組數據的獲取率和良率報告"""
196
203
  report = {
197
204
  "report_time": current_time.strftime('%Y-%m-%d %H:%M:%S'),
198
205
  "instrument_info": {
@@ -200,21 +207,50 @@ class AbstractReader(ABC):
200
207
  "instrument": self.nam
201
208
  },
202
209
  "rates": {
203
- "weekly": self.__calculate_rates(week_raw_data, week_qc_data),
204
- "monthly": self.__calculate_rates(month_raw_data, month_qc_data),
205
- },
206
- "details": {
207
- "weekly": {
208
- "start_time": (current_time - timedelta(days=7)).strftime('%Y-%m-%d %H:%M:%S'),
209
- "end_time": current_time.strftime('%Y-%m-%d %H:%M:%S')
210
- },
211
- "monthly": {
212
- "start_time": (current_time - timedelta(days=30)).strftime('%Y-%m-%d %H:%M:%S'),
213
- "end_time": current_time.strftime('%Y-%m-%d %H:%M:%S')
214
- }
210
+ "weekly": {},
211
+ "monthly": {}
215
212
  }
216
213
  }
217
214
 
215
+ # 處理週數據 - 使用標準週時間範圍
216
+ for week_start, week_raw_data in weekly_raw_groups:
217
+ # 獲取對應的QC數據
218
+ week_qc_data = weekly_qc_groups.get_group(
219
+ week_start) if week_start in weekly_qc_groups.groups else pd.DataFrame()
220
+
221
+ if not week_raw_data.empty:
222
+ # 計算標準週結束時間(週日23:59:59)
223
+ week_end = week_start + pd.Timedelta(days=6, hours=23, minutes=59, seconds=59)
224
+
225
+ # 使用週的開始日期作為鍵
226
+ period_key = week_start.strftime('%Y-%m-%d')
227
+
228
+ report["rates"]["weekly"][period_key] = {
229
+ "start_time": week_start.strftime('%Y-%m-%d %H:%M:%S'),
230
+ "end_time": week_end.strftime('%Y-%m-%d %H:%M:%S'),
231
+ "rates": self.__calculate_rates(week_raw_data, week_qc_data)
232
+ }
233
+
234
+ # 處理月數據 - 使用標準月時間範圍
235
+ for month_start, month_raw_data in monthly_raw_groups:
236
+ # 獲取對應的QC數據
237
+ month_qc_data = monthly_qc_groups.get_group(
238
+ month_start) if month_start in monthly_qc_groups.groups else pd.DataFrame()
239
+
240
+ if not month_raw_data.empty:
241
+ # 計算標準月結束時間(月末23:59:59)
242
+ next_month_start = (month_start + pd.Timedelta(days=32)).replace(day=1)
243
+ month_end = next_month_start - pd.Timedelta(seconds=1)
244
+
245
+ # 使用月份作為鍵
246
+ period_key = month_start.strftime('%Y-%m')
247
+
248
+ report["rates"]["monthly"][period_key] = {
249
+ "start_time": month_start.strftime('%Y-%m-%d %H:%M:%S'),
250
+ "end_time": month_end.strftime('%Y-%m-%d %H:%M:%S'),
251
+ "rates": self.__calculate_rates(month_raw_data, month_qc_data)
252
+ }
253
+
218
254
  # 寫入報告
219
255
  with open(self.report_out, 'w') as f:
220
256
  json.dump(report, f, indent=4)
@@ -247,13 +283,28 @@ class AbstractReader(ABC):
247
283
  # Create new time index
248
284
  new_index = pd.date_range(user_start or df_start, user_end or df_end, freq=freq, name='time')
249
285
 
250
- # Process data: convert to numeric, resample, and reindex
286
+ # Process data: convert to numeric, resample, and reindex with controlled tolerance
251
287
  if freq in ['1min', 'min', 'T']:
252
- return _df.reindex(new_index, method='nearest', tolerance='1min')
288
+ # 對於分鐘級數據,使用較小的tolerance,例如30秒
289
+ return _df.reindex(new_index, method='nearest', tolerance='30s')
253
290
  elif freq in ['1h', 'h', 'H']:
254
- return _df.reindex(new_index, method='nearest', tolerance='1h')
291
+ # 對於小時級數據,使用30分鐘作為tolerance
292
+ # 這樣08:20會匹配到08:00,但不會匹配到09:00
293
+ return _df.reindex(new_index, method='nearest', tolerance='30min')
255
294
  else:
256
- return _df.reindex(new_index, method='nearest', tolerance=freq)
295
+ # 對於其他頻率,tolerance設置為頻率的一半
296
+ if isinstance(freq, str) and freq[-1].isalpha():
297
+ # 如果freq格式為'數字+單位',例如'2h','3min'
298
+ try:
299
+ num = int(freq[:-1])
300
+ unit = freq[-1]
301
+ half_freq = f"{num // 2}{unit}" if num > 1 else f"30{'min' if unit == 'h' else 's'}"
302
+ return _df.reindex(new_index, method='nearest', tolerance=half_freq)
303
+ except ValueError:
304
+ # 無法解析freq,使用默認值
305
+ return _df.reindex(new_index, method='nearest', tolerance=freq)
306
+ else:
307
+ return _df.reindex(new_index, method='nearest', tolerance=freq)
257
308
 
258
309
  def _outlier_process(self, _df):
259
310
  outlier_file = self.path / 'outlier.json'
@@ -0,0 +1,101 @@
1
+ import pandas as pd
2
+ from pandas import to_datetime, read_csv, Timedelta, to_numeric
3
+
4
+ from AeroViz.rawDataReader.core import AbstractReader
5
+
6
+
7
+ class Reader(AbstractReader):
8
+ nam = 'TEOM'
9
+
10
+ # TEOM Output Data Formats
11
+ # There are three data formats from TEOM instrument output:
12
+ #
13
+ # 1. Remote download format
14
+ # - Identified by 'Time Stamp' column
15
+ # - Date format: 'DD - MM - YYYY HH:MM:SS'
16
+ # - May contain Chinese month names requiring conversion
17
+ # - Maps columns: Time Stamp → time, System status → status,
18
+ # PM-2.5 base MC → PM_NV, PM-2.5 MC → PM_Total, PM-2.5 TEOM noise → noise
19
+ #
20
+ # 2. USB download or auto export format
21
+ # - Identified by 'tmoStatusCondition_0' column
22
+ # - Two possible time formats:
23
+ # a) Standard: 'Date' and 'Time' columns (YYYY-MM-DD HH:MM:SS)
24
+ # b) Alternative: 'time_stamp' column (similar to remote format)
25
+ # - Maps columns: tmoStatusCondition_0 → status, tmoTEOMABaseMC_0 → PM_NV,
26
+ # tmoTEOMAMC_0 → PM_Total, tmoTEOMANoise_0 → noise
27
+ #
28
+ # 3. Other formats
29
+ # - Not implemented, raises NotImplementedError
30
+ #
31
+ # All formats are standardized to the same column names with timestamp as index
32
+
33
+ def _raw_reader(self, file):
34
+ # TEOM Data Format Handler
35
+ # Standardizes different TEOM data formats (remote download and USB/auto export)
36
+ _df = read_csv(file, skiprows=3, index_col=False)
37
+
38
+ # Chinese month name conversion dictionary
39
+ _time_replace = {'十一月': '11', '十二月': '12', '一月': '01', '二月': '02', '三月': '03', '四月': '04',
40
+ '五月': '05', '六月': '06', '七月': '07', '八月': '08', '九月': '09', '十月': '10'}
41
+
42
+ # Try both naming conventions (will ignore columns that don't exist)
43
+ _df = _df.rename(columns={
44
+ # Remote download format
45
+ 'Time Stamp': 'time',
46
+ 'System status': 'status',
47
+ 'PM-2.5 base MC': 'PM_NV',
48
+ 'PM-2.5 MC': 'PM_Total',
49
+ 'PM-2.5 TEOM noise': 'noise',
50
+ # USB/auto export format
51
+ 'time_stamp': 'time',
52
+ 'tmoStatusCondition_0': 'status',
53
+ 'tmoTEOMABaseMC_0': 'PM_NV',
54
+ 'tmoTEOMAMC_0': 'PM_Total',
55
+ 'tmoTEOMANoise_0': 'noise'
56
+ })
57
+
58
+ # Handle different time formats
59
+ if 'time' in _df.columns: # Remote download or auto export with time column
60
+ _tm_idx = _df.time
61
+ # Convert Chinese month names if present
62
+ for _ori, _rpl in _time_replace.items():
63
+ _tm_idx = _tm_idx.str.replace(_ori, _rpl)
64
+
65
+ _df = _df.set_index(to_datetime(_tm_idx, errors='coerce', format='%d - %m - %Y %X'))
66
+
67
+ elif 'Date' in _df.columns and 'Time' in _df.columns: # USB download format
68
+ _df['time'] = pd.to_datetime(_df['Date'] + ' ' + _df['Time'],
69
+ errors='coerce', format='%Y-%m-%d %H:%M:%S')
70
+ _df.drop(columns=['Date', 'Time'], inplace=True)
71
+ _df.set_index('time', inplace=True)
72
+
73
+ else:
74
+ raise NotImplementedError("Unsupported TEOM data format")
75
+
76
+ # Filter and clean data
77
+ _df = _df.where(_df['status'] < 1)
78
+ _df = _df[['PM_NV', 'PM_Total', 'noise']].apply(to_numeric, errors='coerce')
79
+
80
+ # Remove duplicates and NaN indices
81
+ return _df.loc[~_df.index.duplicated() & _df.index.notna()]
82
+
83
+ # QC data
84
+ def _QC(self, _df):
85
+ _index = _df.index.copy()
86
+
87
+ # remove negative value
88
+ _df = _df.where(_df.noise < 0.01)[['PM_NV', 'PM_Total']].mask((_df <= 0))
89
+
90
+ # QC data in 1 hr
91
+ # use time_aware_IQR_QC
92
+ _df = self.time_aware_IQR_QC(_df, time_window='6h')
93
+
94
+ # remove data where size < 50% in 1-hr
95
+ points_per_hour = Timedelta('1h') / Timedelta(self.meta['freq'])
96
+ for _key in ['PM_Total', 'PM_NV']:
97
+ _size = _df[_key].dropna().resample('1h').size().reindex(_index).ffill()
98
+ _df[_key] = _df[_key].mask(_size < points_per_hour * 0.5)
99
+
100
+ # make sure all columns have values, otherwise set to nan
101
+ return _df.dropna(how='any').reindex(_index)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: AeroViz
3
- Version: 0.1.15
3
+ Version: 0.1.16
4
4
  Summary: Aerosol science
5
5
  Author-email: alex <alex870521@gmail.com>
6
6
  License: MIT
@@ -111,7 +111,7 @@ data = RawDataReader(
111
111
  ```
112
112
 
113
113
  ```pycon
114
- > Concole output
114
+ > Console output
115
115
  ╔════════════════════════════════════════════════════════════════════════════════╗
116
116
  ║ Reading NEPH RAW DATA from 2024-02-01 00:00:00 to 2024-04-30 23:59:59 ║
117
117
  ╚════════════════════════════════════════════════════════════════════════════════╝
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: AeroViz
3
- Version: 0.1.15
3
+ Version: 0.1.16
4
4
  Summary: Aerosol science
5
5
  Author-email: alex <alex870521@gmail.com>
6
6
  License: MIT
@@ -111,7 +111,7 @@ data = RawDataReader(
111
111
  ```
112
112
 
113
113
  ```pycon
114
- > Concole output
114
+ > Console output
115
115
  ╔════════════════════════════════════════════════════════════════════════════════╗
116
116
  ║ Reading NEPH RAW DATA from 2024-02-01 00:00:00 to 2024-04-30 23:59:59 ║
117
117
  ╚════════════════════════════════════════════════════════════════════════════════╝
@@ -68,7 +68,7 @@ data = RawDataReader(
68
68
  ```
69
69
 
70
70
  ```pycon
71
- > Concole output
71
+ > Console output
72
72
  ╔════════════════════════════════════════════════════════════════════════════════╗
73
73
  ║ Reading NEPH RAW DATA from 2024-02-01 00:00:00 to 2024-04-30 23:59:59 ║
74
74
  ╚════════════════════════════════════════════════════════════════════════════════╝
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "AeroViz"
7
- version = "0.1.15"
7
+ version = "0.1.16"
8
8
  description = "Aerosol science"
9
9
  authors = [{ name = "alex", email = "alex870521@gmail.com" }]
10
10
  license = { text = "MIT" }
@@ -1,64 +0,0 @@
1
- import pandas as pd
2
- from pandas import to_datetime, read_csv, Timedelta, to_numeric
3
-
4
- from AeroViz.rawDataReader.core import AbstractReader
5
-
6
-
7
- class Reader(AbstractReader):
8
- nam = 'TEOM'
9
-
10
- def _raw_reader(self, file):
11
- _df = read_csv(file, skiprows=3, index_col=False)
12
-
13
- if 'Time Stamp' in _df.columns: # remote download
14
- _df = _df.rename(columns={'Time Stamp': 'time',
15
- 'System status': 'status',
16
- 'PM-2.5 base MC': 'PM_NV',
17
- 'PM-2.5 MC': 'PM_Total',
18
- 'PM-2.5 TEOM noise': 'noise', })
19
-
20
- _time_replace = {'十一月': '11', '十二月': '12', '一月': '01', '二月': '02', '三月': '03', '四月': '04',
21
- '五月': '05', '六月': '06', '七月': '07', '八月': '08', '九月': '09', '十月': '10'}
22
-
23
- _tm_idx = _df.time
24
- for _ori, _rpl in _time_replace.items():
25
- _tm_idx = _tm_idx.str.replace(_ori, _rpl)
26
-
27
- _df = _df.set_index(to_datetime(_tm_idx, errors='coerce', format='%d - %m - %Y %X'))
28
-
29
- elif 'tmoStatusCondition_0' in _df.columns: # usb download
30
- _df['time'] = pd.to_datetime(_df['Date'] + ' ' + _df['Time'], errors='coerce', format='%Y-%m-%d %H:%M:%S')
31
- _df.drop(columns=['Date', 'Time'], inplace=True)
32
- _df.set_index('time', inplace=True)
33
-
34
- _df = _df.rename(columns={'tmoStatusCondition_0': 'status',
35
- 'tmoTEOMABaseMC_0': 'PM_NV',
36
- 'tmoTEOMAMC_0': 'PM_Total',
37
- 'tmoTEOMANoise_0': 'noise', })
38
- else:
39
- raise NotImplementedError
40
-
41
- _df = _df.where(_df['status'] < 1)
42
- _df = _df[['PM_NV', 'PM_Total', 'noise']].apply(to_numeric, errors='coerce')
43
-
44
- return _df.loc[~_df.index.duplicated() & _df.index.notna()]
45
-
46
- # QC data
47
- def _QC(self, _df):
48
- _index = _df.index.copy()
49
-
50
- # remove negative value
51
- _df = _df.where(_df.noise < 0.01)[['PM_NV', 'PM_Total']].mask((_df <= 0))
52
-
53
- # QC data in 1 hr
54
- # use time_aware_IQR_QC
55
- _df = self.time_aware_IQR_QC(_df, time_window='6h')
56
-
57
- # remove data where size < 50% in 1-hr
58
- points_per_hour = Timedelta('1h') / Timedelta(self.meta['freq'])
59
- for _key in ['PM_Total', 'PM_NV']:
60
- _size = _df[_key].dropna().resample('1h').size().reindex(_index).ffill()
61
- _df[_key] = _df[_key].mask(_size < points_per_hour * 0.5)
62
-
63
- # make sure all columns have values, otherwise set to nan
64
- return _df.dropna(how='any').reindex(_index)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes