numdaplot 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (474) hide show
  1. numdaplot/__init__.py +506 -0
  2. numdaplot/arrays/__init__.py +5 -0
  3. numdaplot/arrays/array.py +92 -0
  4. numdaplot/arrays/array_arithmetic.py +404 -0
  5. numdaplot/arrays/array_calculation.py +143 -0
  6. numdaplot/arrays/array_conversion.py +150 -0
  7. numdaplot/arrays/array_creation.py +371 -0
  8. numdaplot/arrays/array_data.py +281 -0
  9. numdaplot/arrays/array_layout.py +179 -0
  10. numdaplot/arrays/array_logic.py +227 -0
  11. numdaplot/arrays/array_reflected_arithmetic.py +334 -0
  12. numdaplot/arrays/array_refusals.py +339 -0
  13. numdaplot/arrays/array_selection.py +195 -0
  14. numdaplot/arrays/array_sorting.py +59 -0
  15. numdaplot/arrays/axis_number.py +58 -0
  16. numdaplot/arrays/calculation/__init__.py +5 -0
  17. numdaplot/arrays/calculation/counting_statistics.py +325 -0
  18. numdaplot/arrays/calculation/location_statistics.py +268 -0
  19. numdaplot/arrays/calculation/math_function_values.py +183 -0
  20. numdaplot/arrays/calculation/statistic_values.py +209 -0
  21. numdaplot/arrays/calculation/time_function_values.py +419 -0
  22. numdaplot/arrays/conversion/__init__.py +5 -0
  23. numdaplot/arrays/conversion/array_text.py +62 -0
  24. numdaplot/arrays/conversion/equality_check.py +72 -0
  25. numdaplot/arrays/conversion/python_values.py +70 -0
  26. numdaplot/arrays/conversion/time_text.py +290 -0
  27. numdaplot/arrays/creation/__init__.py +5 -0
  28. numdaplot/arrays/creation/date_parts.py +89 -0
  29. numdaplot/arrays/creation/date_parts_values.py +437 -0
  30. numdaplot/arrays/creation/distribution.py +54 -0
  31. numdaplot/arrays/creation/filled_values.py +58 -0
  32. numdaplot/arrays/creation/list_conversion.py +311 -0
  33. numdaplot/arrays/creation/list_shape.py +97 -0
  34. numdaplot/arrays/creation/normal.py +65 -0
  35. numdaplot/arrays/creation/numpy_conversion.py +149 -0
  36. numdaplot/arrays/creation/random_integers.py +104 -0
  37. numdaplot/arrays/creation/random_values.py +97 -0
  38. numdaplot/arrays/creation/range_values.py +73 -0
  39. numdaplot/arrays/creation/spacing.py +84 -0
  40. numdaplot/arrays/creation/spacing_values.py +63 -0
  41. numdaplot/arrays/creation/uniform.py +63 -0
  42. numdaplot/arrays/equality.py +68 -0
  43. numdaplot/arrays/layout/__init__.py +5 -0
  44. numdaplot/arrays/layout/sorting_values.py +113 -0
  45. numdaplot/arrays/layout/unique_values.py +49 -0
  46. numdaplot/arrays/mapping/__init__.py +5 -0
  47. numdaplot/arrays/mapping/mapped_values.py +286 -0
  48. numdaplot/arrays/mapping/unmatched.py +50 -0
  49. numdaplot/arrays/mapping/value_change.py +55 -0
  50. numdaplot/arrays/mapping/value_mapping.py +161 -0
  51. numdaplot/arrays/math_functions/__init__.py +5 -0
  52. numdaplot/arrays/math_functions/absolute.py +27 -0
  53. numdaplot/arrays/math_functions/cosine.py +28 -0
  54. numdaplot/arrays/math_functions/exponential.py +27 -0
  55. numdaplot/arrays/math_functions/logarithm.py +72 -0
  56. numdaplot/arrays/math_functions/math_function.py +58 -0
  57. numdaplot/arrays/math_functions/round.py +58 -0
  58. numdaplot/arrays/math_functions/sine.py +28 -0
  59. numdaplot/arrays/math_functions/square_root.py +27 -0
  60. numdaplot/arrays/operations/__init__.py +5 -0
  61. numdaplot/arrays/operations/boolean_operands.py +48 -0
  62. numdaplot/arrays/operations/combination.py +157 -0
  63. numdaplot/arrays/operations/float_errors.py +170 -0
  64. numdaplot/arrays/operations/integer_bounds.py +175 -0
  65. numdaplot/arrays/operations/integer_rules.py +397 -0
  66. numdaplot/arrays/operations/operand.py +139 -0
  67. numdaplot/arrays/operations/time_arithmetic.py +479 -0
  68. numdaplot/arrays/operations/time_bounds.py +286 -0
  69. numdaplot/arrays/operations/time_result_bounds.py +397 -0
  70. numdaplot/arrays/operations/transformation.py +54 -0
  71. numdaplot/arrays/operations/type_requirements.py +94 -0
  72. numdaplot/arrays/replacement.py +66 -0
  73. numdaplot/arrays/selection/__init__.py +5 -0
  74. numdaplot/arrays/selection/comparison_masks.py +131 -0
  75. numdaplot/arrays/selection/membership_masks.py +118 -0
  76. numdaplot/arrays/selection/missing_mask.py +50 -0
  77. numdaplot/arrays/selection/region_index.py +178 -0
  78. numdaplot/arrays/selection/replaced_values.py +120 -0
  79. numdaplot/arrays/selection/rule_mask.py +83 -0
  80. numdaplot/arrays/selection/time_reference.py +172 -0
  81. numdaplot/arrays/shape.py +74 -0
  82. numdaplot/arrays/type_match.py +51 -0
  83. numdaplot/data_types/__init__.py +5 -0
  84. numdaplot/data_types/library.py +57 -0
  85. numdaplot/data_types/numpy_mapping.py +207 -0
  86. numdaplot/data_types/pandas_mapping.py +114 -0
  87. numdaplot/data_types/time_of_day.py +292 -0
  88. numdaplot/data_types/type.py +224 -0
  89. numdaplot/data_types/value_family.py +149 -0
  90. numdaplot/data_types/value_type.py +147 -0
  91. numdaplot/dates/__init__.py +5 -0
  92. numdaplot/dates/custom_date_format.py +83 -0
  93. numdaplot/dates/date_format.py +120 -0
  94. numdaplot/dates/date_part.py +59 -0
  95. numdaplot/dates/date_part_unit.py +153 -0
  96. numdaplot/dates/date_period.py +57 -0
  97. numdaplot/dates/duration_in.py +58 -0
  98. numdaplot/dates/duration_unit.py +90 -0
  99. numdaplot/dates/period_unit.py +101 -0
  100. numdaplot/dates/time_function.py +56 -0
  101. numdaplot/dates/time_zone.py +68 -0
  102. numdaplot/dates/time_zone_change.py +71 -0
  103. numdaplot/dates/time_zone_mode.py +81 -0
  104. numdaplot/dates/to_duration.py +58 -0
  105. numdaplot/errors/__init__.py +7 -0
  106. numdaplot/errors/broadcast_warning.py +36 -0
  107. numdaplot/errors/calculation_warning.py +35 -0
  108. numdaplot/errors/cell_out_of_range_error.py +77 -0
  109. numdaplot/errors/column_not_found_error.py +64 -0
  110. numdaplot/errors/conflicting_settings_error.py +60 -0
  111. numdaplot/errors/dimension_error.py +62 -0
  112. numdaplot/errors/display_warning.py +32 -0
  113. numdaplot/errors/duplicate_column_error.py +82 -0
  114. numdaplot/errors/duplicate_label_error.py +55 -0
  115. numdaplot/errors/duplicate_statistic_error.py +55 -0
  116. numdaplot/errors/duplicate_value_error.py +54 -0
  117. numdaplot/errors/empty_array_error.py +55 -0
  118. numdaplot/errors/empty_list_error.py +52 -0
  119. numdaplot/errors/empty_region_error.py +34 -0
  120. numdaplot/errors/empty_text_error.py +34 -0
  121. numdaplot/errors/empty_total_error.py +62 -0
  122. numdaplot/errors/empty_values_error.py +34 -0
  123. numdaplot/errors/file_access_error.py +70 -0
  124. numdaplot/errors/file_exists_error.py +62 -0
  125. numdaplot/errors/file_not_found_error.py +56 -0
  126. numdaplot/errors/incompatible_charts_error.py +80 -0
  127. numdaplot/errors/incompatible_types_error.py +104 -0
  128. numdaplot/errors/integer_overflow_error.py +61 -0
  129. numdaplot/errors/invalid_base_error.py +52 -0
  130. numdaplot/errors/invalid_bin_width_error.py +66 -0
  131. numdaplot/errors/invalid_bounds_error.py +58 -0
  132. numdaplot/errors/invalid_chart_data_error.py +81 -0
  133. numdaplot/errors/invalid_color_count_error.py +63 -0
  134. numdaplot/errors/invalid_color_error.py +51 -0
  135. numdaplot/errors/invalid_column_name_error.py +52 -0
  136. numdaplot/errors/invalid_conversion_error.py +119 -0
  137. numdaplot/errors/invalid_count_error.py +61 -0
  138. numdaplot/errors/invalid_date_format_error.py +51 -0
  139. numdaplot/errors/invalid_deviation_error.py +52 -0
  140. numdaplot/errors/invalid_fraction_error.py +51 -0
  141. numdaplot/errors/invalid_label_count_error.py +61 -0
  142. numdaplot/errors/invalid_limits_error.py +111 -0
  143. numdaplot/errors/invalid_opacity_error.py +52 -0
  144. numdaplot/errors/invalid_point_size_error.py +52 -0
  145. numdaplot/errors/invalid_position_error.py +106 -0
  146. numdaplot/errors/invalid_resolution_error.py +51 -0
  147. numdaplot/errors/invalid_rotation_error.py +53 -0
  148. numdaplot/errors/invalid_seed_error.py +53 -0
  149. numdaplot/errors/invalid_separator_error.py +52 -0
  150. numdaplot/errors/invalid_shape_error.py +52 -0
  151. numdaplot/errors/invalid_sheet_name_error.py +54 -0
  152. numdaplot/errors/invalid_size_error.py +58 -0
  153. numdaplot/errors/invalid_step_error.py +77 -0
  154. numdaplot/errors/invalid_suffixes_error.py +61 -0
  155. numdaplot/errors/invalid_time_zone_change_error.py +63 -0
  156. numdaplot/errors/invalid_type_error.py +79 -0
  157. numdaplot/errors/irregular_list_error.py +36 -0
  158. numdaplot/errors/join_relation_error.py +183 -0
  159. numdaplot/errors/missing_dependency_error.py +58 -0
  160. numdaplot/errors/missing_type_error.py +36 -0
  161. numdaplot/errors/missing_value_error.py +62 -0
  162. numdaplot/errors/not_single_value_error.py +53 -0
  163. numdaplot/errors/numdaplot_error.py +25 -0
  164. numdaplot/errors/numdaplot_warning.py +34 -0
  165. numdaplot/errors/occupied_cell_error.py +63 -0
  166. numdaplot/errors/out_of_domain_error.py +70 -0
  167. numdaplot/errors/readability_warning.py +35 -0
  168. numdaplot/errors/refused_operation_error.py +64 -0
  169. numdaplot/errors/refused_setting_error.py +60 -0
  170. numdaplot/errors/rejected_dates.py +60 -0
  171. numdaplot/errors/repeated_key.py +36 -0
  172. numdaplot/errors/shape_mismatch_error.py +67 -0
  173. numdaplot/errors/time_overflow_error.py +131 -0
  174. numdaplot/errors/time_zone_mismatch_error.py +83 -0
  175. numdaplot/errors/unknown_time_zone_error.py +51 -0
  176. numdaplot/errors/unmatched_value_error.py +81 -0
  177. numdaplot/errors/unsupported_image_format_error.py +56 -0
  178. numdaplot/errors/unsupported_index_error.py +38 -0
  179. numdaplot/errors/unsupported_missing_error.py +129 -0
  180. numdaplot/errors/unsupported_type_error.py +62 -0
  181. numdaplot/errors/value_conversion_error.py +215 -0
  182. numdaplot/ordering/__init__.py +5 -0
  183. numdaplot/ordering/missing_position.py +46 -0
  184. numdaplot/ordering/order.py +46 -0
  185. numdaplot/package_version.py +36 -0
  186. numdaplot/plots/__init__.py +5 -0
  187. numdaplot/plots/chart_layer.py +47 -0
  188. numdaplot/plots/charts/__init__.py +5 -0
  189. numdaplot/plots/charts/bar_chart.py +98 -0
  190. numdaplot/plots/charts/bar_layout.py +58 -0
  191. numdaplot/plots/charts/bin_count.py +61 -0
  192. numdaplot/plots/charts/bin_width.py +78 -0
  193. numdaplot/plots/charts/box_chart.py +97 -0
  194. numdaplot/plots/charts/cell_values.py +61 -0
  195. numdaplot/plots/charts/chart.py +59 -0
  196. numdaplot/plots/charts/chart_settings.py +105 -0
  197. numdaplot/plots/charts/color_scale.py +147 -0
  198. numdaplot/plots/charts/heatmap_chart.py +92 -0
  199. numdaplot/plots/charts/histogram_chart.py +93 -0
  200. numdaplot/plots/charts/line_chart.py +100 -0
  201. numdaplot/plots/charts/line_type.py +75 -0
  202. numdaplot/plots/charts/marker_shape.py +113 -0
  203. numdaplot/plots/charts/missing_chart.py +60 -0
  204. numdaplot/plots/charts/missing_map_chart.py +27 -0
  205. numdaplot/plots/charts/orientation.py +58 -0
  206. numdaplot/plots/charts/outliers.py +49 -0
  207. numdaplot/plots/charts/percentages.py +55 -0
  208. numdaplot/plots/charts/pie_chart.py +87 -0
  209. numdaplot/plots/charts/scatter_chart.py +159 -0
  210. numdaplot/plots/charts/value_axis.py +66 -0
  211. numdaplot/plots/data/__init__.py +5 -0
  212. numdaplot/plots/data/array_values.py +128 -0
  213. numdaplot/plots/data/chart_data.py +143 -0
  214. numdaplot/plots/data/chart_values.py +109 -0
  215. numdaplot/plots/data/column_reading.py +468 -0
  216. numdaplot/plots/data/heatmap_values.py +63 -0
  217. numdaplot/plots/data/missing_cells.py +165 -0
  218. numdaplot/plots/data/pie_values.py +215 -0
  219. numdaplot/plots/data/point_values.py +249 -0
  220. numdaplot/plots/data/position_kind.py +83 -0
  221. numdaplot/plots/data/renamed_layers.py +340 -0
  222. numdaplot/plots/data/sample_values.py +160 -0
  223. numdaplot/plots/data/shown_columns.py +248 -0
  224. numdaplot/plots/data/table_values.py +256 -0
  225. numdaplot/plots/data/unique_labels.py +45 -0
  226. numdaplot/plots/drawing/__init__.py +5 -0
  227. numdaplot/plots/drawing/bar_drawing.py +316 -0
  228. numdaplot/plots/drawing/box_drawing.py +344 -0
  229. numdaplot/plots/drawing/cell_merging.py +237 -0
  230. numdaplot/plots/drawing/chart_texts.py +124 -0
  231. numdaplot/plots/drawing/color_bar.py +57 -0
  232. numdaplot/plots/drawing/color_scale_values.py +120 -0
  233. numdaplot/plots/drawing/default_labels.py +41 -0
  234. numdaplot/plots/drawing/drawn_chart.py +50 -0
  235. numdaplot/plots/drawing/grid_axes.py +75 -0
  236. numdaplot/plots/drawing/heatmap_drawing.py +313 -0
  237. numdaplot/plots/drawing/histogram_drawing.py +350 -0
  238. numdaplot/plots/drawing/label_room.py +344 -0
  239. numdaplot/plots/drawing/label_thinning.py +216 -0
  240. numdaplot/plots/drawing/layer_alignment.py +319 -0
  241. numdaplot/plots/drawing/layer_colors.py +123 -0
  242. numdaplot/plots/drawing/line_drawing.py +85 -0
  243. numdaplot/plots/drawing/marker_codes.py +20 -0
  244. numdaplot/plots/drawing/missing_drawing.py +360 -0
  245. numdaplot/plots/drawing/moment_period_formatter.py +253 -0
  246. numdaplot/plots/drawing/pie_drawing.py +185 -0
  247. numdaplot/plots/drawing/plot_axes.py +38 -0
  248. numdaplot/plots/drawing/plot_drawing.py +288 -0
  249. numdaplot/plots/drawing/plot_theme.py +45 -0
  250. numdaplot/plots/drawing/position_axis.py +278 -0
  251. numdaplot/plots/drawing/scatter_drawing.py +364 -0
  252. numdaplot/plots/drawing/series_colors.py +177 -0
  253. numdaplot/plots/drawing/size_inches.py +45 -0
  254. numdaplot/plots/drawing/style_drawing.py +410 -0
  255. numdaplot/plots/drawing/text_contrast.py +44 -0
  256. numdaplot/plots/drawing/tick_rotation.py +354 -0
  257. numdaplot/plots/drawing/time_axis.py +212 -0
  258. numdaplot/plots/drawing/whole_numbers.py +72 -0
  259. numdaplot/plots/figure/__init__.py +5 -0
  260. numdaplot/plots/figure/cell.py +95 -0
  261. numdaplot/plots/figure/figure.py +256 -0
  262. numdaplot/plots/figure/figure_drawing.py +99 -0
  263. numdaplot/plots/figure/figure_style.py +60 -0
  264. numdaplot/plots/figure/layout.py +71 -0
  265. numdaplot/plots/figure/placement.py +150 -0
  266. numdaplot/plots/layer_reading.py +166 -0
  267. numdaplot/plots/output/__init__.py +5 -0
  268. numdaplot/plots/output/image_saving.py +187 -0
  269. numdaplot/plots/output/plot_display.py +181 -0
  270. numdaplot/plots/output/shown_object.py +45 -0
  271. numdaplot/plots/overlay_checks.py +245 -0
  272. numdaplot/plots/plot.py +31 -0
  273. numdaplot/plots/plot_data.py +140 -0
  274. numdaplot/plots/plot_distribution_creation.py +237 -0
  275. numdaplot/plots/plot_output.py +124 -0
  276. numdaplot/plots/plot_overlays.py +273 -0
  277. numdaplot/plots/plot_overview_creation.py +195 -0
  278. numdaplot/plots/plot_series_creation.py +213 -0
  279. numdaplot/plots/style/__init__.py +5 -0
  280. numdaplot/plots/style/axis_settings.py +60 -0
  281. numdaplot/plots/style/color.py +168 -0
  282. numdaplot/plots/style/custom_color.py +65 -0
  283. numdaplot/plots/style/grid_lines.py +49 -0
  284. numdaplot/plots/style/image_options.py +71 -0
  285. numdaplot/plots/style/legend_position.py +149 -0
  286. numdaplot/plots/style/plot_style.py +136 -0
  287. numdaplot/plots/style/size.py +70 -0
  288. numdaplot/plots/style/size_unit.py +62 -0
  289. numdaplot/positions/__init__.py +5 -0
  290. numdaplot/positions/axis.py +54 -0
  291. numdaplot/positions/index.py +51 -0
  292. numdaplot/positions/range.py +90 -0
  293. numdaplot/positions/region.py +92 -0
  294. numdaplot/py.typed +0 -0
  295. numdaplot/ratios/__init__.py +5 -0
  296. numdaplot/ratios/fraction.py +40 -0
  297. numdaplot/ratios/measure.py +48 -0
  298. numdaplot/rules/__init__.py +5 -0
  299. numdaplot/rules/between.py +78 -0
  300. numdaplot/rules/bounds.py +83 -0
  301. numdaplot/rules/case.py +48 -0
  302. numdaplot/rules/contains.py +63 -0
  303. numdaplot/rules/equal.py +43 -0
  304. numdaplot/rules/greater.py +39 -0
  305. numdaplot/rules/greater_or_equal.py +38 -0
  306. numdaplot/rules/is_in.py +67 -0
  307. numdaplot/rules/is_missing.py +25 -0
  308. numdaplot/rules/is_present.py +25 -0
  309. numdaplot/rules/less.py +39 -0
  310. numdaplot/rules/less_or_equal.py +38 -0
  311. numdaplot/rules/not_equal.py +45 -0
  312. numdaplot/rules/rule.py +62 -0
  313. numdaplot/rules/rule_values.py +44 -0
  314. numdaplot/rules/value_rule.py +110 -0
  315. numdaplot/settings/__init__.py +5 -0
  316. numdaplot/settings/argument_types.py +327 -0
  317. numdaplot/settings/field_types.py +593 -0
  318. numdaplot/statistics/__init__.py +5 -0
  319. numdaplot/statistics/count.py +71 -0
  320. numdaplot/statistics/count_distinct.py +27 -0
  321. numdaplot/statistics/counted_missing.py +46 -0
  322. numdaplot/statistics/maximum.py +27 -0
  323. numdaplot/statistics/mean.py +27 -0
  324. numdaplot/statistics/median.py +27 -0
  325. numdaplot/statistics/minimum.py +27 -0
  326. numdaplot/statistics/most_frequent.py +27 -0
  327. numdaplot/statistics/most_frequent_count.py +27 -0
  328. numdaplot/statistics/quantile.py +61 -0
  329. numdaplot/statistics/standard_deviation.py +29 -0
  330. numdaplot/statistics/statistic.py +63 -0
  331. numdaplot/statistics/sum.py +27 -0
  332. numdaplot/tables/__init__.py +5 -0
  333. numdaplot/tables/aggregation/__init__.py +5 -0
  334. numdaplot/tables/aggregation/aggregated_frame.py +189 -0
  335. numdaplot/tables/aggregation/aggregation.py +97 -0
  336. numdaplot/tables/aggregation/calculation.py +123 -0
  337. numdaplot/tables/aggregation/result_column.py +108 -0
  338. numdaplot/tables/aggregation/row_groups.py +96 -0
  339. numdaplot/tables/aggregation/statistic_name.py +122 -0
  340. numdaplot/tables/columns/__init__.py +5 -0
  341. numdaplot/tables/columns/added_column.py +89 -0
  342. numdaplot/tables/columns/boolean_conversion.py +144 -0
  343. numdaplot/tables/columns/boolean_rule.py +59 -0
  344. numdaplot/tables/columns/bracket_end.py +50 -0
  345. numdaplot/tables/columns/bracket_names.py +346 -0
  346. numdaplot/tables/columns/bracketed_column.py +179 -0
  347. numdaplot/tables/columns/brackets.py +234 -0
  348. numdaplot/tables/columns/chosen_columns.py +55 -0
  349. numdaplot/tables/columns/column_choice.py +84 -0
  350. numdaplot/tables/columns/column_mode.py +64 -0
  351. numdaplot/tables/columns/column_names.py +186 -0
  352. numdaplot/tables/columns/conversion.py +103 -0
  353. numdaplot/tables/columns/converted_column.py +669 -0
  354. numdaplot/tables/columns/date_conversion.py +526 -0
  355. numdaplot/tables/columns/date_range.py +135 -0
  356. numdaplot/tables/columns/name_change.py +67 -0
  357. numdaplot/tables/columns/new_column.py +79 -0
  358. numdaplot/tables/columns/number_conversion.py +281 -0
  359. numdaplot/tables/columns/renamed_columns.py +60 -0
  360. numdaplot/tables/columns/renaming.py +81 -0
  361. numdaplot/tables/columns/text_conversion.py +70 -0
  362. numdaplot/tables/columns/time_conversion.py +313 -0
  363. numdaplot/tables/columns/time_zone_conversion.py +128 -0
  364. numdaplot/tables/conflict.py +68 -0
  365. numdaplot/tables/description/__init__.py +5 -0
  366. numdaplot/tables/description/described_frame.py +335 -0
  367. numdaplot/tables/description/description.py +155 -0
  368. numdaplot/tables/duplicates/__init__.py +5 -0
  369. numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
  370. numdaplot/tables/duplicates/deduplication.py +88 -0
  371. numdaplot/tables/duplicates/keep.py +81 -0
  372. numdaplot/tables/files/__init__.py +5 -0
  373. numdaplot/tables/files/column_names.py +60 -0
  374. numdaplot/tables/files/csv_file.py +265 -0
  375. numdaplot/tables/files/csv_read_options.py +89 -0
  376. numdaplot/tables/files/csv_separator.py +41 -0
  377. numdaplot/tables/files/csv_write_options.py +79 -0
  378. numdaplot/tables/files/decimal_count.py +42 -0
  379. numdaplot/tables/files/encoding.py +82 -0
  380. numdaplot/tables/files/excel_file.py +171 -0
  381. numdaplot/tables/files/excel_read_options.py +79 -0
  382. numdaplot/tables/files/excel_sheet.py +50 -0
  383. numdaplot/tables/files/excel_time_cells.py +146 -0
  384. numdaplot/tables/files/excel_write_options.py +63 -0
  385. numdaplot/tables/files/file_access.py +152 -0
  386. numdaplot/tables/files/file_paths.py +106 -0
  387. numdaplot/tables/files/json_decimals.py +387 -0
  388. numdaplot/tables/files/json_file.py +203 -0
  389. numdaplot/tables/files/json_layout.py +63 -0
  390. numdaplot/tables/files/json_read_options.py +64 -0
  391. numdaplot/tables/files/json_write_options.py +71 -0
  392. numdaplot/tables/files/missing_texts.py +63 -0
  393. numdaplot/tables/files/optional_package.py +42 -0
  394. numdaplot/tables/files/pandas_backend.py +11 -0
  395. numdaplot/tables/files/parquet_file.py +91 -0
  396. numdaplot/tables/files/parquet_read_options.py +56 -0
  397. numdaplot/tables/files/sas_file.py +94 -0
  398. numdaplot/tables/files/sas_read_options.py +67 -0
  399. numdaplot/tables/files/stata_file.py +83 -0
  400. numdaplot/tables/files/stata_read_options.py +56 -0
  401. numdaplot/tables/files/xpt_read_options.py +65 -0
  402. numdaplot/tables/filtering/__init__.py +5 -0
  403. numdaplot/tables/filtering/checked_frame.py +60 -0
  404. numdaplot/tables/filtering/column_mask.py +71 -0
  405. numdaplot/tables/filtering/column_match.py +62 -0
  406. numdaplot/tables/filtering/condition.py +94 -0
  407. numdaplot/tables/filtering/filter.py +74 -0
  408. numdaplot/tables/filtering/filter_mode.py +67 -0
  409. numdaplot/tables/filtering/row_mask.py +152 -0
  410. numdaplot/tables/filtering/rule_moments.py +164 -0
  411. numdaplot/tables/frames/__init__.py +5 -0
  412. numdaplot/tables/frames/array_frame.py +95 -0
  413. numdaplot/tables/frames/cleaned_names.py +132 -0
  414. numdaplot/tables/frames/column.py +15 -0
  415. numdaplot/tables/frames/column_values.py +273 -0
  416. numdaplot/tables/frames/frame_equality.py +130 -0
  417. numdaplot/tables/frames/frame_normalization.py +459 -0
  418. numdaplot/tables/frames/named_column_errors.py +85 -0
  419. numdaplot/tables/frames/pandas_decimals.py +113 -0
  420. numdaplot/tables/frames/region_positions.py +113 -0
  421. numdaplot/tables/frames/table_text.py +222 -0
  422. numdaplot/tables/frames/time_columns.py +345 -0
  423. numdaplot/tables/frames/time_range_errors.py +117 -0
  424. numdaplot/tables/frames/time_zones.py +271 -0
  425. numdaplot/tables/joining/__init__.py +5 -0
  426. numdaplot/tables/joining/join.py +110 -0
  427. numdaplot/tables/joining/join_keys.py +367 -0
  428. numdaplot/tables/joining/join_mode.py +93 -0
  429. numdaplot/tables/joining/join_relation.py +149 -0
  430. numdaplot/tables/joining/join_suffixes.py +71 -0
  431. numdaplot/tables/joining/joined_frame.py +166 -0
  432. numdaplot/tables/joining/joined_names.py +107 -0
  433. numdaplot/tables/joining/joined_rows.py +235 -0
  434. numdaplot/tables/joining/key_types.py +57 -0
  435. numdaplot/tables/joining/relation.py +78 -0
  436. numdaplot/tables/missing/__init__.py +5 -0
  437. numdaplot/tables/missing/missing_count.py +59 -0
  438. numdaplot/tables/missing/missing_counts.py +214 -0
  439. numdaplot/tables/missing/missing_drop.py +98 -0
  440. numdaplot/tables/missing/missing_mode.py +63 -0
  441. numdaplot/tables/missing/missing_ratio.py +71 -0
  442. numdaplot/tables/missing/missing_removal.py +257 -0
  443. numdaplot/tables/missing/missing_summary.py +174 -0
  444. numdaplot/tables/missing/ratio_comparison.py +70 -0
  445. numdaplot/tables/pivot/__init__.py +5 -0
  446. numdaplot/tables/pivot/pivot_table.py +104 -0
  447. numdaplot/tables/pivot/pivoted_frame.py +244 -0
  448. numdaplot/tables/preview/__init__.py +5 -0
  449. numdaplot/tables/preview/notebook_display.py +238 -0
  450. numdaplot/tables/preview/preview.py +100 -0
  451. numdaplot/tables/preview/preview_rows.py +55 -0
  452. numdaplot/tables/preview/shown_columns.py +62 -0
  453. numdaplot/tables/preview/side.py +82 -0
  454. numdaplot/tables/sorting/__init__.py +5 -0
  455. numdaplot/tables/sorting/sort_key.py +71 -0
  456. numdaplot/tables/sorting/sorted_frame.py +81 -0
  457. numdaplot/tables/sorting/sorting.py +82 -0
  458. numdaplot/tables/table.py +71 -0
  459. numdaplot/tables/table_calculation.py +172 -0
  460. numdaplot/tables/table_columns.py +214 -0
  461. numdaplot/tables/table_conversion.py +351 -0
  462. numdaplot/tables/table_data.py +321 -0
  463. numdaplot/tables/table_display.py +56 -0
  464. numdaplot/tables/table_joining.py +80 -0
  465. numdaplot/tables/table_layout.py +105 -0
  466. numdaplot/tables/table_missing.py +146 -0
  467. numdaplot/tables/table_reading.py +451 -0
  468. numdaplot/tables/table_refusals.py +295 -0
  469. numdaplot/tables/table_selection.py +163 -0
  470. numdaplot/tables/table_writing.py +269 -0
  471. numdaplot-0.1.0.dist-info/METADATA +176 -0
  472. numdaplot-0.1.0.dist-info/RECORD +474 -0
  473. numdaplot-0.1.0.dist-info/WHEEL +4 -0
  474. numdaplot-0.1.0.dist-info/licenses/LICENSE +28 -0
@@ -0,0 +1,35 @@
1
+ """
2
+ Warning emitted when a chart is likely to be hard to read.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_warning import NumdaplotWarning
8
+
9
+
10
+ class ReadabilityWarning(NumdaplotWarning):
11
+ """
12
+ Emitted when a chart is likely to be hard to read, such as a ``PieChart`` of more than 5 slices.
13
+
14
+ The Plot is still created. The warning suggests a chart that shows the same values more clearly, or a larger
15
+ size when only some of the labels naming the values of a chart can be shown.
16
+
17
+ Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
18
+ ``NumdaplotWarning``.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Examples
23
+ --------
24
+ >>> import numdaplot as ndp
25
+ >>> import warnings
26
+ >>> fruits = ndp.Array.from_list(["apple", "pear", "plum", "fig", "kiwi", "lime"])
27
+ >>> sales = ndp.Array.from_list([30.0, 25.0, 15.0, 12.0, 10.0, 8.0])
28
+ >>> shares = ndp.Table.from_arrays({"fruit": fruits, "sales": sales})
29
+ >>> chart = ndp.PieChart(labels="fruit", values="sales")
30
+ >>> with warnings.catch_warnings(record=True) as caught_warnings:
31
+ ... warnings.simplefilter("always")
32
+ ... plot = ndp.Plot.pie(shares, chart)
33
+ >>> print(caught_warnings[0].message)
34
+ A PieChart with 6 slices is hard to read. Try ndp.Plot.bar with a BarChart, it may compare them better.
35
+ """
@@ -0,0 +1,64 @@
1
+ """
2
+ Error raised when an operation is not available on an Array, a Table or a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ REFUSED_OPERATION_MESSAGE = "{operation} is not available, use {alternative} instead."
10
+
11
+
12
+ class RefusedOperationError(NumdaplotError):
13
+ """
14
+ Raised when a Python operation is not available on an Array, a Table or a Plot, such as ``<`` or ``len``.
15
+
16
+ Calling the constructor of an Array, a Table or a Plot raises it too.
17
+
18
+ The message names the numdaplot method to use instead.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ operation
25
+ Description of the refused operation, naming what it applies to.
26
+ alternative
27
+ Description of what to use instead.
28
+
29
+ Attributes
30
+ ----------
31
+ operation
32
+ Description of the refused operation, naming what it applies to.
33
+ alternative
34
+ Description of what to use instead.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> array = ndp.Array.from_list([1, 2])
40
+ >>> try:
41
+ ... array < 2
42
+ ... except ndp.RefusedOperationError as error:
43
+ ... print(error)
44
+ Comparing an Array with < is not available, use select or check with a rule such as ndp.Less instead.
45
+ """
46
+
47
+ def __init__(self, operation: str, alternative: str) -> None:
48
+ """
49
+ Build the error message from the operation and the alternative.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Parameters
54
+ ----------
55
+ operation
56
+ Description of the refused operation, naming what it applies to.
57
+ alternative
58
+ Description of what to use instead.
59
+ """
60
+ message = REFUSED_OPERATION_MESSAGE.format(operation=operation, alternative=alternative)
61
+ super().__init__(message)
62
+
63
+ self.operation = operation
64
+ self.alternative = alternative
@@ -0,0 +1,60 @@
1
+ """
2
+ Error raised when a setting is given to an object that does not accept it.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ REFUSED_SETTING_MESSAGE = "{owner_name} does not accept {setting_name}."
10
+
11
+
12
+ class RefusedSettingError(NumdaplotError):
13
+ """
14
+ Raised when a setting is given to an object that does not accept it.
15
+
16
+ For example, a ``ScatterChart`` always draws a marker, and only PNG images have a resolution.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ setting_name
23
+ The refused setting, such as ``MarkerShape.NONE``.
24
+ owner_name
25
+ What refuses it, such as ``ScatterChart``.
26
+
27
+ Attributes
28
+ ----------
29
+ setting_name
30
+ The refused setting, such as ``MarkerShape.NONE``.
31
+ owner_name
32
+ What refuses it, such as ``ScatterChart``.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> try:
38
+ ... ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.NONE)
39
+ ... except ndp.RefusedSettingError as error:
40
+ ... print(error)
41
+ ScatterChart does not accept MarkerShape.NONE.
42
+ """
43
+
44
+ def __init__(self, setting_name: str, owner_name: str) -> None:
45
+ """
46
+ Build the error message from the setting and what refuses it.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ setting_name
53
+ The refused setting, such as ``MarkerShape.NONE``.
54
+ owner_name
55
+ What refuses it, such as ``ScatterChart``.
56
+ """
57
+ message = REFUSED_SETTING_MESSAGE.format(setting_name=setting_name, owner_name=owner_name)
58
+ super().__init__(message)
59
+ self.setting_name = setting_name
60
+ self.owner_name = owner_name
@@ -0,0 +1,60 @@
1
+ """
2
+ Date parts that cannot form a date, given to ValueConversionError.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+
10
+ @dataclass(frozen=True)
11
+ class RejectedDatePart:
12
+ """
13
+ A part of a date that is not a whole number, such as the day 3.5.
14
+
15
+ .. versionadded:: 0.1.0
16
+
17
+ Parameters
18
+ ----------
19
+ part_name
20
+ ``"year"``, ``"month"`` or ``"day"``.
21
+ value
22
+ The rejected number.
23
+
24
+ Examples
25
+ --------
26
+ >>> from numdaplot.errors.rejected_dates import RejectedDatePart
27
+ >>> RejectedDatePart("day", 3.5).value
28
+ 3.5
29
+ """
30
+
31
+ part_name: str
32
+ value: float
33
+
34
+
35
+ @dataclass(frozen=True)
36
+ class RejectedDate:
37
+ """
38
+ A year, a month and a day that form no date, such as the 31st of February.
39
+
40
+ .. versionadded:: 0.1.0
41
+
42
+ Parameters
43
+ ----------
44
+ year
45
+ The year.
46
+ month
47
+ The month.
48
+ day
49
+ The day.
50
+
51
+ Examples
52
+ --------
53
+ >>> from numdaplot.errors.rejected_dates import RejectedDate
54
+ >>> RejectedDate(2025, 2, 31).day
55
+ 31
56
+ """
57
+
58
+ year: int
59
+ month: int
60
+ day: int
@@ -0,0 +1,36 @@
1
+ """
2
+ Key repeated in a Table where a join expects each key once, given to JoinRelationError.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Any
9
+
10
+
11
+ @dataclass(frozen=True)
12
+ class RepeatedKey:
13
+ """
14
+ The first key repeated in a Table, the combination of its values for several key columns.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ key_names
21
+ The names of the key columns.
22
+ key_values
23
+ The value of each key column, in the same order.
24
+ count
25
+ The number of rows having these values.
26
+
27
+ Examples
28
+ --------
29
+ >>> from numdaplot.errors.repeated_key import RepeatedKey
30
+ >>> RepeatedKey(["Num_Acc"], [202500000001], 3).count
31
+ 3
32
+ """
33
+
34
+ key_names: list[str]
35
+ key_values: list[Any]
36
+ count: int
@@ -0,0 +1,67 @@
1
+ """
2
+ Error raised when two shapes do not match.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+
9
+ from numdaplot.errors.numdaplot_error import NumdaplotError
10
+
11
+ SHAPE_MISMATCH_MESSAGE = "Expected matching shapes, got {left_dimensions} and {right_dimensions}."
12
+
13
+
14
+ class ShapeMismatchError(NumdaplotError):
15
+ """
16
+ Raised when two shapes do not match.
17
+
18
+ Two Arrays cannot be combined, a replacement does not fit its region, or a reshape targets a shape
19
+ holding another number of values.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ left_dimensions
26
+ Dimensions of the first shape.
27
+ right_dimensions
28
+ Dimensions of the second shape.
29
+
30
+ Attributes
31
+ ----------
32
+ left_dimensions
33
+ Dimensions of the first shape, as a list.
34
+ right_dimensions
35
+ Dimensions of the second shape, as a list.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> array = ndp.Array.from_list([1, 2, 3])
41
+ >>> try:
42
+ ... array.reshape(ndp.Shape([2, 2]))
43
+ ... except ndp.ShapeMismatchError as error:
44
+ ... print(error)
45
+ Expected matching shapes, got [3] and [2, 2].
46
+ """
47
+
48
+ def __init__(self, left_dimensions: Sequence[int], right_dimensions: Sequence[int]) -> None:
49
+ """
50
+ Build the error message from the left dimensions and the right dimensions.
51
+
52
+ .. versionadded:: 0.1.0
53
+
54
+ Parameters
55
+ ----------
56
+ left_dimensions
57
+ Dimensions of the first shape.
58
+ right_dimensions
59
+ Dimensions of the second shape.
60
+ """
61
+ left_list = list(left_dimensions)
62
+ right_list = list(right_dimensions)
63
+ message = SHAPE_MISMATCH_MESSAGE.format(left_dimensions=left_list, right_dimensions=right_list)
64
+ super().__init__(message)
65
+
66
+ self.left_dimensions = left_list
67
+ self.right_dimensions = right_list
@@ -0,0 +1,131 @@
1
+ """
2
+ Error raised when dates, datetimes or durations leave the range a count of nanoseconds can hold.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ TIME_OVERFLOW_MESSAGE = "The operation {operation_name} gives values{column_text} outside the range of {range_text}."
10
+ COLUMN_TEXT = " of the column {column_name!r}"
11
+ NO_COLUMN_TEXT = ""
12
+ TYPE_RANGES = {
13
+ "DATE": "DATE, from 1677 to 2262 in a calculation",
14
+ "DATETIME": "DATETIME, from 1677 to 2262",
15
+ "DURATION": "DURATION, about 292 years before or after zero",
16
+ "TIME": "TIME, from 00:00 to 23:59:59.999999",
17
+ }
18
+
19
+
20
+ class TimeOverflowError(NumdaplotError):
21
+ """
22
+ Raised when a value does not fit the nanoseconds counting datetimes and durations.
23
+
24
+ Without it, the value would become a wrong date or duration without any notice. A ``DATE`` is stored
25
+ in days and can be outside this range, but a calculation on it cannot.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ operation_name
32
+ The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
33
+ type_name
34
+ Name of the ``ndp.Type`` member that cannot hold the result: ``DATE``, ``DATETIME``, ``DURATION`` or ``TIME``.
35
+
36
+ Attributes
37
+ ----------
38
+ operation_name
39
+ The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
40
+ type_name
41
+ Name of the ``ndp.Type`` member that cannot hold the result.
42
+ column_name
43
+ Name of the Table column holding the values, or ``None`` for values given to an Array.
44
+
45
+ Examples
46
+ --------
47
+ >>> from datetime import timedelta
48
+ >>> import numdaplot as ndp
49
+ >>> try:
50
+ ... ndp.Array.from_list([timedelta(days=1)]) * 200000
51
+ ... except ndp.TimeOverflowError as error:
52
+ ... print(error)
53
+ The operation * gives values outside the range of DURATION, about 292 years before or after zero.
54
+ """
55
+
56
+ def __init__(self, operation_name: str, type_name: str) -> None:
57
+ """
58
+ Build the error message from the operation and the type names.
59
+
60
+ .. versionadded:: 0.1.0
61
+
62
+ Parameters
63
+ ----------
64
+ operation_name
65
+ The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
66
+ type_name
67
+ Name of the ``ndp.Type`` member that cannot hold the result.
68
+ """
69
+ self.operation_name = operation_name
70
+ self.type_name = type_name
71
+ self.column_name: str | None = None
72
+ message = self.write_message(NO_COLUMN_TEXT)
73
+ super().__init__(message)
74
+
75
+ def write_message(self, column_text: str) -> str:
76
+ """
77
+ Return the message, with the range of the type.
78
+
79
+ .. versionadded:: 0.1.0
80
+
81
+ Parameters
82
+ ----------
83
+ column_text
84
+ The words naming the column after the values, or an empty text.
85
+
86
+ Returns
87
+ -------
88
+ str
89
+ The message.
90
+
91
+ Examples
92
+ --------
93
+ >>> import numdaplot as ndp
94
+ >>> ndp.TimeOverflowError("+", "DATETIME").write_message("")
95
+ 'The operation + gives values outside the range of DATETIME, from 1677 to 2262.'
96
+ """
97
+ range_text = TYPE_RANGES[self.type_name]
98
+ message = TIME_OVERFLOW_MESSAGE.format(
99
+ operation_name=self.operation_name,
100
+ column_text=column_text,
101
+ range_text=range_text,
102
+ )
103
+
104
+ return message
105
+
106
+ def name_column(self, column_name: str) -> None:
107
+ """
108
+ Name the Table column holding the values in the message, unless a column is already named.
109
+
110
+ .. versionadded:: 0.1.0
111
+
112
+ Parameters
113
+ ----------
114
+ column_name
115
+ The name of the column.
116
+
117
+ Examples
118
+ --------
119
+ >>> import numdaplot as ndp
120
+ >>> error = ndp.TimeOverflowError("convert", "DATETIME")
121
+ >>> error.name_column("day")
122
+ >>> print(error)
123
+ The operation convert gives values of the column 'day' outside the range of DATETIME, from 1677 to 2262.
124
+ """
125
+ if self.column_name is not None:
126
+ return
127
+
128
+ self.column_name = column_name
129
+ column_text = COLUMN_TEXT.format(column_name=column_name)
130
+ message = self.write_message(column_text)
131
+ self.args = (message,)
@@ -0,0 +1,83 @@
1
+ """
2
+ Error raised when datetimes with a time zone meet datetimes without one, or of another time zone.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ TIME_ZONE_MISMATCH_MESSAGE = "{operation} needs datetimes {state} a time zone."
10
+ TIME_ZONE_PAIR_MESSAGE = "{operation} needs datetimes in one time zone, got {zone_names}."
11
+ ZONE_NAME_SEPARATOR = " and "
12
+ WITH_TIME_ZONE = "with"
13
+ WITHOUT_TIME_ZONE = "without"
14
+
15
+
16
+ class TimeZoneMismatchError(NumdaplotError):
17
+ """
18
+ Raised when datetimes with a time zone meet datetimes without one, or datetimes of another time zone.
19
+
20
+ For example, a rule compares a datetime column with a time zone to a datetime without one,
21
+ or ``TimeZoneMode.SHIFT`` is asked for datetimes that have no time zone.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ operation
28
+ What was attempted, such as ``"Shifting to another time zone"``.
29
+ expects_time_zone
30
+ True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
31
+ zone_names
32
+ The two time zones met, such as ``["Europe/Paris", "UTC"]``. When omitted, one side has no time zone.
33
+
34
+ Attributes
35
+ ----------
36
+ operation
37
+ What was attempted.
38
+ expects_time_zone
39
+ True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
40
+ zone_names
41
+ The two time zones met, or None.
42
+
43
+ Examples
44
+ --------
45
+ >>> from datetime import datetime
46
+ >>> import numdaplot as ndp
47
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 1, 2, 10, 30)])})
48
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.SHIFT, zone=ndp.TimeZone("Europe/Paris"))
49
+ >>> try:
50
+ ... times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
51
+ ... except ndp.TimeZoneMismatchError as error:
52
+ ... print(error)
53
+ Shifting to another time zone needs datetimes with a time zone.
54
+ """
55
+
56
+ def __init__(self, operation: str, expects_time_zone: bool, zone_names: list[str] | None = None) -> None:
57
+ """
58
+ Build the error message from the operation and the time zone state it needs, or the two zones met.
59
+
60
+ .. versionadded:: 0.1.0
61
+
62
+ Parameters
63
+ ----------
64
+ operation
65
+ What was attempted.
66
+ expects_time_zone
67
+ True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
68
+ zone_names
69
+ The two time zones met. When omitted, one side has no time zone.
70
+ """
71
+ state = WITHOUT_TIME_ZONE
72
+ if expects_time_zone:
73
+ state = WITH_TIME_ZONE
74
+
75
+ message = TIME_ZONE_MISMATCH_MESSAGE.format(operation=operation, state=state)
76
+ if zone_names is not None:
77
+ joined_names = ZONE_NAME_SEPARATOR.join(zone_names)
78
+ message = TIME_ZONE_PAIR_MESSAGE.format(operation=operation, zone_names=joined_names)
79
+
80
+ super().__init__(message)
81
+ self.operation = operation
82
+ self.expects_time_zone = expects_time_zone
83
+ self.zone_names = zone_names
@@ -0,0 +1,51 @@
1
+ """
2
+ Error raised when a time zone name is not a known IANA name.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ UNKNOWN_TIME_ZONE_MESSAGE = "Unknown time zone {name!r}, expected an IANA name such as 'Europe/Paris' or 'UTC'."
10
+
11
+
12
+ class UnknownTimeZoneError(NumdaplotError):
13
+ """
14
+ Raised when a time zone name is not a known IANA name, such as ``"Paris"`` or ``"+01:00"``.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ name
21
+ The rejected name.
22
+
23
+ Attributes
24
+ ----------
25
+ name
26
+ The rejected name.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.TimeZone("Paris")
33
+ ... except ndp.UnknownTimeZoneError as error:
34
+ ... print(error)
35
+ Unknown time zone 'Paris', expected an IANA name such as 'Europe/Paris' or 'UTC'.
36
+ """
37
+
38
+ def __init__(self, name: str) -> None:
39
+ """
40
+ Build the error message from the rejected name.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ name
47
+ The rejected name.
48
+ """
49
+ message = UNKNOWN_TIME_ZONE_MESSAGE.format(name=name)
50
+ super().__init__(message)
51
+ self.name = name
@@ -0,0 +1,81 @@
1
+ """
2
+ Error raised when a value has no new value in a ValueMapping, or is in no bracket of Brackets.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ VALUE_MAPPING_NAME = "ValueMapping"
10
+ BRACKETS_NAME = "Brackets"
11
+ UNMATCHED_MESSAGES = {
12
+ VALUE_MAPPING_NAME: (
13
+ "The value {value!r} has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing."
14
+ ),
15
+ BRACKETS_NAME: (
16
+ "The value {value!r} is in no bracket. Open the first or the last bracket, or give others=Unmatched.MISSING "
17
+ "to make it missing."
18
+ ),
19
+ }
20
+
21
+
22
+ class UnmatchedValueError(NumdaplotError):
23
+ """
24
+ Raised when a value has no new value in a ``ValueMapping``, or is in no bracket of ``Brackets``.
25
+
26
+ Both raise it while their ``others`` is ``Unmatched.ERROR``.
27
+
28
+ .. versionadded:: 0.1.0
29
+
30
+ Parameters
31
+ ----------
32
+ value
33
+ The first value without new value or bracket.
34
+ setting_name
35
+ ``"ValueMapping"`` by default, or ``"Brackets"``: the setting that found no match, which chooses the advice.
36
+
37
+ Attributes
38
+ ----------
39
+ value
40
+ The first value without new value or bracket.
41
+ setting_name
42
+ The setting that found no match.
43
+
44
+ Examples
45
+ --------
46
+ >>> import numdaplot as ndp
47
+ >>> sexes = ndp.Array.from_list([1, 2, 3])
48
+ >>> try:
49
+ ... sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]))
50
+ ... except ndp.UnmatchedValueError as error:
51
+ ... print(error)
52
+ The value 3 has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing.
53
+ >>> ages = ndp.Table.from_arrays({"age": ndp.Array.from_list([5, 105])})
54
+ >>> brackets = ndp.Brackets(limits=[0, 18, 100])
55
+ >>> try:
56
+ ... ages.convert(ndp.Conversion(column="age", dtype=ndp.Type.CATEGORY, format=brackets))
57
+ ... except ndp.UnmatchedValueError as error:
58
+ ... print(error)
59
+ The value 105 is in no bracket. Open the first or the last bracket,
60
+ or give others=Unmatched.MISSING to make it missing.
61
+ """
62
+
63
+ def __init__(self, value: object, setting_name: str = VALUE_MAPPING_NAME) -> None:
64
+ """
65
+ Build the error message from the value and the setting that found no match.
66
+
67
+ .. versionadded:: 0.1.0
68
+
69
+ Parameters
70
+ ----------
71
+ value
72
+ The first value without new value or bracket.
73
+ setting_name
74
+ The setting that found no match, ``"ValueMapping"`` by default.
75
+ """
76
+ message_template = UNMATCHED_MESSAGES[setting_name]
77
+ message = message_template.format(value=value)
78
+ super().__init__(message)
79
+
80
+ self.value = value
81
+ self.setting_name = setting_name