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,106 @@
1
+ """
2
+ Error raised when a position is not a whole number inside its dimension.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_POSITION_MESSAGE = "Expected a whole position between {lowest} and {highest}, got {position}."
10
+ DEFAULT_LOWEST_POSITION = 0
11
+ MINIMUM_POSITION_MESSAGE = "Expected a whole position of at least {lowest}, got {position}."
12
+
13
+
14
+ class InvalidPositionError(NumdaplotError):
15
+ """
16
+ Raised when a position falls outside its dimension.
17
+
18
+ A dimension of size 5 accepts the positions from -5 to 4. Without a size, as when an ``Index`` or a ``Cell`` is
19
+ created, the message names the lowest accepted position.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ position
26
+ The rejected position.
27
+ size
28
+ Size of the dimension. When omitted, the size is not known yet, as when an ``Index`` is created.
29
+ lowest
30
+ The lowest accepted position, named when the size is not known, 0 by default.
31
+
32
+ Attributes
33
+ ----------
34
+ position
35
+ The rejected position.
36
+ size
37
+ Size of the dimension, or None.
38
+ lowest
39
+ The lowest accepted position.
40
+
41
+ Examples
42
+ --------
43
+ >>> import numdaplot as ndp
44
+ >>> array = ndp.Array.from_list([1, 2, 3])
45
+ >>> try:
46
+ ... array.take(ndp.Region(rows=ndp.Index(5)))
47
+ ... except ndp.InvalidPositionError as error:
48
+ ... print(error)
49
+ Expected a whole position between -3 and 2, got 5.
50
+ """
51
+
52
+ def __init__(self, position: object, size: int | None = None, lowest: int = DEFAULT_LOWEST_POSITION) -> None:
53
+ """
54
+ Build the error message from the position, and the size or the lowest accepted position.
55
+
56
+ .. versionadded:: 0.1.0
57
+
58
+ Parameters
59
+ ----------
60
+ position
61
+ The rejected position.
62
+ size
63
+ Size of the dimension. When omitted, the size is not known yet, as when an ``Index`` is created.
64
+ lowest
65
+ The lowest accepted position, named when the size is not known, 0 by default.
66
+ """
67
+ message = build_position_message(position, size, lowest)
68
+ super().__init__(message)
69
+
70
+ self.position = position
71
+ self.size = size
72
+ self.lowest = lowest
73
+
74
+
75
+ def build_position_message(position: object, size: int | None, lowest: int) -> str:
76
+ """
77
+ Return the message of a rejected position, naming the accepted positions that are known.
78
+
79
+ .. versionadded:: 0.1.0
80
+
81
+ Parameters
82
+ ----------
83
+ position
84
+ The rejected position.
85
+ size
86
+ Size of the dimension, or None.
87
+ lowest
88
+ The lowest accepted position.
89
+
90
+ Returns
91
+ -------
92
+ str
93
+ The message naming the accepted interval, or the lowest accepted position.
94
+
95
+ Examples
96
+ --------
97
+ >>> from numdaplot.errors.invalid_position_error import build_position_message
98
+ >>> build_position_message(-1, None, 0)
99
+ 'Expected a whole position of at least 0, got -1.'
100
+ """
101
+ if size is not None:
102
+ highest_position = size - 1
103
+ message = INVALID_POSITION_MESSAGE.format(lowest=-size, highest=highest_position, position=position)
104
+ return message
105
+
106
+ return MINIMUM_POSITION_MESSAGE.format(lowest=lowest, position=position)
@@ -0,0 +1,51 @@
1
+ """
2
+ Error raised when an image resolution is lower than 1 dot per inch.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_RESOLUTION_MESSAGE = "Expected a resolution of at least 1 dot per inch, got {dpi}."
10
+
11
+
12
+ class InvalidResolutionError(NumdaplotError):
13
+ """
14
+ Raised when the ``dpi`` of ``ImageOptions`` is lower than 1.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ dpi
21
+ The rejected number of dots per inch.
22
+
23
+ Attributes
24
+ ----------
25
+ dpi
26
+ The rejected number of dots per inch.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.ImageOptions(dpi=0)
33
+ ... except ndp.InvalidResolutionError as error:
34
+ ... print(error)
35
+ Expected a resolution of at least 1 dot per inch, got 0.
36
+ """
37
+
38
+ def __init__(self, dpi: int) -> None:
39
+ """
40
+ Build the error message from the rejected resolution.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ dpi
47
+ The rejected number of dots per inch.
48
+ """
49
+ message = INVALID_RESOLUTION_MESSAGE.format(dpi=dpi)
50
+ super().__init__(message)
51
+ self.dpi = dpi
@@ -0,0 +1,53 @@
1
+ """
2
+ Error raised when a rotation is outside the accepted angles.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_ROTATION_MESSAGE = "Expected a rotation from -90 to 90 degrees, got {rotation}."
10
+
11
+
12
+ class InvalidRotationError(NumdaplotError):
13
+ """
14
+ Raised when the ``x_tick_rotation`` or the ``y_tick_rotation`` of a ``PlotStyle`` is outside -90 to 90 degrees.
15
+
16
+ Beyond these angles, the labels would be written upside down.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ rotation
23
+ The rotation given.
24
+
25
+ Attributes
26
+ ----------
27
+ rotation
28
+ The rotation given.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> try:
34
+ ... ndp.PlotStyle(x_tick_rotation=120)
35
+ ... except ndp.InvalidRotationError as error:
36
+ ... print(error)
37
+ Expected a rotation from -90 to 90 degrees, got 120.
38
+ """
39
+
40
+ def __init__(self, rotation: float) -> None:
41
+ """
42
+ Build the error message from the rotation.
43
+
44
+ .. versionadded:: 0.1.0
45
+
46
+ Parameters
47
+ ----------
48
+ rotation
49
+ The rotation given.
50
+ """
51
+ message = INVALID_ROTATION_MESSAGE.format(rotation=rotation)
52
+ super().__init__(message)
53
+ self.rotation = rotation
@@ -0,0 +1,53 @@
1
+ """
2
+ Error raised when a random seed is negative.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SEED_MESSAGE = "Expected a seed of at least 0, got {seed}."
10
+
11
+
12
+ class InvalidSeedError(NumdaplotError):
13
+ """
14
+ Raised when a random draw is given a negative seed.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ seed
21
+ The rejected seed.
22
+
23
+ Attributes
24
+ ----------
25
+ seed
26
+ The rejected seed.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> dice = ndp.RandomIntegers(low=1, high=6)
32
+ >>> try:
33
+ ... ndp.Array.random(dice, shape=ndp.Shape([3]), seed=-1)
34
+ ... except ndp.InvalidSeedError as error:
35
+ ... print(error)
36
+ Expected a seed of at least 0, got -1.
37
+ """
38
+
39
+ def __init__(self, seed: int) -> None:
40
+ """
41
+ Build the error message from the seed.
42
+
43
+ .. versionadded:: 0.1.0
44
+
45
+ Parameters
46
+ ----------
47
+ seed
48
+ The rejected seed.
49
+ """
50
+ message = INVALID_SEED_MESSAGE.format(seed=seed)
51
+ super().__init__(message)
52
+
53
+ self.seed = seed
@@ -0,0 +1,52 @@
1
+ """
2
+ Error raised when a CSV separator is not exactly one character.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SEPARATOR_MESSAGE = "Expected a separator of exactly one character, got {separator!r}."
10
+
11
+
12
+ class InvalidSeparatorError(NumdaplotError):
13
+ """
14
+ Raised when the separator of ``CsvReadOptions`` or ``CsvWriteOptions`` is empty or longer than one character.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ separator
21
+ The rejected separator.
22
+
23
+ Attributes
24
+ ----------
25
+ separator
26
+ The rejected separator.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.CsvReadOptions(separator=";;")
33
+ ... except ndp.InvalidSeparatorError as error:
34
+ ... print(error)
35
+ Expected a separator of exactly one character, got ';;'.
36
+ """
37
+
38
+ def __init__(self, separator: str) -> None:
39
+ """
40
+ Build the error message from the separator.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ separator
47
+ The rejected separator.
48
+ """
49
+ message = INVALID_SEPARATOR_MESSAGE.format(separator=separator)
50
+ super().__init__(message)
51
+
52
+ self.separator = separator
@@ -0,0 +1,52 @@
1
+ """
2
+ Error raised when a shape has no dimension or a negative dimension.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SHAPE_MESSAGE = "Expected at least one dimension and no negative dimension, got {dimensions}."
10
+
11
+
12
+ class InvalidShapeError(NumdaplotError):
13
+ """
14
+ Raised when a shape has no dimension at all, or a dimension lower than 0.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ dimensions
21
+ The rejected dimensions.
22
+
23
+ Attributes
24
+ ----------
25
+ dimensions
26
+ The rejected dimensions.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.Shape([3, -1])
33
+ ... except ndp.InvalidShapeError as error:
34
+ ... print(error)
35
+ Expected at least one dimension and no negative dimension, got [3, -1].
36
+ """
37
+
38
+ def __init__(self, dimensions: list[int]) -> None:
39
+ """
40
+ Build the error message from the dimensions.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ dimensions
47
+ The rejected dimensions.
48
+ """
49
+ message = INVALID_SHAPE_MESSAGE.format(dimensions=dimensions)
50
+ super().__init__(message)
51
+
52
+ self.dimensions = dimensions
@@ -0,0 +1,54 @@
1
+ """
2
+ Error raised when an Excel sheet name is not accepted by Excel.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SHEET_NAME_MESSAGE = "Expected a sheet name of 1 to 31 characters without [ ] : * ? / \\, got {sheet!r}."
10
+
11
+
12
+ class InvalidSheetNameError(NumdaplotError):
13
+ r"""
14
+ Raised when Excel would refuse the sheet name of ``ExcelReadOptions`` or ``ExcelWriteOptions``.
15
+
16
+ The name is empty, longer than 31 characters, or holds ``[ ] : * ? / \``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ sheet
23
+ The rejected sheet name.
24
+
25
+ Attributes
26
+ ----------
27
+ sheet
28
+ The rejected sheet name.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> try:
34
+ ... ndp.ExcelWriteOptions(sheet="Sales/2026")
35
+ ... except ndp.InvalidSheetNameError as error:
36
+ ... print(error)
37
+ Expected a sheet name of 1 to 31 characters without [ ] : * ? / \, got 'Sales/2026'.
38
+ """
39
+
40
+ def __init__(self, sheet: str) -> None:
41
+ """
42
+ Build the error message from the sheet name.
43
+
44
+ .. versionadded:: 0.1.0
45
+
46
+ Parameters
47
+ ----------
48
+ sheet
49
+ The rejected sheet name.
50
+ """
51
+ message = INVALID_SHEET_NAME_MESSAGE.format(sheet=sheet)
52
+ super().__init__(message)
53
+
54
+ self.sheet = sheet
@@ -0,0 +1,58 @@
1
+ """
2
+ Error raised when a size is not positive.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SIZE_MESSAGE = "Expected a positive width and height, got {width} and {height}."
10
+
11
+
12
+ class InvalidSizeError(NumdaplotError):
13
+ """
14
+ Raised when the width or the height of a ``Size`` is zero or negative.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ width
21
+ The width given.
22
+ height
23
+ The height given.
24
+
25
+ Attributes
26
+ ----------
27
+ width
28
+ The width given.
29
+ height
30
+ The height given.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> try:
36
+ ... ndp.Size(width=0, height=4.8)
37
+ ... except ndp.InvalidSizeError as error:
38
+ ... print(error)
39
+ Expected a positive width and height, got 0 and 4.8.
40
+ """
41
+
42
+ def __init__(self, width: float, height: float) -> None:
43
+ """
44
+ Build the error message from the width and the height.
45
+
46
+ .. versionadded:: 0.1.0
47
+
48
+ Parameters
49
+ ----------
50
+ width
51
+ The width given.
52
+ height
53
+ The height given.
54
+ """
55
+ message = INVALID_SIZE_MESSAGE.format(width=width, height=height)
56
+ super().__init__(message)
57
+ self.width = width
58
+ self.height = height
@@ -0,0 +1,77 @@
1
+ """
2
+ Error raised when the step of a range is zero, or goes away from its stop.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_STEP_MESSAGE = "Expected a non-zero step, got {step}."
10
+ WRONG_DIRECTION_MESSAGE = "Expected a step going from start to stop, got step {step} from {start} to {stop}."
11
+
12
+
13
+ class InvalidStepError(NumdaplotError):
14
+ """
15
+ Raised when a range is given a step of zero, or a step going away from its stop, which never reach the stop.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Parameters
20
+ ----------
21
+ step
22
+ The rejected step.
23
+ start
24
+ The start of the range when the step goes away from the stop. When omitted, the message is about a step of zero.
25
+ stop
26
+ The stop of the range when the step goes away from it. When omitted, the message is about a step of zero.
27
+
28
+ Attributes
29
+ ----------
30
+ step
31
+ The rejected step.
32
+ start
33
+ The start of the range, or None for a step of zero.
34
+ stop
35
+ The stop of the range, or None for a step of zero.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> try:
41
+ ... ndp.Range(start=0, stop=10, step=0)
42
+ ... except ndp.InvalidStepError as error:
43
+ ... print(error)
44
+ Expected a non-zero step, got 0.
45
+ >>> try:
46
+ ... ndp.Range(start=5, stop=1)
47
+ ... except ndp.InvalidStepError as error:
48
+ ... print(error)
49
+ Expected a step going from start to stop, got step 1 from 5 to 1.
50
+ """
51
+
52
+ def __init__(self, step: float, start: float | None = None, stop: float | None = None) -> None:
53
+ """
54
+ Build the error message from the rejected step, and the start and the stop when the step goes away.
55
+
56
+ .. versionadded:: 0.1.0
57
+
58
+ Parameters
59
+ ----------
60
+ step
61
+ The rejected step.
62
+ start
63
+ The start of the range when the step goes away from the stop. When omitted, the message is about a step of
64
+ zero.
65
+ stop
66
+ The stop of the range when the step goes away from it. When omitted, the message is about a step of zero.
67
+ """
68
+ if start is None or stop is None:
69
+ message = INVALID_STEP_MESSAGE.format(step=step)
70
+ else:
71
+ message = WRONG_DIRECTION_MESSAGE.format(step=step, start=start, stop=stop)
72
+
73
+ super().__init__(message)
74
+
75
+ self.step = step
76
+ self.start = start
77
+ self.stop = stop
@@ -0,0 +1,61 @@
1
+ """
2
+ Error raised when the suffixes of a join are empty or the same.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_SUFFIXES_MESSAGE = "Expected two different non-empty suffixes, got {left!r} and {right!r}."
10
+
11
+
12
+ class InvalidSuffixesError(NumdaplotError):
13
+ """
14
+ Raised when a ``JoinSuffixes`` has an empty suffix, or the same suffix on both sides.
15
+
16
+ Either would leave two columns of a join with the same name.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ left
23
+ The suffix of the columns of the joined Table.
24
+ right
25
+ The suffix of the columns of the other Table.
26
+
27
+ Attributes
28
+ ----------
29
+ left
30
+ The suffix of the columns of the joined Table.
31
+ right
32
+ The suffix of the columns of the other Table.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> try:
38
+ ... ndp.JoinSuffixes(left="_2025", right="_2025")
39
+ ... except ndp.InvalidSuffixesError as error:
40
+ ... print(error)
41
+ Expected two different non-empty suffixes, got '_2025' and '_2025'.
42
+ """
43
+
44
+ def __init__(self, left: str, right: str) -> None:
45
+ """
46
+ Build the error message from the two suffixes.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ left
53
+ The suffix of the columns of the joined Table.
54
+ right
55
+ The suffix of the columns of the other Table.
56
+ """
57
+ message = INVALID_SUFFIXES_MESSAGE.format(left=left, right=right)
58
+ super().__init__(message)
59
+
60
+ self.left = left
61
+ self.right = right
@@ -0,0 +1,63 @@
1
+ """
2
+ Error raised when a time zone change has a zone it does not use, or misses the zone it needs.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ MISSING_ZONE_MESSAGE = "TimeZoneMode.{mode_name} needs a zone."
10
+ EXTRA_ZONE_MESSAGE = "TimeZoneMode.{mode_name} takes no zone."
11
+
12
+
13
+ class InvalidTimeZoneChangeError(NumdaplotError):
14
+ """
15
+ Raised when ``TimeZoneMode.ATTRIBUTE`` or ``SHIFT`` has no zone, or ``TimeZoneMode.REMOVE`` has one.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Parameters
20
+ ----------
21
+ mode_name
22
+ Name of the ``TimeZoneMode`` member of the change.
23
+ needs_zone
24
+ True when the mode needs a zone that is missing, False when it has a zone it does not use.
25
+
26
+ Attributes
27
+ ----------
28
+ mode_name
29
+ Name of the ``TimeZoneMode`` member of the change.
30
+ needs_zone
31
+ True when the mode needs a zone that is missing, False when it has a zone it does not use.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> try:
37
+ ... ndp.TimeZoneChange(mode=ndp.TimeZoneMode.SHIFT)
38
+ ... except ndp.InvalidTimeZoneChangeError as error:
39
+ ... print(error)
40
+ TimeZoneMode.SHIFT needs a zone.
41
+ """
42
+
43
+ def __init__(self, mode_name: str, needs_zone: bool) -> None:
44
+ """
45
+ Build the error message from the mode and whether its zone is missing or extra.
46
+
47
+ .. versionadded:: 0.1.0
48
+
49
+ Parameters
50
+ ----------
51
+ mode_name
52
+ Name of the ``TimeZoneMode`` member of the change.
53
+ needs_zone
54
+ True when the mode needs a zone that is missing, False when it has a zone it does not use.
55
+ """
56
+ message_template = EXTRA_ZONE_MESSAGE
57
+ if needs_zone:
58
+ message_template = MISSING_ZONE_MESSAGE
59
+
60
+ message = message_template.format(mode_name=mode_name)
61
+ super().__init__(message)
62
+ self.mode_name = mode_name
63
+ self.needs_zone = needs_zone