numdaplot 0.1.0__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.
Files changed (898) hide show
  1. numdaplot-0.1.0/.github/workflows/checks.yml +47 -0
  2. numdaplot-0.1.0/.github/workflows/release.yml +141 -0
  3. numdaplot-0.1.0/.gitignore +10 -0
  4. numdaplot-0.1.0/CHANGELOG.md +144 -0
  5. numdaplot-0.1.0/LICENSE +28 -0
  6. numdaplot-0.1.0/PKG-INFO +176 -0
  7. numdaplot-0.1.0/README.md +150 -0
  8. numdaplot-0.1.0/conftest.py +167 -0
  9. numdaplot-0.1.0/docs/changelog.md +1 -0
  10. numdaplot-0.1.0/docs/index.md +1 -0
  11. numdaplot-0.1.0/docs/stylesheets/symbols.css +232 -0
  12. numdaplot-0.1.0/mkdocs.yml +93 -0
  13. numdaplot-0.1.0/pyproject.toml +89 -0
  14. numdaplot-0.1.0/release_notes.md +136 -0
  15. numdaplot-0.1.0/run_tests.py +37 -0
  16. numdaplot-0.1.0/src/numdaplot/__init__.py +506 -0
  17. numdaplot-0.1.0/src/numdaplot/arrays/__init__.py +5 -0
  18. numdaplot-0.1.0/src/numdaplot/arrays/array.py +92 -0
  19. numdaplot-0.1.0/src/numdaplot/arrays/array_arithmetic.py +404 -0
  20. numdaplot-0.1.0/src/numdaplot/arrays/array_calculation.py +143 -0
  21. numdaplot-0.1.0/src/numdaplot/arrays/array_conversion.py +150 -0
  22. numdaplot-0.1.0/src/numdaplot/arrays/array_creation.py +371 -0
  23. numdaplot-0.1.0/src/numdaplot/arrays/array_data.py +281 -0
  24. numdaplot-0.1.0/src/numdaplot/arrays/array_layout.py +179 -0
  25. numdaplot-0.1.0/src/numdaplot/arrays/array_logic.py +227 -0
  26. numdaplot-0.1.0/src/numdaplot/arrays/array_reflected_arithmetic.py +334 -0
  27. numdaplot-0.1.0/src/numdaplot/arrays/array_refusals.py +339 -0
  28. numdaplot-0.1.0/src/numdaplot/arrays/array_selection.py +195 -0
  29. numdaplot-0.1.0/src/numdaplot/arrays/array_sorting.py +59 -0
  30. numdaplot-0.1.0/src/numdaplot/arrays/axis_number.py +58 -0
  31. numdaplot-0.1.0/src/numdaplot/arrays/calculation/__init__.py +5 -0
  32. numdaplot-0.1.0/src/numdaplot/arrays/calculation/counting_statistics.py +325 -0
  33. numdaplot-0.1.0/src/numdaplot/arrays/calculation/location_statistics.py +268 -0
  34. numdaplot-0.1.0/src/numdaplot/arrays/calculation/math_function_values.py +183 -0
  35. numdaplot-0.1.0/src/numdaplot/arrays/calculation/statistic_values.py +209 -0
  36. numdaplot-0.1.0/src/numdaplot/arrays/calculation/time_function_values.py +419 -0
  37. numdaplot-0.1.0/src/numdaplot/arrays/conversion/__init__.py +5 -0
  38. numdaplot-0.1.0/src/numdaplot/arrays/conversion/array_text.py +62 -0
  39. numdaplot-0.1.0/src/numdaplot/arrays/conversion/equality_check.py +72 -0
  40. numdaplot-0.1.0/src/numdaplot/arrays/conversion/python_values.py +70 -0
  41. numdaplot-0.1.0/src/numdaplot/arrays/conversion/time_text.py +290 -0
  42. numdaplot-0.1.0/src/numdaplot/arrays/creation/__init__.py +5 -0
  43. numdaplot-0.1.0/src/numdaplot/arrays/creation/date_parts.py +89 -0
  44. numdaplot-0.1.0/src/numdaplot/arrays/creation/date_parts_values.py +437 -0
  45. numdaplot-0.1.0/src/numdaplot/arrays/creation/distribution.py +54 -0
  46. numdaplot-0.1.0/src/numdaplot/arrays/creation/filled_values.py +58 -0
  47. numdaplot-0.1.0/src/numdaplot/arrays/creation/list_conversion.py +311 -0
  48. numdaplot-0.1.0/src/numdaplot/arrays/creation/list_shape.py +97 -0
  49. numdaplot-0.1.0/src/numdaplot/arrays/creation/normal.py +65 -0
  50. numdaplot-0.1.0/src/numdaplot/arrays/creation/numpy_conversion.py +149 -0
  51. numdaplot-0.1.0/src/numdaplot/arrays/creation/random_integers.py +104 -0
  52. numdaplot-0.1.0/src/numdaplot/arrays/creation/random_values.py +97 -0
  53. numdaplot-0.1.0/src/numdaplot/arrays/creation/range_values.py +73 -0
  54. numdaplot-0.1.0/src/numdaplot/arrays/creation/spacing.py +84 -0
  55. numdaplot-0.1.0/src/numdaplot/arrays/creation/spacing_values.py +63 -0
  56. numdaplot-0.1.0/src/numdaplot/arrays/creation/uniform.py +63 -0
  57. numdaplot-0.1.0/src/numdaplot/arrays/equality.py +68 -0
  58. numdaplot-0.1.0/src/numdaplot/arrays/layout/__init__.py +5 -0
  59. numdaplot-0.1.0/src/numdaplot/arrays/layout/sorting_values.py +113 -0
  60. numdaplot-0.1.0/src/numdaplot/arrays/layout/unique_values.py +49 -0
  61. numdaplot-0.1.0/src/numdaplot/arrays/mapping/__init__.py +5 -0
  62. numdaplot-0.1.0/src/numdaplot/arrays/mapping/mapped_values.py +286 -0
  63. numdaplot-0.1.0/src/numdaplot/arrays/mapping/unmatched.py +50 -0
  64. numdaplot-0.1.0/src/numdaplot/arrays/mapping/value_change.py +55 -0
  65. numdaplot-0.1.0/src/numdaplot/arrays/mapping/value_mapping.py +161 -0
  66. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/__init__.py +5 -0
  67. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/absolute.py +27 -0
  68. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/cosine.py +28 -0
  69. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/exponential.py +27 -0
  70. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/logarithm.py +72 -0
  71. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/math_function.py +58 -0
  72. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/round.py +58 -0
  73. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/sine.py +28 -0
  74. numdaplot-0.1.0/src/numdaplot/arrays/math_functions/square_root.py +27 -0
  75. numdaplot-0.1.0/src/numdaplot/arrays/operations/__init__.py +5 -0
  76. numdaplot-0.1.0/src/numdaplot/arrays/operations/boolean_operands.py +48 -0
  77. numdaplot-0.1.0/src/numdaplot/arrays/operations/combination.py +157 -0
  78. numdaplot-0.1.0/src/numdaplot/arrays/operations/float_errors.py +170 -0
  79. numdaplot-0.1.0/src/numdaplot/arrays/operations/integer_bounds.py +175 -0
  80. numdaplot-0.1.0/src/numdaplot/arrays/operations/integer_rules.py +397 -0
  81. numdaplot-0.1.0/src/numdaplot/arrays/operations/operand.py +139 -0
  82. numdaplot-0.1.0/src/numdaplot/arrays/operations/time_arithmetic.py +479 -0
  83. numdaplot-0.1.0/src/numdaplot/arrays/operations/time_bounds.py +286 -0
  84. numdaplot-0.1.0/src/numdaplot/arrays/operations/time_result_bounds.py +397 -0
  85. numdaplot-0.1.0/src/numdaplot/arrays/operations/transformation.py +54 -0
  86. numdaplot-0.1.0/src/numdaplot/arrays/operations/type_requirements.py +94 -0
  87. numdaplot-0.1.0/src/numdaplot/arrays/replacement.py +66 -0
  88. numdaplot-0.1.0/src/numdaplot/arrays/selection/__init__.py +5 -0
  89. numdaplot-0.1.0/src/numdaplot/arrays/selection/comparison_masks.py +131 -0
  90. numdaplot-0.1.0/src/numdaplot/arrays/selection/membership_masks.py +118 -0
  91. numdaplot-0.1.0/src/numdaplot/arrays/selection/missing_mask.py +50 -0
  92. numdaplot-0.1.0/src/numdaplot/arrays/selection/region_index.py +178 -0
  93. numdaplot-0.1.0/src/numdaplot/arrays/selection/replaced_values.py +120 -0
  94. numdaplot-0.1.0/src/numdaplot/arrays/selection/rule_mask.py +83 -0
  95. numdaplot-0.1.0/src/numdaplot/arrays/selection/time_reference.py +172 -0
  96. numdaplot-0.1.0/src/numdaplot/arrays/shape.py +74 -0
  97. numdaplot-0.1.0/src/numdaplot/arrays/type_match.py +51 -0
  98. numdaplot-0.1.0/src/numdaplot/data_types/__init__.py +5 -0
  99. numdaplot-0.1.0/src/numdaplot/data_types/library.py +57 -0
  100. numdaplot-0.1.0/src/numdaplot/data_types/numpy_mapping.py +207 -0
  101. numdaplot-0.1.0/src/numdaplot/data_types/pandas_mapping.py +114 -0
  102. numdaplot-0.1.0/src/numdaplot/data_types/time_of_day.py +292 -0
  103. numdaplot-0.1.0/src/numdaplot/data_types/type.py +224 -0
  104. numdaplot-0.1.0/src/numdaplot/data_types/value_family.py +149 -0
  105. numdaplot-0.1.0/src/numdaplot/data_types/value_type.py +147 -0
  106. numdaplot-0.1.0/src/numdaplot/dates/__init__.py +5 -0
  107. numdaplot-0.1.0/src/numdaplot/dates/custom_date_format.py +83 -0
  108. numdaplot-0.1.0/src/numdaplot/dates/date_format.py +120 -0
  109. numdaplot-0.1.0/src/numdaplot/dates/date_part.py +59 -0
  110. numdaplot-0.1.0/src/numdaplot/dates/date_part_unit.py +153 -0
  111. numdaplot-0.1.0/src/numdaplot/dates/date_period.py +57 -0
  112. numdaplot-0.1.0/src/numdaplot/dates/duration_in.py +58 -0
  113. numdaplot-0.1.0/src/numdaplot/dates/duration_unit.py +90 -0
  114. numdaplot-0.1.0/src/numdaplot/dates/period_unit.py +101 -0
  115. numdaplot-0.1.0/src/numdaplot/dates/time_function.py +56 -0
  116. numdaplot-0.1.0/src/numdaplot/dates/time_zone.py +68 -0
  117. numdaplot-0.1.0/src/numdaplot/dates/time_zone_change.py +71 -0
  118. numdaplot-0.1.0/src/numdaplot/dates/time_zone_mode.py +81 -0
  119. numdaplot-0.1.0/src/numdaplot/dates/to_duration.py +58 -0
  120. numdaplot-0.1.0/src/numdaplot/errors/__init__.py +7 -0
  121. numdaplot-0.1.0/src/numdaplot/errors/broadcast_warning.py +36 -0
  122. numdaplot-0.1.0/src/numdaplot/errors/calculation_warning.py +35 -0
  123. numdaplot-0.1.0/src/numdaplot/errors/cell_out_of_range_error.py +77 -0
  124. numdaplot-0.1.0/src/numdaplot/errors/column_not_found_error.py +64 -0
  125. numdaplot-0.1.0/src/numdaplot/errors/conflicting_settings_error.py +60 -0
  126. numdaplot-0.1.0/src/numdaplot/errors/dimension_error.py +62 -0
  127. numdaplot-0.1.0/src/numdaplot/errors/display_warning.py +32 -0
  128. numdaplot-0.1.0/src/numdaplot/errors/duplicate_column_error.py +82 -0
  129. numdaplot-0.1.0/src/numdaplot/errors/duplicate_label_error.py +55 -0
  130. numdaplot-0.1.0/src/numdaplot/errors/duplicate_statistic_error.py +55 -0
  131. numdaplot-0.1.0/src/numdaplot/errors/duplicate_value_error.py +54 -0
  132. numdaplot-0.1.0/src/numdaplot/errors/empty_array_error.py +55 -0
  133. numdaplot-0.1.0/src/numdaplot/errors/empty_list_error.py +52 -0
  134. numdaplot-0.1.0/src/numdaplot/errors/empty_region_error.py +34 -0
  135. numdaplot-0.1.0/src/numdaplot/errors/empty_text_error.py +34 -0
  136. numdaplot-0.1.0/src/numdaplot/errors/empty_total_error.py +62 -0
  137. numdaplot-0.1.0/src/numdaplot/errors/empty_values_error.py +34 -0
  138. numdaplot-0.1.0/src/numdaplot/errors/file_access_error.py +70 -0
  139. numdaplot-0.1.0/src/numdaplot/errors/file_exists_error.py +62 -0
  140. numdaplot-0.1.0/src/numdaplot/errors/file_not_found_error.py +56 -0
  141. numdaplot-0.1.0/src/numdaplot/errors/incompatible_charts_error.py +80 -0
  142. numdaplot-0.1.0/src/numdaplot/errors/incompatible_types_error.py +104 -0
  143. numdaplot-0.1.0/src/numdaplot/errors/integer_overflow_error.py +61 -0
  144. numdaplot-0.1.0/src/numdaplot/errors/invalid_base_error.py +52 -0
  145. numdaplot-0.1.0/src/numdaplot/errors/invalid_bin_width_error.py +66 -0
  146. numdaplot-0.1.0/src/numdaplot/errors/invalid_bounds_error.py +58 -0
  147. numdaplot-0.1.0/src/numdaplot/errors/invalid_chart_data_error.py +81 -0
  148. numdaplot-0.1.0/src/numdaplot/errors/invalid_color_count_error.py +63 -0
  149. numdaplot-0.1.0/src/numdaplot/errors/invalid_color_error.py +51 -0
  150. numdaplot-0.1.0/src/numdaplot/errors/invalid_column_name_error.py +52 -0
  151. numdaplot-0.1.0/src/numdaplot/errors/invalid_conversion_error.py +119 -0
  152. numdaplot-0.1.0/src/numdaplot/errors/invalid_count_error.py +61 -0
  153. numdaplot-0.1.0/src/numdaplot/errors/invalid_date_format_error.py +51 -0
  154. numdaplot-0.1.0/src/numdaplot/errors/invalid_deviation_error.py +52 -0
  155. numdaplot-0.1.0/src/numdaplot/errors/invalid_fraction_error.py +51 -0
  156. numdaplot-0.1.0/src/numdaplot/errors/invalid_label_count_error.py +61 -0
  157. numdaplot-0.1.0/src/numdaplot/errors/invalid_limits_error.py +111 -0
  158. numdaplot-0.1.0/src/numdaplot/errors/invalid_opacity_error.py +52 -0
  159. numdaplot-0.1.0/src/numdaplot/errors/invalid_point_size_error.py +52 -0
  160. numdaplot-0.1.0/src/numdaplot/errors/invalid_position_error.py +106 -0
  161. numdaplot-0.1.0/src/numdaplot/errors/invalid_resolution_error.py +51 -0
  162. numdaplot-0.1.0/src/numdaplot/errors/invalid_rotation_error.py +53 -0
  163. numdaplot-0.1.0/src/numdaplot/errors/invalid_seed_error.py +53 -0
  164. numdaplot-0.1.0/src/numdaplot/errors/invalid_separator_error.py +52 -0
  165. numdaplot-0.1.0/src/numdaplot/errors/invalid_shape_error.py +52 -0
  166. numdaplot-0.1.0/src/numdaplot/errors/invalid_sheet_name_error.py +54 -0
  167. numdaplot-0.1.0/src/numdaplot/errors/invalid_size_error.py +58 -0
  168. numdaplot-0.1.0/src/numdaplot/errors/invalid_step_error.py +77 -0
  169. numdaplot-0.1.0/src/numdaplot/errors/invalid_suffixes_error.py +61 -0
  170. numdaplot-0.1.0/src/numdaplot/errors/invalid_time_zone_change_error.py +63 -0
  171. numdaplot-0.1.0/src/numdaplot/errors/invalid_type_error.py +79 -0
  172. numdaplot-0.1.0/src/numdaplot/errors/irregular_list_error.py +36 -0
  173. numdaplot-0.1.0/src/numdaplot/errors/join_relation_error.py +183 -0
  174. numdaplot-0.1.0/src/numdaplot/errors/missing_dependency_error.py +58 -0
  175. numdaplot-0.1.0/src/numdaplot/errors/missing_type_error.py +36 -0
  176. numdaplot-0.1.0/src/numdaplot/errors/missing_value_error.py +62 -0
  177. numdaplot-0.1.0/src/numdaplot/errors/not_single_value_error.py +53 -0
  178. numdaplot-0.1.0/src/numdaplot/errors/numdaplot_error.py +25 -0
  179. numdaplot-0.1.0/src/numdaplot/errors/numdaplot_warning.py +34 -0
  180. numdaplot-0.1.0/src/numdaplot/errors/occupied_cell_error.py +63 -0
  181. numdaplot-0.1.0/src/numdaplot/errors/out_of_domain_error.py +70 -0
  182. numdaplot-0.1.0/src/numdaplot/errors/readability_warning.py +35 -0
  183. numdaplot-0.1.0/src/numdaplot/errors/refused_operation_error.py +64 -0
  184. numdaplot-0.1.0/src/numdaplot/errors/refused_setting_error.py +60 -0
  185. numdaplot-0.1.0/src/numdaplot/errors/rejected_dates.py +60 -0
  186. numdaplot-0.1.0/src/numdaplot/errors/repeated_key.py +36 -0
  187. numdaplot-0.1.0/src/numdaplot/errors/shape_mismatch_error.py +67 -0
  188. numdaplot-0.1.0/src/numdaplot/errors/time_overflow_error.py +131 -0
  189. numdaplot-0.1.0/src/numdaplot/errors/time_zone_mismatch_error.py +83 -0
  190. numdaplot-0.1.0/src/numdaplot/errors/unknown_time_zone_error.py +51 -0
  191. numdaplot-0.1.0/src/numdaplot/errors/unmatched_value_error.py +81 -0
  192. numdaplot-0.1.0/src/numdaplot/errors/unsupported_image_format_error.py +56 -0
  193. numdaplot-0.1.0/src/numdaplot/errors/unsupported_index_error.py +38 -0
  194. numdaplot-0.1.0/src/numdaplot/errors/unsupported_missing_error.py +129 -0
  195. numdaplot-0.1.0/src/numdaplot/errors/unsupported_type_error.py +62 -0
  196. numdaplot-0.1.0/src/numdaplot/errors/value_conversion_error.py +215 -0
  197. numdaplot-0.1.0/src/numdaplot/ordering/__init__.py +5 -0
  198. numdaplot-0.1.0/src/numdaplot/ordering/missing_position.py +46 -0
  199. numdaplot-0.1.0/src/numdaplot/ordering/order.py +46 -0
  200. numdaplot-0.1.0/src/numdaplot/package_version.py +36 -0
  201. numdaplot-0.1.0/src/numdaplot/plots/__init__.py +5 -0
  202. numdaplot-0.1.0/src/numdaplot/plots/chart_layer.py +47 -0
  203. numdaplot-0.1.0/src/numdaplot/plots/charts/__init__.py +5 -0
  204. numdaplot-0.1.0/src/numdaplot/plots/charts/bar_chart.py +98 -0
  205. numdaplot-0.1.0/src/numdaplot/plots/charts/bar_layout.py +58 -0
  206. numdaplot-0.1.0/src/numdaplot/plots/charts/bin_count.py +61 -0
  207. numdaplot-0.1.0/src/numdaplot/plots/charts/bin_width.py +78 -0
  208. numdaplot-0.1.0/src/numdaplot/plots/charts/box_chart.py +97 -0
  209. numdaplot-0.1.0/src/numdaplot/plots/charts/cell_values.py +61 -0
  210. numdaplot-0.1.0/src/numdaplot/plots/charts/chart.py +59 -0
  211. numdaplot-0.1.0/src/numdaplot/plots/charts/chart_settings.py +105 -0
  212. numdaplot-0.1.0/src/numdaplot/plots/charts/color_scale.py +147 -0
  213. numdaplot-0.1.0/src/numdaplot/plots/charts/heatmap_chart.py +92 -0
  214. numdaplot-0.1.0/src/numdaplot/plots/charts/histogram_chart.py +93 -0
  215. numdaplot-0.1.0/src/numdaplot/plots/charts/line_chart.py +100 -0
  216. numdaplot-0.1.0/src/numdaplot/plots/charts/line_type.py +75 -0
  217. numdaplot-0.1.0/src/numdaplot/plots/charts/marker_shape.py +113 -0
  218. numdaplot-0.1.0/src/numdaplot/plots/charts/missing_chart.py +60 -0
  219. numdaplot-0.1.0/src/numdaplot/plots/charts/missing_map_chart.py +27 -0
  220. numdaplot-0.1.0/src/numdaplot/plots/charts/orientation.py +58 -0
  221. numdaplot-0.1.0/src/numdaplot/plots/charts/outliers.py +49 -0
  222. numdaplot-0.1.0/src/numdaplot/plots/charts/percentages.py +55 -0
  223. numdaplot-0.1.0/src/numdaplot/plots/charts/pie_chart.py +87 -0
  224. numdaplot-0.1.0/src/numdaplot/plots/charts/scatter_chart.py +159 -0
  225. numdaplot-0.1.0/src/numdaplot/plots/charts/value_axis.py +66 -0
  226. numdaplot-0.1.0/src/numdaplot/plots/data/__init__.py +5 -0
  227. numdaplot-0.1.0/src/numdaplot/plots/data/array_values.py +128 -0
  228. numdaplot-0.1.0/src/numdaplot/plots/data/chart_data.py +143 -0
  229. numdaplot-0.1.0/src/numdaplot/plots/data/chart_values.py +109 -0
  230. numdaplot-0.1.0/src/numdaplot/plots/data/column_reading.py +468 -0
  231. numdaplot-0.1.0/src/numdaplot/plots/data/heatmap_values.py +63 -0
  232. numdaplot-0.1.0/src/numdaplot/plots/data/missing_cells.py +165 -0
  233. numdaplot-0.1.0/src/numdaplot/plots/data/pie_values.py +215 -0
  234. numdaplot-0.1.0/src/numdaplot/plots/data/point_values.py +249 -0
  235. numdaplot-0.1.0/src/numdaplot/plots/data/position_kind.py +83 -0
  236. numdaplot-0.1.0/src/numdaplot/plots/data/renamed_layers.py +340 -0
  237. numdaplot-0.1.0/src/numdaplot/plots/data/sample_values.py +160 -0
  238. numdaplot-0.1.0/src/numdaplot/plots/data/shown_columns.py +248 -0
  239. numdaplot-0.1.0/src/numdaplot/plots/data/table_values.py +256 -0
  240. numdaplot-0.1.0/src/numdaplot/plots/data/unique_labels.py +45 -0
  241. numdaplot-0.1.0/src/numdaplot/plots/drawing/__init__.py +5 -0
  242. numdaplot-0.1.0/src/numdaplot/plots/drawing/bar_drawing.py +316 -0
  243. numdaplot-0.1.0/src/numdaplot/plots/drawing/box_drawing.py +344 -0
  244. numdaplot-0.1.0/src/numdaplot/plots/drawing/cell_merging.py +237 -0
  245. numdaplot-0.1.0/src/numdaplot/plots/drawing/chart_texts.py +124 -0
  246. numdaplot-0.1.0/src/numdaplot/plots/drawing/color_bar.py +57 -0
  247. numdaplot-0.1.0/src/numdaplot/plots/drawing/color_scale_values.py +120 -0
  248. numdaplot-0.1.0/src/numdaplot/plots/drawing/default_labels.py +41 -0
  249. numdaplot-0.1.0/src/numdaplot/plots/drawing/drawn_chart.py +50 -0
  250. numdaplot-0.1.0/src/numdaplot/plots/drawing/grid_axes.py +75 -0
  251. numdaplot-0.1.0/src/numdaplot/plots/drawing/heatmap_drawing.py +313 -0
  252. numdaplot-0.1.0/src/numdaplot/plots/drawing/histogram_drawing.py +350 -0
  253. numdaplot-0.1.0/src/numdaplot/plots/drawing/label_room.py +344 -0
  254. numdaplot-0.1.0/src/numdaplot/plots/drawing/label_thinning.py +216 -0
  255. numdaplot-0.1.0/src/numdaplot/plots/drawing/layer_alignment.py +319 -0
  256. numdaplot-0.1.0/src/numdaplot/plots/drawing/layer_colors.py +123 -0
  257. numdaplot-0.1.0/src/numdaplot/plots/drawing/line_drawing.py +85 -0
  258. numdaplot-0.1.0/src/numdaplot/plots/drawing/marker_codes.py +20 -0
  259. numdaplot-0.1.0/src/numdaplot/plots/drawing/missing_drawing.py +360 -0
  260. numdaplot-0.1.0/src/numdaplot/plots/drawing/moment_period_formatter.py +253 -0
  261. numdaplot-0.1.0/src/numdaplot/plots/drawing/pie_drawing.py +185 -0
  262. numdaplot-0.1.0/src/numdaplot/plots/drawing/plot_axes.py +38 -0
  263. numdaplot-0.1.0/src/numdaplot/plots/drawing/plot_drawing.py +288 -0
  264. numdaplot-0.1.0/src/numdaplot/plots/drawing/plot_theme.py +45 -0
  265. numdaplot-0.1.0/src/numdaplot/plots/drawing/position_axis.py +278 -0
  266. numdaplot-0.1.0/src/numdaplot/plots/drawing/scatter_drawing.py +364 -0
  267. numdaplot-0.1.0/src/numdaplot/plots/drawing/series_colors.py +177 -0
  268. numdaplot-0.1.0/src/numdaplot/plots/drawing/size_inches.py +45 -0
  269. numdaplot-0.1.0/src/numdaplot/plots/drawing/style_drawing.py +410 -0
  270. numdaplot-0.1.0/src/numdaplot/plots/drawing/text_contrast.py +44 -0
  271. numdaplot-0.1.0/src/numdaplot/plots/drawing/tick_rotation.py +354 -0
  272. numdaplot-0.1.0/src/numdaplot/plots/drawing/time_axis.py +212 -0
  273. numdaplot-0.1.0/src/numdaplot/plots/drawing/whole_numbers.py +72 -0
  274. numdaplot-0.1.0/src/numdaplot/plots/figure/__init__.py +5 -0
  275. numdaplot-0.1.0/src/numdaplot/plots/figure/cell.py +95 -0
  276. numdaplot-0.1.0/src/numdaplot/plots/figure/figure.py +256 -0
  277. numdaplot-0.1.0/src/numdaplot/plots/figure/figure_drawing.py +99 -0
  278. numdaplot-0.1.0/src/numdaplot/plots/figure/figure_style.py +60 -0
  279. numdaplot-0.1.0/src/numdaplot/plots/figure/layout.py +71 -0
  280. numdaplot-0.1.0/src/numdaplot/plots/figure/placement.py +150 -0
  281. numdaplot-0.1.0/src/numdaplot/plots/layer_reading.py +166 -0
  282. numdaplot-0.1.0/src/numdaplot/plots/output/__init__.py +5 -0
  283. numdaplot-0.1.0/src/numdaplot/plots/output/image_saving.py +187 -0
  284. numdaplot-0.1.0/src/numdaplot/plots/output/plot_display.py +181 -0
  285. numdaplot-0.1.0/src/numdaplot/plots/output/shown_object.py +45 -0
  286. numdaplot-0.1.0/src/numdaplot/plots/overlay_checks.py +245 -0
  287. numdaplot-0.1.0/src/numdaplot/plots/plot.py +31 -0
  288. numdaplot-0.1.0/src/numdaplot/plots/plot_data.py +140 -0
  289. numdaplot-0.1.0/src/numdaplot/plots/plot_distribution_creation.py +237 -0
  290. numdaplot-0.1.0/src/numdaplot/plots/plot_output.py +124 -0
  291. numdaplot-0.1.0/src/numdaplot/plots/plot_overlays.py +273 -0
  292. numdaplot-0.1.0/src/numdaplot/plots/plot_overview_creation.py +195 -0
  293. numdaplot-0.1.0/src/numdaplot/plots/plot_series_creation.py +213 -0
  294. numdaplot-0.1.0/src/numdaplot/plots/style/__init__.py +5 -0
  295. numdaplot-0.1.0/src/numdaplot/plots/style/axis_settings.py +60 -0
  296. numdaplot-0.1.0/src/numdaplot/plots/style/color.py +168 -0
  297. numdaplot-0.1.0/src/numdaplot/plots/style/custom_color.py +65 -0
  298. numdaplot-0.1.0/src/numdaplot/plots/style/grid_lines.py +49 -0
  299. numdaplot-0.1.0/src/numdaplot/plots/style/image_options.py +71 -0
  300. numdaplot-0.1.0/src/numdaplot/plots/style/legend_position.py +149 -0
  301. numdaplot-0.1.0/src/numdaplot/plots/style/plot_style.py +136 -0
  302. numdaplot-0.1.0/src/numdaplot/plots/style/size.py +70 -0
  303. numdaplot-0.1.0/src/numdaplot/plots/style/size_unit.py +62 -0
  304. numdaplot-0.1.0/src/numdaplot/positions/__init__.py +5 -0
  305. numdaplot-0.1.0/src/numdaplot/positions/axis.py +54 -0
  306. numdaplot-0.1.0/src/numdaplot/positions/index.py +51 -0
  307. numdaplot-0.1.0/src/numdaplot/positions/range.py +90 -0
  308. numdaplot-0.1.0/src/numdaplot/positions/region.py +92 -0
  309. numdaplot-0.1.0/src/numdaplot/py.typed +0 -0
  310. numdaplot-0.1.0/src/numdaplot/ratios/__init__.py +5 -0
  311. numdaplot-0.1.0/src/numdaplot/ratios/fraction.py +40 -0
  312. numdaplot-0.1.0/src/numdaplot/ratios/measure.py +48 -0
  313. numdaplot-0.1.0/src/numdaplot/rules/__init__.py +5 -0
  314. numdaplot-0.1.0/src/numdaplot/rules/between.py +78 -0
  315. numdaplot-0.1.0/src/numdaplot/rules/bounds.py +83 -0
  316. numdaplot-0.1.0/src/numdaplot/rules/case.py +48 -0
  317. numdaplot-0.1.0/src/numdaplot/rules/contains.py +63 -0
  318. numdaplot-0.1.0/src/numdaplot/rules/equal.py +43 -0
  319. numdaplot-0.1.0/src/numdaplot/rules/greater.py +39 -0
  320. numdaplot-0.1.0/src/numdaplot/rules/greater_or_equal.py +38 -0
  321. numdaplot-0.1.0/src/numdaplot/rules/is_in.py +67 -0
  322. numdaplot-0.1.0/src/numdaplot/rules/is_missing.py +25 -0
  323. numdaplot-0.1.0/src/numdaplot/rules/is_present.py +25 -0
  324. numdaplot-0.1.0/src/numdaplot/rules/less.py +39 -0
  325. numdaplot-0.1.0/src/numdaplot/rules/less_or_equal.py +38 -0
  326. numdaplot-0.1.0/src/numdaplot/rules/not_equal.py +45 -0
  327. numdaplot-0.1.0/src/numdaplot/rules/rule.py +62 -0
  328. numdaplot-0.1.0/src/numdaplot/rules/rule_values.py +44 -0
  329. numdaplot-0.1.0/src/numdaplot/rules/value_rule.py +110 -0
  330. numdaplot-0.1.0/src/numdaplot/settings/__init__.py +5 -0
  331. numdaplot-0.1.0/src/numdaplot/settings/argument_types.py +327 -0
  332. numdaplot-0.1.0/src/numdaplot/settings/field_types.py +593 -0
  333. numdaplot-0.1.0/src/numdaplot/statistics/__init__.py +5 -0
  334. numdaplot-0.1.0/src/numdaplot/statistics/count.py +71 -0
  335. numdaplot-0.1.0/src/numdaplot/statistics/count_distinct.py +27 -0
  336. numdaplot-0.1.0/src/numdaplot/statistics/counted_missing.py +46 -0
  337. numdaplot-0.1.0/src/numdaplot/statistics/maximum.py +27 -0
  338. numdaplot-0.1.0/src/numdaplot/statistics/mean.py +27 -0
  339. numdaplot-0.1.0/src/numdaplot/statistics/median.py +27 -0
  340. numdaplot-0.1.0/src/numdaplot/statistics/minimum.py +27 -0
  341. numdaplot-0.1.0/src/numdaplot/statistics/most_frequent.py +27 -0
  342. numdaplot-0.1.0/src/numdaplot/statistics/most_frequent_count.py +27 -0
  343. numdaplot-0.1.0/src/numdaplot/statistics/quantile.py +61 -0
  344. numdaplot-0.1.0/src/numdaplot/statistics/standard_deviation.py +29 -0
  345. numdaplot-0.1.0/src/numdaplot/statistics/statistic.py +63 -0
  346. numdaplot-0.1.0/src/numdaplot/statistics/sum.py +27 -0
  347. numdaplot-0.1.0/src/numdaplot/tables/__init__.py +5 -0
  348. numdaplot-0.1.0/src/numdaplot/tables/aggregation/__init__.py +5 -0
  349. numdaplot-0.1.0/src/numdaplot/tables/aggregation/aggregated_frame.py +189 -0
  350. numdaplot-0.1.0/src/numdaplot/tables/aggregation/aggregation.py +97 -0
  351. numdaplot-0.1.0/src/numdaplot/tables/aggregation/calculation.py +123 -0
  352. numdaplot-0.1.0/src/numdaplot/tables/aggregation/result_column.py +108 -0
  353. numdaplot-0.1.0/src/numdaplot/tables/aggregation/row_groups.py +96 -0
  354. numdaplot-0.1.0/src/numdaplot/tables/aggregation/statistic_name.py +122 -0
  355. numdaplot-0.1.0/src/numdaplot/tables/columns/__init__.py +5 -0
  356. numdaplot-0.1.0/src/numdaplot/tables/columns/added_column.py +89 -0
  357. numdaplot-0.1.0/src/numdaplot/tables/columns/boolean_conversion.py +144 -0
  358. numdaplot-0.1.0/src/numdaplot/tables/columns/boolean_rule.py +59 -0
  359. numdaplot-0.1.0/src/numdaplot/tables/columns/bracket_end.py +50 -0
  360. numdaplot-0.1.0/src/numdaplot/tables/columns/bracket_names.py +346 -0
  361. numdaplot-0.1.0/src/numdaplot/tables/columns/bracketed_column.py +179 -0
  362. numdaplot-0.1.0/src/numdaplot/tables/columns/brackets.py +234 -0
  363. numdaplot-0.1.0/src/numdaplot/tables/columns/chosen_columns.py +55 -0
  364. numdaplot-0.1.0/src/numdaplot/tables/columns/column_choice.py +84 -0
  365. numdaplot-0.1.0/src/numdaplot/tables/columns/column_mode.py +64 -0
  366. numdaplot-0.1.0/src/numdaplot/tables/columns/column_names.py +186 -0
  367. numdaplot-0.1.0/src/numdaplot/tables/columns/conversion.py +103 -0
  368. numdaplot-0.1.0/src/numdaplot/tables/columns/converted_column.py +669 -0
  369. numdaplot-0.1.0/src/numdaplot/tables/columns/date_conversion.py +526 -0
  370. numdaplot-0.1.0/src/numdaplot/tables/columns/date_range.py +135 -0
  371. numdaplot-0.1.0/src/numdaplot/tables/columns/name_change.py +67 -0
  372. numdaplot-0.1.0/src/numdaplot/tables/columns/new_column.py +79 -0
  373. numdaplot-0.1.0/src/numdaplot/tables/columns/number_conversion.py +281 -0
  374. numdaplot-0.1.0/src/numdaplot/tables/columns/renamed_columns.py +60 -0
  375. numdaplot-0.1.0/src/numdaplot/tables/columns/renaming.py +81 -0
  376. numdaplot-0.1.0/src/numdaplot/tables/columns/text_conversion.py +70 -0
  377. numdaplot-0.1.0/src/numdaplot/tables/columns/time_conversion.py +313 -0
  378. numdaplot-0.1.0/src/numdaplot/tables/columns/time_zone_conversion.py +128 -0
  379. numdaplot-0.1.0/src/numdaplot/tables/conflict.py +68 -0
  380. numdaplot-0.1.0/src/numdaplot/tables/description/__init__.py +5 -0
  381. numdaplot-0.1.0/src/numdaplot/tables/description/described_frame.py +335 -0
  382. numdaplot-0.1.0/src/numdaplot/tables/description/description.py +155 -0
  383. numdaplot-0.1.0/src/numdaplot/tables/duplicates/__init__.py +5 -0
  384. numdaplot-0.1.0/src/numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
  385. numdaplot-0.1.0/src/numdaplot/tables/duplicates/deduplication.py +88 -0
  386. numdaplot-0.1.0/src/numdaplot/tables/duplicates/keep.py +81 -0
  387. numdaplot-0.1.0/src/numdaplot/tables/files/__init__.py +5 -0
  388. numdaplot-0.1.0/src/numdaplot/tables/files/column_names.py +60 -0
  389. numdaplot-0.1.0/src/numdaplot/tables/files/csv_file.py +265 -0
  390. numdaplot-0.1.0/src/numdaplot/tables/files/csv_read_options.py +89 -0
  391. numdaplot-0.1.0/src/numdaplot/tables/files/csv_separator.py +41 -0
  392. numdaplot-0.1.0/src/numdaplot/tables/files/csv_write_options.py +79 -0
  393. numdaplot-0.1.0/src/numdaplot/tables/files/decimal_count.py +42 -0
  394. numdaplot-0.1.0/src/numdaplot/tables/files/encoding.py +82 -0
  395. numdaplot-0.1.0/src/numdaplot/tables/files/excel_file.py +171 -0
  396. numdaplot-0.1.0/src/numdaplot/tables/files/excel_read_options.py +79 -0
  397. numdaplot-0.1.0/src/numdaplot/tables/files/excel_sheet.py +50 -0
  398. numdaplot-0.1.0/src/numdaplot/tables/files/excel_time_cells.py +146 -0
  399. numdaplot-0.1.0/src/numdaplot/tables/files/excel_write_options.py +63 -0
  400. numdaplot-0.1.0/src/numdaplot/tables/files/file_access.py +152 -0
  401. numdaplot-0.1.0/src/numdaplot/tables/files/file_paths.py +106 -0
  402. numdaplot-0.1.0/src/numdaplot/tables/files/json_decimals.py +387 -0
  403. numdaplot-0.1.0/src/numdaplot/tables/files/json_file.py +203 -0
  404. numdaplot-0.1.0/src/numdaplot/tables/files/json_layout.py +63 -0
  405. numdaplot-0.1.0/src/numdaplot/tables/files/json_read_options.py +64 -0
  406. numdaplot-0.1.0/src/numdaplot/tables/files/json_write_options.py +71 -0
  407. numdaplot-0.1.0/src/numdaplot/tables/files/missing_texts.py +63 -0
  408. numdaplot-0.1.0/src/numdaplot/tables/files/optional_package.py +42 -0
  409. numdaplot-0.1.0/src/numdaplot/tables/files/pandas_backend.py +11 -0
  410. numdaplot-0.1.0/src/numdaplot/tables/files/parquet_file.py +91 -0
  411. numdaplot-0.1.0/src/numdaplot/tables/files/parquet_read_options.py +56 -0
  412. numdaplot-0.1.0/src/numdaplot/tables/files/sas_file.py +94 -0
  413. numdaplot-0.1.0/src/numdaplot/tables/files/sas_read_options.py +67 -0
  414. numdaplot-0.1.0/src/numdaplot/tables/files/stata_file.py +83 -0
  415. numdaplot-0.1.0/src/numdaplot/tables/files/stata_read_options.py +56 -0
  416. numdaplot-0.1.0/src/numdaplot/tables/files/xpt_read_options.py +65 -0
  417. numdaplot-0.1.0/src/numdaplot/tables/filtering/__init__.py +5 -0
  418. numdaplot-0.1.0/src/numdaplot/tables/filtering/checked_frame.py +60 -0
  419. numdaplot-0.1.0/src/numdaplot/tables/filtering/column_mask.py +71 -0
  420. numdaplot-0.1.0/src/numdaplot/tables/filtering/column_match.py +62 -0
  421. numdaplot-0.1.0/src/numdaplot/tables/filtering/condition.py +94 -0
  422. numdaplot-0.1.0/src/numdaplot/tables/filtering/filter.py +74 -0
  423. numdaplot-0.1.0/src/numdaplot/tables/filtering/filter_mode.py +67 -0
  424. numdaplot-0.1.0/src/numdaplot/tables/filtering/row_mask.py +152 -0
  425. numdaplot-0.1.0/src/numdaplot/tables/filtering/rule_moments.py +164 -0
  426. numdaplot-0.1.0/src/numdaplot/tables/frames/__init__.py +5 -0
  427. numdaplot-0.1.0/src/numdaplot/tables/frames/array_frame.py +95 -0
  428. numdaplot-0.1.0/src/numdaplot/tables/frames/cleaned_names.py +132 -0
  429. numdaplot-0.1.0/src/numdaplot/tables/frames/column.py +15 -0
  430. numdaplot-0.1.0/src/numdaplot/tables/frames/column_values.py +273 -0
  431. numdaplot-0.1.0/src/numdaplot/tables/frames/frame_equality.py +130 -0
  432. numdaplot-0.1.0/src/numdaplot/tables/frames/frame_normalization.py +459 -0
  433. numdaplot-0.1.0/src/numdaplot/tables/frames/named_column_errors.py +85 -0
  434. numdaplot-0.1.0/src/numdaplot/tables/frames/pandas_decimals.py +113 -0
  435. numdaplot-0.1.0/src/numdaplot/tables/frames/region_positions.py +113 -0
  436. numdaplot-0.1.0/src/numdaplot/tables/frames/table_text.py +222 -0
  437. numdaplot-0.1.0/src/numdaplot/tables/frames/time_columns.py +345 -0
  438. numdaplot-0.1.0/src/numdaplot/tables/frames/time_range_errors.py +117 -0
  439. numdaplot-0.1.0/src/numdaplot/tables/frames/time_zones.py +271 -0
  440. numdaplot-0.1.0/src/numdaplot/tables/joining/__init__.py +5 -0
  441. numdaplot-0.1.0/src/numdaplot/tables/joining/join.py +110 -0
  442. numdaplot-0.1.0/src/numdaplot/tables/joining/join_keys.py +367 -0
  443. numdaplot-0.1.0/src/numdaplot/tables/joining/join_mode.py +93 -0
  444. numdaplot-0.1.0/src/numdaplot/tables/joining/join_relation.py +149 -0
  445. numdaplot-0.1.0/src/numdaplot/tables/joining/join_suffixes.py +71 -0
  446. numdaplot-0.1.0/src/numdaplot/tables/joining/joined_frame.py +166 -0
  447. numdaplot-0.1.0/src/numdaplot/tables/joining/joined_names.py +107 -0
  448. numdaplot-0.1.0/src/numdaplot/tables/joining/joined_rows.py +235 -0
  449. numdaplot-0.1.0/src/numdaplot/tables/joining/key_types.py +57 -0
  450. numdaplot-0.1.0/src/numdaplot/tables/joining/relation.py +78 -0
  451. numdaplot-0.1.0/src/numdaplot/tables/missing/__init__.py +5 -0
  452. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_count.py +59 -0
  453. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_counts.py +214 -0
  454. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_drop.py +98 -0
  455. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_mode.py +63 -0
  456. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_ratio.py +71 -0
  457. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_removal.py +257 -0
  458. numdaplot-0.1.0/src/numdaplot/tables/missing/missing_summary.py +174 -0
  459. numdaplot-0.1.0/src/numdaplot/tables/missing/ratio_comparison.py +70 -0
  460. numdaplot-0.1.0/src/numdaplot/tables/pivot/__init__.py +5 -0
  461. numdaplot-0.1.0/src/numdaplot/tables/pivot/pivot_table.py +104 -0
  462. numdaplot-0.1.0/src/numdaplot/tables/pivot/pivoted_frame.py +244 -0
  463. numdaplot-0.1.0/src/numdaplot/tables/preview/__init__.py +5 -0
  464. numdaplot-0.1.0/src/numdaplot/tables/preview/notebook_display.py +238 -0
  465. numdaplot-0.1.0/src/numdaplot/tables/preview/preview.py +100 -0
  466. numdaplot-0.1.0/src/numdaplot/tables/preview/preview_rows.py +55 -0
  467. numdaplot-0.1.0/src/numdaplot/tables/preview/shown_columns.py +62 -0
  468. numdaplot-0.1.0/src/numdaplot/tables/preview/side.py +82 -0
  469. numdaplot-0.1.0/src/numdaplot/tables/sorting/__init__.py +5 -0
  470. numdaplot-0.1.0/src/numdaplot/tables/sorting/sort_key.py +71 -0
  471. numdaplot-0.1.0/src/numdaplot/tables/sorting/sorted_frame.py +81 -0
  472. numdaplot-0.1.0/src/numdaplot/tables/sorting/sorting.py +82 -0
  473. numdaplot-0.1.0/src/numdaplot/tables/table.py +71 -0
  474. numdaplot-0.1.0/src/numdaplot/tables/table_calculation.py +172 -0
  475. numdaplot-0.1.0/src/numdaplot/tables/table_columns.py +214 -0
  476. numdaplot-0.1.0/src/numdaplot/tables/table_conversion.py +351 -0
  477. numdaplot-0.1.0/src/numdaplot/tables/table_data.py +321 -0
  478. numdaplot-0.1.0/src/numdaplot/tables/table_display.py +56 -0
  479. numdaplot-0.1.0/src/numdaplot/tables/table_joining.py +80 -0
  480. numdaplot-0.1.0/src/numdaplot/tables/table_layout.py +105 -0
  481. numdaplot-0.1.0/src/numdaplot/tables/table_missing.py +146 -0
  482. numdaplot-0.1.0/src/numdaplot/tables/table_reading.py +451 -0
  483. numdaplot-0.1.0/src/numdaplot/tables/table_refusals.py +295 -0
  484. numdaplot-0.1.0/src/numdaplot/tables/table_selection.py +163 -0
  485. numdaplot-0.1.0/src/numdaplot/tables/table_writing.py +269 -0
  486. numdaplot-0.1.0/tests/data/airline.sas7bdat +0 -0
  487. numdaplot-0.1.0/tests/data/paxraw_d_short.xpt +0 -0
  488. numdaplot-0.1.0/tests/functional/test_argument_types.py +157 -0
  489. numdaplot-0.1.0/tests/functional/test_array_calculation_limits.py +408 -0
  490. numdaplot-0.1.0/tests/functional/test_array_conversion.py +161 -0
  491. numdaplot-0.1.0/tests/functional/test_array_creation.py +161 -0
  492. numdaplot-0.1.0/tests/functional/test_array_dates.py +233 -0
  493. numdaplot-0.1.0/tests/functional/test_array_layout.py +142 -0
  494. numdaplot-0.1.0/tests/functional/test_array_math.py +121 -0
  495. numdaplot-0.1.0/tests/functional/test_array_missing_texts.py +445 -0
  496. numdaplot-0.1.0/tests/functional/test_array_operations.py +143 -0
  497. numdaplot-0.1.0/tests/functional/test_array_refusals.py +70 -0
  498. numdaplot-0.1.0/tests/functional/test_array_selection.py +161 -0
  499. numdaplot-0.1.0/tests/functional/test_array_statistics.py +150 -0
  500. numdaplot-0.1.0/tests/functional/test_bar_number_labels.py +193 -0
  501. numdaplot-0.1.0/tests/functional/test_base_class_refusals.py +126 -0
  502. numdaplot-0.1.0/tests/functional/test_bool_labels.py +211 -0
  503. numdaplot-0.1.0/tests/functional/test_color_scales.py +244 -0
  504. numdaplot-0.1.0/tests/functional/test_column_name_cleaning.py +235 -0
  505. numdaplot-0.1.0/tests/functional/test_column_type_errors.py +208 -0
  506. numdaplot-0.1.0/tests/functional/test_constructor_refusals.py +69 -0
  507. numdaplot-0.1.0/tests/functional/test_csv_decimals.py +157 -0
  508. numdaplot-0.1.0/tests/functional/test_csv_mixed_blocks.py +139 -0
  509. numdaplot-0.1.0/tests/functional/test_data_types.py +38 -0
  510. numdaplot-0.1.0/tests/functional/test_date_parts.py +122 -0
  511. numdaplot-0.1.0/tests/functional/test_default_descriptions.py +419 -0
  512. numdaplot-0.1.0/tests/functional/test_default_settings.py +130 -0
  513. numdaplot-0.1.0/tests/functional/test_default_titles.py +173 -0
  514. numdaplot-0.1.0/tests/functional/test_default_wording.py +285 -0
  515. numdaplot-0.1.0/tests/functional/test_distribution_plots.py +134 -0
  516. numdaplot-0.1.0/tests/functional/test_errors.py +144 -0
  517. numdaplot-0.1.0/tests/functional/test_exact_decimal_reading.py +183 -0
  518. numdaplot-0.1.0/tests/functional/test_family_docstrings.py +104 -0
  519. numdaplot-0.1.0/tests/functional/test_figures.py +109 -0
  520. numdaplot-0.1.0/tests/functional/test_file_access.py +237 -0
  521. numdaplot-0.1.0/tests/functional/test_heatmap_plots.py +211 -0
  522. numdaplot-0.1.0/tests/functional/test_json_decimals.py +313 -0
  523. numdaplot-0.1.0/tests/functional/test_label_thinning.py +375 -0
  524. numdaplot-0.1.0/tests/functional/test_member_examples.py +271 -0
  525. numdaplot-0.1.0/tests/functional/test_missing_plots.py +135 -0
  526. numdaplot-0.1.0/tests/functional/test_missing_texts.py +129 -0
  527. numdaplot-0.1.0/tests/functional/test_number_brackets.py +132 -0
  528. numdaplot-0.1.0/tests/functional/test_object_time_columns.py +223 -0
  529. numdaplot-0.1.0/tests/functional/test_overlaid_plots.py +300 -0
  530. numdaplot-0.1.0/tests/functional/test_pie_plots.py +104 -0
  531. numdaplot-0.1.0/tests/functional/test_plot_display.py +47 -0
  532. numdaplot-0.1.0/tests/functional/test_plot_renaming.py +303 -0
  533. numdaplot-0.1.0/tests/functional/test_plots.py +424 -0
  534. numdaplot-0.1.0/tests/functional/test_positions.py +81 -0
  535. numdaplot-0.1.0/tests/functional/test_public_names.py +71 -0
  536. numdaplot-0.1.0/tests/functional/test_rules.py +69 -0
  537. numdaplot-0.1.0/tests/functional/test_scatter_look.py +237 -0
  538. numdaplot-0.1.0/tests/functional/test_setting_checks.py +134 -0
  539. numdaplot-0.1.0/tests/functional/test_setting_field_types.py +167 -0
  540. numdaplot-0.1.0/tests/functional/test_setting_types.py +174 -0
  541. numdaplot-0.1.0/tests/functional/test_statistics.py +64 -0
  542. numdaplot-0.1.0/tests/functional/test_table_aggregation.py +267 -0
  543. numdaplot-0.1.0/tests/functional/test_table_columns.py +286 -0
  544. numdaplot-0.1.0/tests/functional/test_table_creation.py +174 -0
  545. numdaplot-0.1.0/tests/functional/test_table_dates.py +500 -0
  546. numdaplot-0.1.0/tests/functional/test_table_display.py +138 -0
  547. numdaplot-0.1.0/tests/functional/test_table_files.py +300 -0
  548. numdaplot-0.1.0/tests/functional/test_table_filter.py +148 -0
  549. numdaplot-0.1.0/tests/functional/test_table_join.py +257 -0
  550. numdaplot-0.1.0/tests/functional/test_table_layout.py +111 -0
  551. numdaplot-0.1.0/tests/functional/test_table_missing.py +257 -0
  552. numdaplot-0.1.0/tests/functional/test_table_pivot.py +131 -0
  553. numdaplot-0.1.0/tests/functional/test_table_refusals.py +81 -0
  554. numdaplot-0.1.0/tests/functional/test_table_wide_display.py +139 -0
  555. numdaplot-0.1.0/tests/functional/test_time_limits.py +393 -0
  556. numdaplot-0.1.0/tests/functional/test_time_plots.py +426 -0
  557. numdaplot-0.1.0/tests/functional/test_time_rule_limits.py +231 -0
  558. numdaplot-0.1.0/tests/functional/test_time_storage_limits.py +240 -0
  559. numdaplot-0.1.0/tests/functional/test_time_table_limits.py +188 -0
  560. numdaplot-0.1.0/tests/functional/test_times_of_day.py +462 -0
  561. numdaplot-0.1.0/tests/functional/test_value_mapping.py +100 -0
  562. numdaplot-0.1.0/tests/functional/test_version.py +34 -0
  563. numdaplot-0.1.0/tests/unit/arrays/calculation/test_counting_statistics.py +188 -0
  564. numdaplot-0.1.0/tests/unit/arrays/calculation/test_location_statistics.py +172 -0
  565. numdaplot-0.1.0/tests/unit/arrays/calculation/test_math_function_values.py +201 -0
  566. numdaplot-0.1.0/tests/unit/arrays/calculation/test_statistic_values.py +169 -0
  567. numdaplot-0.1.0/tests/unit/arrays/calculation/test_time_function_values.py +334 -0
  568. numdaplot-0.1.0/tests/unit/arrays/conversion/test_array_text.py +94 -0
  569. numdaplot-0.1.0/tests/unit/arrays/conversion/test_equality_check.py +102 -0
  570. numdaplot-0.1.0/tests/unit/arrays/conversion/test_python_values.py +94 -0
  571. numdaplot-0.1.0/tests/unit/arrays/conversion/test_time_text.py +190 -0
  572. numdaplot-0.1.0/tests/unit/arrays/creation/test_date_parts.py +51 -0
  573. numdaplot-0.1.0/tests/unit/arrays/creation/test_date_parts_values.py +190 -0
  574. numdaplot-0.1.0/tests/unit/arrays/creation/test_distribution.py +51 -0
  575. numdaplot-0.1.0/tests/unit/arrays/creation/test_filled_values.py +54 -0
  576. numdaplot-0.1.0/tests/unit/arrays/creation/test_list_conversion.py +301 -0
  577. numdaplot-0.1.0/tests/unit/arrays/creation/test_list_shape.py +97 -0
  578. numdaplot-0.1.0/tests/unit/arrays/creation/test_normal.py +48 -0
  579. numdaplot-0.1.0/tests/unit/arrays/creation/test_numpy_conversion.py +184 -0
  580. numdaplot-0.1.0/tests/unit/arrays/creation/test_random_integers.py +89 -0
  581. numdaplot-0.1.0/tests/unit/arrays/creation/test_random_values.py +132 -0
  582. numdaplot-0.1.0/tests/unit/arrays/creation/test_range_values.py +109 -0
  583. numdaplot-0.1.0/tests/unit/arrays/creation/test_spacing.py +59 -0
  584. numdaplot-0.1.0/tests/unit/arrays/creation/test_spacing_values.py +54 -0
  585. numdaplot-0.1.0/tests/unit/arrays/creation/test_uniform.py +45 -0
  586. numdaplot-0.1.0/tests/unit/arrays/layout/test_sorting_values.py +115 -0
  587. numdaplot-0.1.0/tests/unit/arrays/layout/test_unique_values.py +43 -0
  588. numdaplot-0.1.0/tests/unit/arrays/mapping/test_mapped_values.py +211 -0
  589. numdaplot-0.1.0/tests/unit/arrays/mapping/test_value_change.py +46 -0
  590. numdaplot-0.1.0/tests/unit/arrays/mapping/test_value_mapping.py +117 -0
  591. numdaplot-0.1.0/tests/unit/arrays/math_functions/test_logarithm.py +51 -0
  592. numdaplot-0.1.0/tests/unit/arrays/math_functions/test_math_function.py +51 -0
  593. numdaplot-0.1.0/tests/unit/arrays/math_functions/test_round.py +31 -0
  594. numdaplot-0.1.0/tests/unit/arrays/operations/test_boolean_operands.py +39 -0
  595. numdaplot-0.1.0/tests/unit/arrays/operations/test_combination.py +106 -0
  596. numdaplot-0.1.0/tests/unit/arrays/operations/test_float_errors.py +91 -0
  597. numdaplot-0.1.0/tests/unit/arrays/operations/test_integer_bounds.py +149 -0
  598. numdaplot-0.1.0/tests/unit/arrays/operations/test_integer_rules.py +319 -0
  599. numdaplot-0.1.0/tests/unit/arrays/operations/test_operand.py +123 -0
  600. numdaplot-0.1.0/tests/unit/arrays/operations/test_time_arithmetic.py +439 -0
  601. numdaplot-0.1.0/tests/unit/arrays/operations/test_time_bounds.py +276 -0
  602. numdaplot-0.1.0/tests/unit/arrays/operations/test_time_result_bounds.py +329 -0
  603. numdaplot-0.1.0/tests/unit/arrays/operations/test_transformation.py +42 -0
  604. numdaplot-0.1.0/tests/unit/arrays/operations/test_type_requirements.py +80 -0
  605. numdaplot-0.1.0/tests/unit/arrays/selection/test_comparison_masks.py +123 -0
  606. numdaplot-0.1.0/tests/unit/arrays/selection/test_membership_masks.py +142 -0
  607. numdaplot-0.1.0/tests/unit/arrays/selection/test_missing_mask.py +84 -0
  608. numdaplot-0.1.0/tests/unit/arrays/selection/test_region_index.py +173 -0
  609. numdaplot-0.1.0/tests/unit/arrays/selection/test_replaced_values.py +117 -0
  610. numdaplot-0.1.0/tests/unit/arrays/selection/test_rule_mask.py +130 -0
  611. numdaplot-0.1.0/tests/unit/arrays/selection/test_time_reference.py +166 -0
  612. numdaplot-0.1.0/tests/unit/arrays/test_array.py +74 -0
  613. numdaplot-0.1.0/tests/unit/arrays/test_array_arithmetic.py +163 -0
  614. numdaplot-0.1.0/tests/unit/arrays/test_array_calculation.py +202 -0
  615. numdaplot-0.1.0/tests/unit/arrays/test_array_conversion.py +191 -0
  616. numdaplot-0.1.0/tests/unit/arrays/test_array_creation.py +188 -0
  617. numdaplot-0.1.0/tests/unit/arrays/test_array_data.py +309 -0
  618. numdaplot-0.1.0/tests/unit/arrays/test_array_layout.py +221 -0
  619. numdaplot-0.1.0/tests/unit/arrays/test_array_logic.py +139 -0
  620. numdaplot-0.1.0/tests/unit/arrays/test_array_refusals.py +82 -0
  621. numdaplot-0.1.0/tests/unit/arrays/test_array_selection.py +210 -0
  622. numdaplot-0.1.0/tests/unit/arrays/test_array_sorting.py +33 -0
  623. numdaplot-0.1.0/tests/unit/arrays/test_axis_number.py +59 -0
  624. numdaplot-0.1.0/tests/unit/arrays/test_equality.py +50 -0
  625. numdaplot-0.1.0/tests/unit/arrays/test_replacement.py +39 -0
  626. numdaplot-0.1.0/tests/unit/arrays/test_shape.py +92 -0
  627. numdaplot-0.1.0/tests/unit/data_types/test_numpy_mapping.py +178 -0
  628. numdaplot-0.1.0/tests/unit/data_types/test_pandas_mapping.py +172 -0
  629. numdaplot-0.1.0/tests/unit/data_types/test_time_of_day.py +152 -0
  630. numdaplot-0.1.0/tests/unit/data_types/test_value_family.py +71 -0
  631. numdaplot-0.1.0/tests/unit/data_types/test_value_type.py +140 -0
  632. numdaplot-0.1.0/tests/unit/dates/test_date_settings.py +160 -0
  633. numdaplot-0.1.0/tests/unit/dates/test_time_function.py +52 -0
  634. numdaplot-0.1.0/tests/unit/errors/test_broadcast_warning.py +43 -0
  635. numdaplot-0.1.0/tests/unit/errors/test_calculation_warning.py +26 -0
  636. numdaplot-0.1.0/tests/unit/errors/test_cell_out_of_range_error.py +49 -0
  637. numdaplot-0.1.0/tests/unit/errors/test_column_not_found_error.py +69 -0
  638. numdaplot-0.1.0/tests/unit/errors/test_conflicting_settings_error.py +45 -0
  639. numdaplot-0.1.0/tests/unit/errors/test_dimension_error.py +45 -0
  640. numdaplot-0.1.0/tests/unit/errors/test_display_warning.py +53 -0
  641. numdaplot-0.1.0/tests/unit/errors/test_duplicate_column_error.py +82 -0
  642. numdaplot-0.1.0/tests/unit/errors/test_duplicate_label_error.py +43 -0
  643. numdaplot-0.1.0/tests/unit/errors/test_duplicate_value_error.py +33 -0
  644. numdaplot-0.1.0/tests/unit/errors/test_empty_array_error.py +43 -0
  645. numdaplot-0.1.0/tests/unit/errors/test_empty_list_error.py +43 -0
  646. numdaplot-0.1.0/tests/unit/errors/test_empty_region_error.py +29 -0
  647. numdaplot-0.1.0/tests/unit/errors/test_empty_text_error.py +29 -0
  648. numdaplot-0.1.0/tests/unit/errors/test_empty_total_error.py +45 -0
  649. numdaplot-0.1.0/tests/unit/errors/test_empty_values_error.py +29 -0
  650. numdaplot-0.1.0/tests/unit/errors/test_file_access_error.py +48 -0
  651. numdaplot-0.1.0/tests/unit/errors/test_file_exists_error.py +54 -0
  652. numdaplot-0.1.0/tests/unit/errors/test_file_not_found_error.py +54 -0
  653. numdaplot-0.1.0/tests/unit/errors/test_incompatible_charts_error.py +47 -0
  654. numdaplot-0.1.0/tests/unit/errors/test_incompatible_types_error.py +84 -0
  655. numdaplot-0.1.0/tests/unit/errors/test_integer_overflow_error.py +45 -0
  656. numdaplot-0.1.0/tests/unit/errors/test_invalid_base_error.py +43 -0
  657. numdaplot-0.1.0/tests/unit/errors/test_invalid_bin_width_error.py +60 -0
  658. numdaplot-0.1.0/tests/unit/errors/test_invalid_bounds_error.py +45 -0
  659. numdaplot-0.1.0/tests/unit/errors/test_invalid_chart_data_error.py +63 -0
  660. numdaplot-0.1.0/tests/unit/errors/test_invalid_color_count_error.py +45 -0
  661. numdaplot-0.1.0/tests/unit/errors/test_invalid_color_error.py +43 -0
  662. numdaplot-0.1.0/tests/unit/errors/test_invalid_column_name_error.py +43 -0
  663. numdaplot-0.1.0/tests/unit/errors/test_invalid_conversion_error.py +111 -0
  664. numdaplot-0.1.0/tests/unit/errors/test_invalid_count_error.py +45 -0
  665. numdaplot-0.1.0/tests/unit/errors/test_invalid_date_format_error.py +43 -0
  666. numdaplot-0.1.0/tests/unit/errors/test_invalid_deviation_error.py +43 -0
  667. numdaplot-0.1.0/tests/unit/errors/test_invalid_fraction_error.py +43 -0
  668. numdaplot-0.1.0/tests/unit/errors/test_invalid_label_count_error.py +35 -0
  669. numdaplot-0.1.0/tests/unit/errors/test_invalid_limits_error.py +61 -0
  670. numdaplot-0.1.0/tests/unit/errors/test_invalid_opacity_error.py +43 -0
  671. numdaplot-0.1.0/tests/unit/errors/test_invalid_point_size_error.py +43 -0
  672. numdaplot-0.1.0/tests/unit/errors/test_invalid_position_error.py +60 -0
  673. numdaplot-0.1.0/tests/unit/errors/test_invalid_resolution_error.py +43 -0
  674. numdaplot-0.1.0/tests/unit/errors/test_invalid_rotation_error.py +32 -0
  675. numdaplot-0.1.0/tests/unit/errors/test_invalid_seed_error.py +43 -0
  676. numdaplot-0.1.0/tests/unit/errors/test_invalid_separator_error.py +43 -0
  677. numdaplot-0.1.0/tests/unit/errors/test_invalid_shape_error.py +43 -0
  678. numdaplot-0.1.0/tests/unit/errors/test_invalid_sheet_name_error.py +33 -0
  679. numdaplot-0.1.0/tests/unit/errors/test_invalid_size_error.py +45 -0
  680. numdaplot-0.1.0/tests/unit/errors/test_invalid_step_error.py +61 -0
  681. numdaplot-0.1.0/tests/unit/errors/test_invalid_suffixes_error.py +35 -0
  682. numdaplot-0.1.0/tests/unit/errors/test_invalid_time_zone_change_error.py +59 -0
  683. numdaplot-0.1.0/tests/unit/errors/test_invalid_type_error.py +51 -0
  684. numdaplot-0.1.0/tests/unit/errors/test_irregular_list_error.py +31 -0
  685. numdaplot-0.1.0/tests/unit/errors/test_join_relation_error.py +106 -0
  686. numdaplot-0.1.0/tests/unit/errors/test_missing_dependency_error.py +45 -0
  687. numdaplot-0.1.0/tests/unit/errors/test_missing_type_error.py +31 -0
  688. numdaplot-0.1.0/tests/unit/errors/test_missing_value_error.py +45 -0
  689. numdaplot-0.1.0/tests/unit/errors/test_not_single_value_error.py +43 -0
  690. numdaplot-0.1.0/tests/unit/errors/test_numdaplot_error.py +30 -0
  691. numdaplot-0.1.0/tests/unit/errors/test_numdaplot_warning.py +26 -0
  692. numdaplot-0.1.0/tests/unit/errors/test_occupied_cell_error.py +45 -0
  693. numdaplot-0.1.0/tests/unit/errors/test_out_of_domain_error.py +57 -0
  694. numdaplot-0.1.0/tests/unit/errors/test_readability_warning.py +53 -0
  695. numdaplot-0.1.0/tests/unit/errors/test_refused_operation_error.py +45 -0
  696. numdaplot-0.1.0/tests/unit/errors/test_refused_setting_error.py +45 -0
  697. numdaplot-0.1.0/tests/unit/errors/test_repeated_key.py +24 -0
  698. numdaplot-0.1.0/tests/unit/errors/test_shape_mismatch_error.py +59 -0
  699. numdaplot-0.1.0/tests/unit/errors/test_time_overflow_error.py +102 -0
  700. numdaplot-0.1.0/tests/unit/errors/test_time_zone_mismatch_error.py +86 -0
  701. numdaplot-0.1.0/tests/unit/errors/test_unknown_time_zone_error.py +43 -0
  702. numdaplot-0.1.0/tests/unit/errors/test_unmatched_value_error.py +51 -0
  703. numdaplot-0.1.0/tests/unit/errors/test_unsupported_image_format_error.py +43 -0
  704. numdaplot-0.1.0/tests/unit/errors/test_unsupported_index_error.py +33 -0
  705. numdaplot-0.1.0/tests/unit/errors/test_unsupported_missing_error.py +117 -0
  706. numdaplot-0.1.0/tests/unit/errors/test_unsupported_type_error.py +45 -0
  707. numdaplot-0.1.0/tests/unit/errors/test_value_conversion_error.py +233 -0
  708. numdaplot-0.1.0/tests/unit/plots/charts/test_bins.py +106 -0
  709. numdaplot-0.1.0/tests/unit/plots/charts/test_chart.py +51 -0
  710. numdaplot-0.1.0/tests/unit/plots/charts/test_chart_settings.py +93 -0
  711. numdaplot-0.1.0/tests/unit/plots/charts/test_charts.py +297 -0
  712. numdaplot-0.1.0/tests/unit/plots/data/test_array_values.py +139 -0
  713. numdaplot-0.1.0/tests/unit/plots/data/test_chart_data.py +99 -0
  714. numdaplot-0.1.0/tests/unit/plots/data/test_column_reading.py +340 -0
  715. numdaplot-0.1.0/tests/unit/plots/data/test_heatmap_values.py +53 -0
  716. numdaplot-0.1.0/tests/unit/plots/data/test_missing_cells.py +87 -0
  717. numdaplot-0.1.0/tests/unit/plots/data/test_pie_values.py +165 -0
  718. numdaplot-0.1.0/tests/unit/plots/data/test_point_values.py +120 -0
  719. numdaplot-0.1.0/tests/unit/plots/data/test_renamed_layers.py +186 -0
  720. numdaplot-0.1.0/tests/unit/plots/data/test_sample_values.py +164 -0
  721. numdaplot-0.1.0/tests/unit/plots/data/test_shown_columns.py +174 -0
  722. numdaplot-0.1.0/tests/unit/plots/data/test_table_values.py +238 -0
  723. numdaplot-0.1.0/tests/unit/plots/data/test_unique_labels.py +41 -0
  724. numdaplot-0.1.0/tests/unit/plots/drawing/test_bar_drawing.py +145 -0
  725. numdaplot-0.1.0/tests/unit/plots/drawing/test_box_drawing.py +258 -0
  726. numdaplot-0.1.0/tests/unit/plots/drawing/test_cell_merging.py +193 -0
  727. numdaplot-0.1.0/tests/unit/plots/drawing/test_chart_texts.py +58 -0
  728. numdaplot-0.1.0/tests/unit/plots/drawing/test_color_bar.py +68 -0
  729. numdaplot-0.1.0/tests/unit/plots/drawing/test_color_scale_values.py +61 -0
  730. numdaplot-0.1.0/tests/unit/plots/drawing/test_heatmap_drawing.py +278 -0
  731. numdaplot-0.1.0/tests/unit/plots/drawing/test_histogram_drawing.py +398 -0
  732. numdaplot-0.1.0/tests/unit/plots/drawing/test_label_room.py +294 -0
  733. numdaplot-0.1.0/tests/unit/plots/drawing/test_label_thinning.py +270 -0
  734. numdaplot-0.1.0/tests/unit/plots/drawing/test_layer_alignment.py +274 -0
  735. numdaplot-0.1.0/tests/unit/plots/drawing/test_layer_colors.py +73 -0
  736. numdaplot-0.1.0/tests/unit/plots/drawing/test_line_drawing.py +95 -0
  737. numdaplot-0.1.0/tests/unit/plots/drawing/test_missing_drawing.py +311 -0
  738. numdaplot-0.1.0/tests/unit/plots/drawing/test_moment_period_formatter.py +369 -0
  739. numdaplot-0.1.0/tests/unit/plots/drawing/test_pie_drawing.py +169 -0
  740. numdaplot-0.1.0/tests/unit/plots/drawing/test_plot_drawing.py +267 -0
  741. numdaplot-0.1.0/tests/unit/plots/drawing/test_position_axis.py +170 -0
  742. numdaplot-0.1.0/tests/unit/plots/drawing/test_scatter_drawing.py +186 -0
  743. numdaplot-0.1.0/tests/unit/plots/drawing/test_series_colors.py +121 -0
  744. numdaplot-0.1.0/tests/unit/plots/drawing/test_size_inches.py +55 -0
  745. numdaplot-0.1.0/tests/unit/plots/drawing/test_style_drawing.py +304 -0
  746. numdaplot-0.1.0/tests/unit/plots/drawing/test_text_contrast.py +48 -0
  747. numdaplot-0.1.0/tests/unit/plots/drawing/test_tick_rotation.py +389 -0
  748. numdaplot-0.1.0/tests/unit/plots/drawing/test_time_axis.py +195 -0
  749. numdaplot-0.1.0/tests/unit/plots/drawing/test_whole_numbers.py +67 -0
  750. numdaplot-0.1.0/tests/unit/plots/figure/test_cell.py +61 -0
  751. numdaplot-0.1.0/tests/unit/plots/figure/test_figure.py +177 -0
  752. numdaplot-0.1.0/tests/unit/plots/figure/test_figure_drawing.py +84 -0
  753. numdaplot-0.1.0/tests/unit/plots/figure/test_figure_style.py +35 -0
  754. numdaplot-0.1.0/tests/unit/plots/figure/test_layout.py +42 -0
  755. numdaplot-0.1.0/tests/unit/plots/figure/test_placement.py +88 -0
  756. numdaplot-0.1.0/tests/unit/plots/output/test_image_saving.py +195 -0
  757. numdaplot-0.1.0/tests/unit/plots/output/test_plot_display.py +440 -0
  758. numdaplot-0.1.0/tests/unit/plots/output/test_shown_object.py +29 -0
  759. numdaplot-0.1.0/tests/unit/plots/style/test_axis_settings.py +55 -0
  760. numdaplot-0.1.0/tests/unit/plots/style/test_style_settings.py +183 -0
  761. numdaplot-0.1.0/tests/unit/plots/test_layer_reading.py +86 -0
  762. numdaplot-0.1.0/tests/unit/plots/test_overlay_checks.py +167 -0
  763. numdaplot-0.1.0/tests/unit/plots/test_plot.py +66 -0
  764. numdaplot-0.1.0/tests/unit/plots/test_plot_data.py +84 -0
  765. numdaplot-0.1.0/tests/unit/plots/test_plot_distribution_creation.py +143 -0
  766. numdaplot-0.1.0/tests/unit/plots/test_plot_output.py +230 -0
  767. numdaplot-0.1.0/tests/unit/plots/test_plot_overlays.py +181 -0
  768. numdaplot-0.1.0/tests/unit/plots/test_plot_overview_creation.py +53 -0
  769. numdaplot-0.1.0/tests/unit/plots/test_plot_series_creation.py +95 -0
  770. numdaplot-0.1.0/tests/unit/positions/test_index.py +38 -0
  771. numdaplot-0.1.0/tests/unit/positions/test_range.py +80 -0
  772. numdaplot-0.1.0/tests/unit/positions/test_region.py +111 -0
  773. numdaplot-0.1.0/tests/unit/ratios/test_fraction.py +46 -0
  774. numdaplot-0.1.0/tests/unit/rules/test_between.py +111 -0
  775. numdaplot-0.1.0/tests/unit/rules/test_bounds.py +25 -0
  776. numdaplot-0.1.0/tests/unit/rules/test_contains.py +46 -0
  777. numdaplot-0.1.0/tests/unit/rules/test_is_in.py +85 -0
  778. numdaplot-0.1.0/tests/unit/rules/test_rule.py +51 -0
  779. numdaplot-0.1.0/tests/unit/rules/test_value_rule.py +157 -0
  780. numdaplot-0.1.0/tests/unit/settings/test_argument_types.py +215 -0
  781. numdaplot-0.1.0/tests/unit/settings/test_field_types.py +263 -0
  782. numdaplot-0.1.0/tests/unit/statistics/test_count.py +45 -0
  783. numdaplot-0.1.0/tests/unit/statistics/test_quantile.py +63 -0
  784. numdaplot-0.1.0/tests/unit/statistics/test_statistic.py +51 -0
  785. numdaplot-0.1.0/tests/unit/tables/aggregation/test_aggregation_settings.py +128 -0
  786. numdaplot-0.1.0/tests/unit/tables/aggregation/test_aggregation_values.py +365 -0
  787. numdaplot-0.1.0/tests/unit/tables/aggregation/test_statistic_name.py +97 -0
  788. numdaplot-0.1.0/tests/unit/tables/columns/test_boolean_conversion.py +152 -0
  789. numdaplot-0.1.0/tests/unit/tables/columns/test_bracket_names.py +229 -0
  790. numdaplot-0.1.0/tests/unit/tables/columns/test_bracketed_column.py +139 -0
  791. numdaplot-0.1.0/tests/unit/tables/columns/test_brackets.py +194 -0
  792. numdaplot-0.1.0/tests/unit/tables/columns/test_column_conversion.py +601 -0
  793. numdaplot-0.1.0/tests/unit/tables/columns/test_column_names.py +126 -0
  794. numdaplot-0.1.0/tests/unit/tables/columns/test_column_operations.py +213 -0
  795. numdaplot-0.1.0/tests/unit/tables/columns/test_column_settings.py +173 -0
  796. numdaplot-0.1.0/tests/unit/tables/columns/test_conversion_settings.py +339 -0
  797. numdaplot-0.1.0/tests/unit/tables/columns/test_date_conversion.py +556 -0
  798. numdaplot-0.1.0/tests/unit/tables/columns/test_date_range.py +119 -0
  799. numdaplot-0.1.0/tests/unit/tables/columns/test_time_conversion.py +221 -0
  800. numdaplot-0.1.0/tests/unit/tables/columns/test_time_zone_conversion.py +117 -0
  801. numdaplot-0.1.0/tests/unit/tables/description/test_described_frame.py +196 -0
  802. numdaplot-0.1.0/tests/unit/tables/description/test_description.py +103 -0
  803. numdaplot-0.1.0/tests/unit/tables/duplicates/test_duplicates.py +138 -0
  804. numdaplot-0.1.0/tests/unit/tables/files/test_csv_file.py +420 -0
  805. numdaplot-0.1.0/tests/unit/tables/files/test_csv_read_options.py +86 -0
  806. numdaplot-0.1.0/tests/unit/tables/files/test_csv_separator.py +38 -0
  807. numdaplot-0.1.0/tests/unit/tables/files/test_csv_write_options.py +64 -0
  808. numdaplot-0.1.0/tests/unit/tables/files/test_decimal_count.py +37 -0
  809. numdaplot-0.1.0/tests/unit/tables/files/test_excel_file.py +334 -0
  810. numdaplot-0.1.0/tests/unit/tables/files/test_excel_read_options.py +82 -0
  811. numdaplot-0.1.0/tests/unit/tables/files/test_excel_sheet.py +46 -0
  812. numdaplot-0.1.0/tests/unit/tables/files/test_excel_time_cells.py +208 -0
  813. numdaplot-0.1.0/tests/unit/tables/files/test_excel_write_options.py +45 -0
  814. numdaplot-0.1.0/tests/unit/tables/files/test_file_access.py +175 -0
  815. numdaplot-0.1.0/tests/unit/tables/files/test_file_paths.py +118 -0
  816. numdaplot-0.1.0/tests/unit/tables/files/test_json_decimals.py +208 -0
  817. numdaplot-0.1.0/tests/unit/tables/files/test_json_file.py +167 -0
  818. numdaplot-0.1.0/tests/unit/tables/files/test_json_read_options.py +31 -0
  819. numdaplot-0.1.0/tests/unit/tables/files/test_json_write_options.py +35 -0
  820. numdaplot-0.1.0/tests/unit/tables/files/test_missing_texts.py +66 -0
  821. numdaplot-0.1.0/tests/unit/tables/files/test_optional_package.py +37 -0
  822. numdaplot-0.1.0/tests/unit/tables/files/test_parquet_file.py +103 -0
  823. numdaplot-0.1.0/tests/unit/tables/files/test_parquet_read_options.py +30 -0
  824. numdaplot-0.1.0/tests/unit/tables/files/test_sas_file.py +129 -0
  825. numdaplot-0.1.0/tests/unit/tables/files/test_sas_read_options.py +42 -0
  826. numdaplot-0.1.0/tests/unit/tables/files/test_stata_file.py +64 -0
  827. numdaplot-0.1.0/tests/unit/tables/files/test_stata_read_options.py +30 -0
  828. numdaplot-0.1.0/tests/unit/tables/files/test_xpt_read_options.py +42 -0
  829. numdaplot-0.1.0/tests/unit/tables/filtering/test_checked_frame.py +115 -0
  830. numdaplot-0.1.0/tests/unit/tables/filtering/test_filter_settings.py +88 -0
  831. numdaplot-0.1.0/tests/unit/tables/filtering/test_masks.py +258 -0
  832. numdaplot-0.1.0/tests/unit/tables/filtering/test_rule_moments.py +131 -0
  833. numdaplot-0.1.0/tests/unit/tables/frames/test_array_frame.py +76 -0
  834. numdaplot-0.1.0/tests/unit/tables/frames/test_cleaned_names.py +105 -0
  835. numdaplot-0.1.0/tests/unit/tables/frames/test_column_values.py +249 -0
  836. numdaplot-0.1.0/tests/unit/tables/frames/test_frame_equality.py +151 -0
  837. numdaplot-0.1.0/tests/unit/tables/frames/test_frame_normalization.py +410 -0
  838. numdaplot-0.1.0/tests/unit/tables/frames/test_named_column_errors.py +94 -0
  839. numdaplot-0.1.0/tests/unit/tables/frames/test_pandas_decimals.py +134 -0
  840. numdaplot-0.1.0/tests/unit/tables/frames/test_region_positions.py +145 -0
  841. numdaplot-0.1.0/tests/unit/tables/frames/test_table_text.py +263 -0
  842. numdaplot-0.1.0/tests/unit/tables/frames/test_time_columns.py +204 -0
  843. numdaplot-0.1.0/tests/unit/tables/frames/test_time_range_errors.py +81 -0
  844. numdaplot-0.1.0/tests/unit/tables/frames/test_time_zones.py +153 -0
  845. numdaplot-0.1.0/tests/unit/tables/joining/test_join.py +78 -0
  846. numdaplot-0.1.0/tests/unit/tables/joining/test_join_keys.py +270 -0
  847. numdaplot-0.1.0/tests/unit/tables/joining/test_join_relation.py +175 -0
  848. numdaplot-0.1.0/tests/unit/tables/joining/test_join_suffixes.py +46 -0
  849. numdaplot-0.1.0/tests/unit/tables/joining/test_joined_frame.py +94 -0
  850. numdaplot-0.1.0/tests/unit/tables/joining/test_joined_names.py +77 -0
  851. numdaplot-0.1.0/tests/unit/tables/joining/test_joined_rows.py +119 -0
  852. numdaplot-0.1.0/tests/unit/tables/missing/test_missing_counts.py +238 -0
  853. numdaplot-0.1.0/tests/unit/tables/missing/test_missing_removal.py +248 -0
  854. numdaplot-0.1.0/tests/unit/tables/missing/test_missing_settings.py +110 -0
  855. numdaplot-0.1.0/tests/unit/tables/missing/test_missing_summary.py +122 -0
  856. numdaplot-0.1.0/tests/unit/tables/pivot/test_pivot_table.py +115 -0
  857. numdaplot-0.1.0/tests/unit/tables/pivot/test_pivoted_frame.py +310 -0
  858. numdaplot-0.1.0/tests/unit/tables/preview/test_notebook_columns.py +160 -0
  859. numdaplot-0.1.0/tests/unit/tables/preview/test_notebook_rows.py +154 -0
  860. numdaplot-0.1.0/tests/unit/tables/preview/test_preview.py +447 -0
  861. numdaplot-0.1.0/tests/unit/tables/sorting/test_sorting.py +154 -0
  862. numdaplot-0.1.0/tests/unit/tables/test_table.py +64 -0
  863. numdaplot-0.1.0/tests/unit/tables/test_table_conversion.py +345 -0
  864. numdaplot-0.1.0/tests/unit/tables/test_table_data.py +338 -0
  865. numdaplot-0.1.0/tests/unit/tables/test_table_display.py +185 -0
  866. numdaplot-0.1.0/tests/unit/tables/test_table_joining.py +44 -0
  867. numdaplot-0.1.0/tests/unit/tables/test_table_operations.py +380 -0
  868. numdaplot-0.1.0/tests/unit/tables/test_table_reading.py +230 -0
  869. numdaplot-0.1.0/tests/unit/tables/test_table_refusals.py +86 -0
  870. numdaplot-0.1.0/tests/unit/tables/test_table_writing.py +277 -0
  871. numdaplot-0.1.0/tests/unit/test_package_version.py +89 -0
  872. numdaplot-0.1.0/tests/unit/tools/docs/test_api_pages.py +232 -0
  873. numdaplot-0.1.0/tests/unit/tools/docs/test_code_links.py +303 -0
  874. numdaplot-0.1.0/tests/unit/tools/docs/test_cross_references.py +184 -0
  875. numdaplot-0.1.0/tests/unit/tools/docs/test_default_values.py +212 -0
  876. numdaplot-0.1.0/tests/unit/tools/docs/test_example_code.py +211 -0
  877. numdaplot-0.1.0/tests/unit/tools/docs/test_figure_images.py +225 -0
  878. numdaplot-0.1.0/tests/unit/tools/docs/test_link_targets.py +173 -0
  879. numdaplot-0.1.0/tests/unit/tools/docs/test_page_references.py +100 -0
  880. numdaplot-0.1.0/tests/unit/tools/docs/test_public_bases.py +86 -0
  881. numdaplot-0.1.0/tests/unit/tools/docs/test_section_separators.py +81 -0
  882. numdaplot-0.1.0/tests/unit/tools/docs/test_tab_indentation.py +87 -0
  883. numdaplot-0.1.0/tests/unit/tools/docs/test_value_types.py +127 -0
  884. numdaplot-0.1.0/tests/unit/tools/docs/test_version_directives.py +100 -0
  885. numdaplot-0.1.0/tools/docs/api_pages.py +507 -0
  886. numdaplot-0.1.0/tools/docs/code_links.py +335 -0
  887. numdaplot-0.1.0/tools/docs/cross_references.py +200 -0
  888. numdaplot-0.1.0/tools/docs/default_values.py +262 -0
  889. numdaplot-0.1.0/tools/docs/example_code.py +271 -0
  890. numdaplot-0.1.0/tools/docs/figure_images.py +270 -0
  891. numdaplot-0.1.0/tools/docs/link_targets.py +216 -0
  892. numdaplot-0.1.0/tools/docs/page_references.py +163 -0
  893. numdaplot-0.1.0/tools/docs/public_bases.py +97 -0
  894. numdaplot-0.1.0/tools/docs/section_separators.py +99 -0
  895. numdaplot-0.1.0/tools/docs/tab_indentation.py +106 -0
  896. numdaplot-0.1.0/tools/docs/value_types.py +108 -0
  897. numdaplot-0.1.0/tools/docs/version_directives.py +114 -0
  898. numdaplot-0.1.0/uv.lock +1421 -0
@@ -0,0 +1,47 @@
1
+ name: Checks
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ workflow_call:
8
+
9
+ jobs:
10
+ checks:
11
+ name: Python ${{ matrix.python }} - ${{ matrix.dependencies }} dependencies
12
+ runs-on: ubuntu-24.04
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ include:
17
+ - python: "3.13"
18
+ dependencies: latest
19
+ resolution: highest
20
+ - python: "3.13"
21
+ dependencies: minimum
22
+ resolution: lowest-direct
23
+ - python: "3.14"
24
+ dependencies: latest
25
+ resolution: highest
26
+ steps:
27
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
28
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
29
+ with:
30
+ version: "0.12.23"
31
+ python-version: ${{ matrix.python }}
32
+ - name: Resolve dependencies
33
+ run: uv lock --resolution ${{ matrix.resolution }} --upgrade
34
+ - name: Install
35
+ run: uv sync --frozen --all-extras
36
+ - name: Lint
37
+ run: uv run --frozen ruff check .
38
+ - name: Format
39
+ run: uv run --frozen ruff format --check .
40
+ - name: Type check
41
+ run: uv run --frozen pyright
42
+ - name: Tests
43
+ run: uv run --frozen coverage run run_tests.py
44
+ - name: Coverage
45
+ run: uv run --frozen coverage report
46
+ - name: Documentation
47
+ run: uv run --frozen mkdocs build --strict
@@ -0,0 +1,141 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ concurrency:
11
+ group: release
12
+ cancel-in-progress: false
13
+
14
+ jobs:
15
+ checks:
16
+ uses: ./.github/workflows/checks.yml
17
+
18
+ build:
19
+ name: Build the package
20
+ needs: checks
21
+ runs-on: ubuntu-24.04
22
+ steps:
23
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
24
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
25
+ with:
26
+ version: "0.12.23"
27
+ python-version: "3.13"
28
+ - name: Check that the tag names the version of the project
29
+ run: |
30
+ project_version="$(uv version --short)"
31
+ tag_version="${GITHUB_REF_NAME#v}"
32
+ if [ "$project_version" != "$tag_version" ]; then
33
+ echo "The tag $GITHUB_REF_NAME does not name the version $project_version of pyproject.toml."
34
+ exit 1
35
+ fi
36
+ - name: Read the changes of the version in the changelog
37
+ if: ${{ !contains(github.ref_name, 'rc') }}
38
+ run: |
39
+ version="${GITHUB_REF_NAME#v}"
40
+ awk -v heading="## [$version]" '
41
+ index($0, heading) == 1 { found = 1; next }
42
+ found && /^## \[/ { exit }
43
+ found { print }
44
+ ' CHANGELOG.md > release_notes.md
45
+ if [ ! -s release_notes.md ]; then
46
+ echo "CHANGELOG.md has no section for $version."
47
+ exit 1
48
+ fi
49
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
50
+ if: ${{ !contains(github.ref_name, 'rc') }}
51
+ with:
52
+ name: release-notes
53
+ path: release_notes.md
54
+ - name: Build
55
+ run: uv build
56
+ - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
57
+ with:
58
+ name: package
59
+ path: dist/
60
+
61
+ testpypi:
62
+ name: Publish on TestPyPI
63
+ needs: build
64
+ runs-on: ubuntu-24.04
65
+ environment:
66
+ name: testpypi
67
+ url: https://test.pypi.org/p/numdaplot
68
+ permissions:
69
+ id-token: write
70
+ steps:
71
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
72
+ with:
73
+ name: package
74
+ path: dist/
75
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
76
+ with:
77
+ repository-url: https://test.pypi.org/legacy/
78
+
79
+ pypi:
80
+ name: Publish on PyPI
81
+ needs: testpypi
82
+ if: ${{ !contains(github.ref_name, 'rc') }}
83
+ runs-on: ubuntu-24.04
84
+ environment:
85
+ name: pypi
86
+ url: https://pypi.org/p/numdaplot
87
+ permissions:
88
+ id-token: write
89
+ steps:
90
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
91
+ with:
92
+ name: package
93
+ path: dist/
94
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
95
+
96
+ site:
97
+ name: Publish the site
98
+ needs: pypi
99
+ runs-on: ubuntu-24.04
100
+ environment:
101
+ name: github-pages
102
+ url: ${{ steps.deployment.outputs.page_url }}
103
+ permissions:
104
+ pages: write
105
+ id-token: write
106
+ steps:
107
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
108
+ - uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
109
+ with:
110
+ version: "0.12.23"
111
+ python-version: "3.13"
112
+ - name: Install
113
+ run: uv sync --frozen --all-extras
114
+ - name: Build
115
+ run: uv run --frozen mkdocs build --strict
116
+ - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
117
+ with:
118
+ path: site
119
+ - id: deployment
120
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
121
+
122
+ github-release:
123
+ name: Create the GitHub release
124
+ needs: pypi
125
+ runs-on: ubuntu-24.04
126
+ permissions:
127
+ contents: write
128
+ steps:
129
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
130
+ with:
131
+ name: package
132
+ path: dist/
133
+ - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
134
+ with:
135
+ name: release-notes
136
+ - name: Create the release
137
+ env:
138
+ GH_TOKEN: ${{ github.token }}
139
+ run: >
140
+ gh release create "$GITHUB_REF_NAME" dist/*
141
+ --repo "$GITHUB_REPOSITORY" --title "$GITHUB_REF_NAME" --notes-file release_notes.md
@@ -0,0 +1,10 @@
1
+ .venv/
2
+ __pycache__/
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ site/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ .coverage
10
+ htmlcov/
@@ -0,0 +1,144 @@
1
+ # Changelog
2
+
3
+ All notable changes to numdaplot are listed in this file.
4
+
5
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and numdaplot follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.1.0] - 2026-11-10
9
+
10
+ ### Added
11
+
12
+ - `numdaplot.__version__` gives the version of the installed package.
13
+ - `dir(numdaplot)` and the completion of notebooks show only the public names and `__version__`.
14
+ - `Array`: values of one type in one or several dimensions, created with `Array.from_list`, `Array.from_numpy`,
15
+ `Array.filled`, `Array.from_range`, `Array.from_spacing`, `Array.from_date_parts` and `Array.random`; combined with
16
+ `+`, `-`, `*`, `/`, `//`, `%`, `**` and, for booleans, `&`, `|`, `~`; read with `Array.select`, `Array.check`,
17
+ `Array.take`, `Array.replace`, `Array.compute`, `Array.apply`, `Array.reshape`, `Array.transpose`, `Array.flatten`,
18
+ `Array.sort`, `Array.unique`, `Array.to_list`, `Array.to_value`, `Array.to_numpy` and `Array.is_equal`.
19
+ - `Array.from_date_parts(DateParts(year, month, day))` builds a `DATE` Array from three Arrays of whole numbers, such
20
+ as the day, month and year columns of a file, a date being missing where a part is missing; `ValueConversionError`
21
+ names a part that is not whole or a year, month and day that form no date.
22
+ - Array settings: `Shape`, `Spacing`, `ArraySorting`, `Replacement`, `Equality` and the `TypeMatch` enum.
23
+ - Dates: arithmetic between dates, datetimes, durations and numbers on `Array`, time functions applied by
24
+ `Array.apply` (`TimeFunction`, `DatePart`, `DatePeriod`, `DurationIn`, `ToDuration`, with the `DatePartUnit`,
25
+ `PeriodUnit` and `DurationUnit` enums), date formats and time zones for `Table.convert` (`DateFormat` enum,
26
+ `CustomDateFormat`, `TimeZone`, `TimeZoneChange` and the `TimeZoneMode` enum), and `Table.column_time_zones`.
27
+ - Plots: `Plot.line`, `Plot.bar`, `Plot.scatter`, `Plot.histogram`, `Plot.box`, `Plot.pie`, `Plot.heatmap`,
28
+ `Plot.missing_by_column` and `Plot.missing_map` create a `Plot`, shown with `Plot.show`, saved as a PNG, SVG
29
+ or PDF image with `Plot.save` and turned into a matplotlib figure with `Plot.to_matplotlib`. `Plot.add_line`,
30
+ `Plot.add_bar` and `Plot.add_scatter` draw other charts over a Plot, on its axis or on a second axis on the
31
+ right with the `ValueAxis` enum.
32
+ - Plots of missing values: `Plot.missing_by_column` writes the count and the share of the rows above each bar, and
33
+ `Plot.missing_map` keeps a mark for every missing value of a long Table, with its total in a legend past the axes.
34
+ - `PlotStyle(renaming=Renaming(...))` shows columns under other names in the legend, the labels of boxes, heatmaps
35
+ and missing value charts and the default title and axis labels, on every chart of a Plot, without renaming the
36
+ Table; the columns of an Array are named `"0"`, `"1"`...
37
+ - Plot titles and axis labels are written by default: the title is the `y` label by the `x` label, such as
38
+ `sales by month`, and `PlotStyle` replaces them or removes them with an empty text.
39
+ - Plots with many text labels, such as bars, heatmaps and boxes, only create the labels that fit, so they stay fast
40
+ on long Tables.
41
+ - `Plot.heatmap` shows the mean of the cells in each band when they do not fit in the image, with a
42
+ `ReadabilityWarning`, instead of leaving most of them out.
43
+ - Figures: `Figure` places Plots on the cells of a `Layout` with `Figure.place` and `Cell`, takes its title and its
44
+ size from a `FigureStyle`, and has `show`, `save` and `to_matplotlib` like a Plot.
45
+ - `Plot.show` and `Figure.show` emit a `DisplayWarning` at the line calling them when no window can be opened, such
46
+ as without `tkinter` or on a server, suggesting to install `tkinter` or to save the image.
47
+ - Plot settings: `Chart`, `LineChart`, `BarChart`, `ScatterChart`, `HistogramChart`, `BoxChart`, `PieChart`,
48
+ `HeatmapChart`, `MissingChart`, `BinCount`, `BinWidth`, `PlotStyle`, `Size`, `CustomColor`, `ImageOptions`, and the
49
+ `Color`, `LineType`, `MarkerShape`, `Orientation`, `BarLayout`, `Outliers`, `Percentages`, `ColorScale`,
50
+ `CellValues`, `LegendPosition`, `GridLines` and `SizeUnit` enums.
51
+ - Plots: the labels of an axis without enough room are left out, one out of as many as needed from the first one,
52
+ with a `ReadabilityWarning` when they may be texts.
53
+ - Plot errors and warnings: `ConflictingSettingsError`, `DuplicateLabelError`, `EmptyTotalError`,
54
+ `InvalidBinWidthError`, `InvalidChartDataError`, `InvalidColorCountError`, `InvalidColorError`,
55
+ `InvalidOpacityError`, `InvalidPointSizeError`, `InvalidResolutionError`, `InvalidRotationError`,
56
+ `InvalidSizeError`, `MissingValueError`, `RefusedSettingError`,
57
+ `UnsupportedImageFormatError`, `IncompatibleChartsError`, `OccupiedCellError`, `CellOutOfRangeError`,
58
+ `ReadabilityWarning` and `DisplayWarning`.
59
+ - Date errors: `InvalidConversionError`, `InvalidDateFormatError`, `InvalidTimeZoneChangeError`,
60
+ `TimeZoneMismatchError` and `UnknownTimeZoneError`.
61
+ - `Table`: named columns of one type each, read with `Table.from_csv`, `Table.from_json`, `Table.from_excel`,
62
+ `Table.from_parquet`, `Table.from_stata`, `Table.from_sas`, `Table.from_xpt`, `Table.from_pandas` and
63
+ `Table.from_arrays`; written with `Table.to_csv`, `Table.to_json`, `Table.to_excel`, `Table.to_parquet` and
64
+ `Table.to_stata`; changed with `Table.filter`, `Table.take`, `Table.choose_columns`, `Table.rename`,
65
+ `Table.convert`, `Table.add_column`, `Table.aggregate`, `Table.describe`, `Table.sort`,
66
+ `Table.drop_duplicates` and `Table.drop_missing`; read with `Table.column`, `Table.check`,
67
+ `Table.count_missing`, `Table.to_value`, `Table.to_pandas`, `Table.is_equal`, `Table.row_count`,
68
+ `Table.column_count`, `Table.column_names`, `Table.column_types`, `Table.preview`, `Table.preview_missing`
69
+ and `print`.
70
+ - A `Table` written at the end of a notebook cell is shown as the HTML table of `Table.preview`, with every column
71
+ and the type of each column under its name; a long Table shows its first and last rows, as its text does.
72
+ - `Table.from_csv` gives each column the type of all its values, even when pandas reads a long file in blocks: a
73
+ column mixing numbers and texts keeps every text as written, such as `01`, without the pandas `DtypeWarning`.
74
+ - `Array`, `Table` and `Plot`, and the base classes `Rule`, `Statistic`, `MathFunction`, `TimeFunction`,
75
+ `Distribution` and `Chart`, refuse their constructor with `RefusedOperationError`, which names what to use instead.
76
+ Settings, methods and arithmetic operators check their values against their annotations and raise
77
+ `InvalidTypeError`, which names what they accept.
78
+ - Settings that work as they are may be omitted: `Array.sort`, `Table.preview`, `Table.describe`,
79
+ `Table.drop_duplicates`, `Table.drop_missing` and `Table.count_missing` use their default settings, and the Plot
80
+ creation methods and `Plot.add_*`, except `Plot.pie`, their default chart.
81
+ - `Table.convert` converts booleans to numbers, 1 for `True` and 0 for `False`, and numbers to booleans, only 0 and
82
+ 1 by default or every number but 0 as `True` with `BooleanRule.NONZERO_TRUE`.
83
+ - File settings, separate for reading and writing so that each setting only exists where it applies:
84
+ `CsvReadOptions`, `CsvWriteOptions`, `JsonReadOptions`, `JsonWriteOptions`, `ExcelReadOptions`,
85
+ `ExcelWriteOptions`, `SasReadOptions`, `XptReadOptions`, `ParquetReadOptions` and `StataReadOptions`.
86
+ - Every file reading and `Table.from_pandas` remove the spaces, tabs and line breaks at the start and the end of each
87
+ column name, unless `ColumnNames.KEPT` is given; two names that become the same raise `DuplicateColumnError`.
88
+ - `CsvReadOptions` and `ExcelReadOptions` take `missing_texts`, the texts read as missing values, which replace the 19
89
+ texts pandas reads as missing by default; an Excel column named like one of them, such as `NA`, keeps its name.
90
+ - Table settings: `Filter`, `Condition`,
91
+ `Aggregation`, `Calculation`, `PivotTable`, `Description`, `ColumnChoice`, `Renaming`, `NameChange`, `Conversion`, `NewColumn`,
92
+ `Sorting`, `SortKey`, `Deduplication`, `Preview`, `MissingCount`, `MissingDrop`, `MissingRatio`, and the `BooleanRule`, `Encoding`,
93
+ `JsonLayout`, `Conflict`, `FilterMode`, `ColumnMatch`, `ColumnMode`, `Keep`, `Side`, `ShownColumns`, `MissingMode`,
94
+ `RatioComparison` and `Measure` enums. `Equality` compares two Tables as well as two Arrays.
95
+ - Table errors: `ColumnNotFoundError`, `DuplicateColumnError`, `DuplicateStatisticError`, `EmptyListError`,
96
+ `FileAccessError`, `FileExistsError`, `FileNotFoundError`, `InvalidColumnNameError`, `InvalidSeparatorError`,
97
+ `InvalidSheetNameError`, `MissingDependencyError` and `UnsupportedIndexError`. `FileNotFoundError` and
98
+ `FileExistsError` are also the Python errors of the same name, and `FileAccessError` is also an `OSError`.
99
+ - Distributions: `Distribution`, `Uniform`, `Normal`, `RandomIntegers`.
100
+ - Number brackets: `Conversion(dtype=Type.CATEGORY, format=Brackets(limits, bounds, labels, first, last, others))`
101
+ cuts a number column into categories kept in the order of the brackets, named after the values they hold, such as
102
+ `0 to 9` or `65 or more`, with the `BracketEnd` enum and the `InvalidLimitsError` and `InvalidLabelCountError`
103
+ errors; `UnmatchedValueError` also names a value in no bracket.
104
+ - Value mapping: `Array.apply(ValueMapping(changes=[ValueChange(old_value, new_value)], others=Unmatched.ERROR))`
105
+ replaces listed values by new ones, such as codes by labels, with `DuplicateValueError` for an old value given twice
106
+ and `UnmatchedValueError` for a value without new value; `Unmatched.MISSING` makes those values missing.
107
+ - Math functions: `MathFunction`, `SquareRoot`, `Exponential`, `Logarithm`, `Absolute`, `Round`, `Sine`, `Cosine`.
108
+ - Array errors: `DimensionError`, `EmptyArrayError`, `IncompatibleTypesError`, `InvalidBaseError`,
109
+ `InvalidCountError`, `InvalidDeviationError`, `InvalidPositionError`, `InvalidSeedError`,
110
+ `IntegerOverflowError`, `InvalidShapeError`, `IrregularListError`, `MissingTypeError`, `NotSingleValueError`, `OutOfDomainError`,
111
+ `RefusedOperationError`, `ShapeMismatchError`, `TimeOverflowError`, `UnsupportedMissingError`,
112
+ `ValueConversionError`.
113
+ - `Type.TIME`: times of day from 00:00 to 23:59:59.999999, created from `datetime.time` values with
114
+ `Array.from_list`, read back as `datetime.time` by `to_list`, `to_numpy` and `Table.to_pandas`, compared by the
115
+ rules and sorted; durations of any unit read from numpy or pandas stay `DURATION`.
116
+ - `Table.convert` reads texts as `TIME`, as `HH:MM`, `HH:MM:SS` or `HH:MM:SS.ffffff` by default or with a
117
+ `CustomDateFormat` of a time only such as `"%H%M"`, takes the local time of day of a `DATETIME`, and writes `TIME` as
118
+ texts or categories, `15:35:00` by default.
119
+ - Calculations on `TIME`: two times subtracted give a `DURATION`, a duration added or subtracted moves a time within
120
+ its day with a `TimeOverflowError` past midnight, a `DATE` plus a `TIME` gives a `DATETIME`, `DatePart` reads the
121
+ hour, the minute and the second, and `Min`, `Max`, `Count`, `CountDistinct` and `MostFrequent` apply to times.
122
+ - `TIME` columns are written as texts such as `15:35:00` in CSV, JSON, Excel and Stata files, read back as `TEXT`,
123
+ and as Parquet times read back as `TIME`.
124
+ - `Table.from_excel` reads columns of time cells as `TIME` and columns of duration cells as `DURATION`.
125
+ - Plots place `TIME` columns at their hours on the x axis of line, bar and scatter charts, labeled `HH:MM`, and
126
+ name heatmap rows, pie slices, `color_by` groups and box `group_by` groups with `HH:MM` labels.
127
+ - Plots measure `TIME` values on an axis labeled `HH:MM`: `y` of line and scatter charts, box charts, histograms
128
+ and Arrays of times of day. A histogram of times has one bin per hour from 00:00 to 24:00 by default, and
129
+ `BinWidth` takes a duration of at most a day for times of day.
130
+ - `Table.join` joins two Tables on key columns (`Join`, `JoinMode`, `JoinSuffixes`, `KeyTypes`): inner, left,
131
+ right and outer joins, missing keys never matching, keys of one family by default, an optional check of how many
132
+ times each key appears (`Relation`), `InvalidSuffixesError` and `JoinRelationError`.
133
+ - `Type` enum of value types and its conversion to numpy and pandas dtypes, and the `Library` enum read on
134
+ `UnsupportedTypeError`.
135
+ - Rules: `Equal`, `NotEqual`, `Greater`, `GreaterOrEqual`, `Less`, `LessOrEqual`, `Between`, `IsIn`,
136
+ `Contains`, `IsMissing`, `IsPresent`, with the `Bounds` and `Case` enums.
137
+ - Statistics: `Sum`, `Mean`, `Median`, `Min`, `Max`, `Count` with the `CountedMissing` enum, `CountDistinct`,
138
+ `StandardDeviation`, `Quantile`, `MostFrequent`, `MostFrequentCount`.
139
+ - Positions: `Region`, `Index`, `Range` and the `Axis` enum.
140
+ - Sort settings: `Order` and `MissingPosition` enums.
141
+ - Errors: `NumdaplotError`, `EmptyRegionError`, `EmptyTextError`, `EmptyValuesError`, `InvalidBoundsError`,
142
+ `InvalidFractionError`, `InvalidTypeError`, `InvalidStepError`, `UnsupportedTypeError`, and the
143
+ `BroadcastWarning` and `CalculationWarning` warnings.
144
+ - `NumdaplotWarning`, the base of every numdaplot warning, filters them all at once with the `warnings` module.
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Ryieru
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,176 @@
1
+ Metadata-Version: 2.5
2
+ Name: numdaplot
3
+ Version: 0.1.0
4
+ Summary: A simpler, explicit API over numpy, pandas and matplotlib.
5
+ Project-URL: Repository, https://github.com/Ryieru/numdaplot
6
+ Project-URL: Documentation, https://ryieru.github.io/numdaplot/
7
+ Author: Ryieru
8
+ License-Expression: BSD-3-Clause
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Topic :: Scientific/Engineering
16
+ Classifier: Typing :: Typed
17
+ Requires-Python: >=3.13
18
+ Requires-Dist: matplotlib<4,>=3.10.7
19
+ Requires-Dist: numpy<3,>=2.2
20
+ Requires-Dist: pandas<4,>=2.3
21
+ Provides-Extra: excel
22
+ Requires-Dist: openpyxl<4,>=3.1.3; extra == 'excel'
23
+ Provides-Extra: parquet
24
+ Requires-Dist: pyarrow>=18.1; extra == 'parquet'
25
+ Description-Content-Type: text/markdown
26
+
27
+ # numdaplot
28
+
29
+ A simpler, explicit API over numpy, pandas and matplotlib.
30
+
31
+ Each action has exactly one way to be written, settings are typed objects that check their values
32
+ when they are created, and every operation returns a new object.
33
+
34
+ ```python
35
+ import numdaplot as ndp
36
+
37
+ prices = ndp.Array.from_list([12.5, 8.0, None, 30.0])
38
+ taxed_prices = prices * 1.2
39
+ high_prices = taxed_prices.select(ndp.Greater(10))
40
+ mean_price = prices.compute(ndp.Mean()).to_value()
41
+
42
+ sales = ndp.Table.from_csv("sales.csv")
43
+ expensive = ndp.Condition(rule=ndp.Greater(100), columns=["price"])
44
+ expensive_sales = sales.filter(ndp.Filter(conditions=[expensive]))
45
+ average_price = ndp.Calculation(column="price", function=ndp.Mean())
46
+ by_city = expensive_sales.aggregate(ndp.Aggregation(calculations=[average_price], group_by=["city"]))
47
+
48
+ chart = ndp.BarChart(x="city", y=["price_mean"])
49
+ style = ndp.PlotStyle(title="Average price per city")
50
+ plot = ndp.Plot.bar(by_city, chart, style)
51
+ plot.save("prices.png")
52
+ ```
53
+
54
+ ## Status
55
+
56
+ numdaplot is in alpha: the API can still change between versions, and `ndp.__version__` gives the installed version.
57
+ The shared foundations (types, rules, statistics, positions,
58
+ sort settings, errors), `Array`, `Table`, the tools for missing values and dates (formats, time zones,
59
+ parts, periods and durations), line, bar, scatter, histogram, box, pie, heatmap and missing value plots,
60
+ charts overlaid on a plot, and figures placing plots on a grid are available.
61
+
62
+ ## Requirements
63
+
64
+ - Python 3.13 or later
65
+ - numpy 2.2+, pandas 2.3+ and matplotlib 3.10.7+
66
+ - Optional extras: `excel` (openpyxl) and `parquet` (pyarrow)
67
+
68
+ ## Installation
69
+
70
+ ```
71
+ pip install numdaplot
72
+ pip install "numdaplot[excel,parquet]"
73
+ ```
74
+
75
+ The `excel` extra reads and writes Excel files, the `parquet` extra reads and writes Parquet files.
76
+
77
+ ## Development
78
+
79
+ From a clone of the repository, with [uv](https://docs.astral.sh/uv/):
80
+
81
+ ```
82
+ uv sync --all-extras
83
+ ```
84
+
85
+ The extras are needed to run every test, since the Excel and Parquet tests write real files.
86
+
87
+ ## Run the tests
88
+
89
+ The test entry point runs the unit tests, the functional tests and every docstring example:
90
+
91
+ ```
92
+ uv run python run_tests.py
93
+ ```
94
+
95
+ Arguments are passed to pytest, for example `uv run python run_tests.py -k between`.
96
+
97
+ ## Measure the coverage
98
+
99
+ The coverage of every line and every branch of `src/numdaplot` and `tools/docs` is measured while the whole suite
100
+ runs, and must reach 99.50%:
101
+
102
+ ```
103
+ uv run coverage run run_tests.py
104
+ uv run coverage report
105
+ ```
106
+
107
+ `uv run coverage html` writes a detailed report in `htmlcov/`.
108
+
109
+ ## Check the code
110
+
111
+ ```
112
+ uv run ruff check .
113
+ uv run ruff format --check .
114
+ uv run pyright
115
+ ```
116
+
117
+ ## Documentation
118
+
119
+ The documentation is online at https://ryieru.github.io/numdaplot/. It is generated from the docstrings,
120
+ and shown locally with:
121
+
122
+ ```
123
+ uv run mkdocs serve
124
+ ```
125
+
126
+ ## Release
127
+
128
+ A version is published by pushing a tag `v<version>`. The `Release` workflow then runs the checks, builds the
129
+ package, publishes it on TestPyPI, waits for an approval on GitHub, publishes it on PyPI, publishes the
130
+ documentation site and creates the GitHub release with the changes of `CHANGELOG.md`.
131
+
132
+ 1. A minor or major version, such as `0.2.0` or `1.0.0`, is first tried as a release candidate: set
133
+ `version = "0.2.0rc1"` in `pyproject.toml`, commit, push, then push the tag. A release candidate only goes to
134
+ TestPyPI. Check its page and its installation, and fix with `0.2.0rc2` and so on until it is right.
135
+ 2. Set the final version in `pyproject.toml`, and replace `## [Unreleased]` with `## [0.2.0] - <date>` in
136
+ `CHANGELOG.md`. Commit, push, then push the tag.
137
+ 3. Check the version on TestPyPI, then approve the `pypi` environment in the workflow run on GitHub.
138
+
139
+ A patch version, such as `0.1.1`, skips step 1. When TestPyPI shows a problem, the approval is refused and the patch
140
+ is tried again as `0.1.1rc1`.
141
+
142
+ ```
143
+ git tag v0.2.0rc1
144
+ git push origin v0.2.0rc1
145
+ pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ numdaplot==0.2.0rc1
146
+ ```
147
+
148
+ ## Code organization
149
+
150
+ ```
151
+ src/numdaplot/
152
+ __init__.py every public name, available as ndp.*
153
+ arrays/ Array and its settings: Shape, Spacing, distributions, math functions...
154
+ tables/ Table and its settings: file options, Filter, Aggregation, PivotTable, Sorting, Preview...
155
+ dates/ DateFormat, TimeZone, TimeZoneChange, DatePart, DatePeriod, DurationIn, ToDuration...
156
+ plots/ Plot and its creation methods, the charts, the PlotStyle and Figure
157
+ errors/ NumdaplotError, the precise errors, NumdaplotWarning and the precise warnings
158
+ data_types/ the Type enum and its conversion to numpy and pandas dtypes
159
+ ratios/ validation of fractions between 0 and 1, and the Measure enum
160
+ rules/ tests applied to each value: Equal, Greater, Between, IsIn, Contains, IsMissing...
161
+ statistics/ Sum, Mean, Median, Quantile, StandardDeviation...
162
+ positions/ Region, Index, Range and Axis
163
+ ordering/ Order and MissingPosition
164
+ settings/ check of the settings against their annotations, InvalidTypeError being raised
165
+ tests/
166
+ unit/ one test file per source file, mirroring src/numdaplot
167
+ functional/ one test file per notion, using the library as ndp
168
+ docs/ pages and stylesheet of the documentation site
169
+ tools/docs/ griffe extensions and MkDocs hooks building the documentation site and its API pages
170
+ run_tests.py test entry point
171
+ conftest.py pytest settings shared by the tests and the docstring examples
172
+ ```
173
+
174
+ ## License
175
+
176
+ BSD-3-Clause, see [LICENSE](https://github.com/Ryieru/numdaplot/blob/main/LICENSE).