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,68 @@
1
+ """
2
+ A time zone of the IANA database.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
9
+
10
+ from numdaplot.errors.unknown_time_zone_error import UnknownTimeZoneError
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class TimeZone:
16
+ """
17
+ A time zone of the IANA database, such as ``"Europe/Paris"`` or ``"UTC"``, used by ``TimeZoneChange``.
18
+
19
+ A zone follows the summer and winter time changes of its place. Fixed offsets such as ``"+01:00"``
20
+ are not time zones.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ name
27
+ The IANA name of the zone.
28
+
29
+ Raises
30
+ ------
31
+ InvalidTypeError
32
+ When a setting is not of the type its annotation names.
33
+ UnknownTimeZoneError
34
+ When the name is not a known IANA name.
35
+
36
+ Examples
37
+ --------
38
+ >>> from datetime import datetime
39
+ >>> import numdaplot as ndp
40
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
41
+ >>> paris = ndp.TimeZone("Europe/Paris")
42
+ >>> in_paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=paris)
43
+ >>> paris_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=in_paris))
44
+ >>> paris_times.column_time_zones
45
+ {'time': TimeZone(name='Europe/Paris')}
46
+ """
47
+
48
+ name: str
49
+
50
+ def __post_init__(self) -> None:
51
+ """
52
+ Check that the name is a known IANA name.
53
+
54
+ .. versionadded:: 0.1.0
55
+
56
+ Raises
57
+ ------
58
+ InvalidTypeError
59
+ When a setting is not of the type its annotation names.
60
+ UnknownTimeZoneError
61
+ When the name is not a known IANA name.
62
+ """
63
+ require_field_types(self)
64
+
65
+ try:
66
+ ZoneInfo(self.name)
67
+ except (ZoneInfoNotFoundError, ValueError) as error:
68
+ raise UnknownTimeZoneError(self.name) from error
@@ -0,0 +1,71 @@
1
+ """
2
+ A change of the time zone of a datetime column.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.dates.time_zone import TimeZone
10
+ from numdaplot.dates.time_zone_mode import TimeZoneMode
11
+ from numdaplot.errors.invalid_time_zone_change_error import InvalidTimeZoneChangeError
12
+ from numdaplot.settings.field_types import require_field_types
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class TimeZoneChange:
17
+ """
18
+ A change of the time zone of a datetime column, used by ``Conversion``.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ mode
25
+ Whether a zone is given to datetimes without one, datetimes are moved to another zone, or their zone
26
+ is removed.
27
+ zone
28
+ The new zone, needed by ``TimeZoneMode.ATTRIBUTE`` and ``SHIFT``. ``REMOVE`` refuses it, so it is the only mode
29
+ used when omitted.
30
+
31
+ Raises
32
+ ------
33
+ InvalidTypeError
34
+ When a setting is not of the type its annotation names.
35
+ InvalidTimeZoneChangeError
36
+ When ``ATTRIBUTE`` or ``SHIFT`` has no zone, or ``REMOVE`` has one.
37
+
38
+ Examples
39
+ --------
40
+ >>> from datetime import datetime
41
+ >>> import numdaplot as ndp
42
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
43
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
44
+ >>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
45
+ time
46
+ DATETIME Europe/Paris
47
+ 0 2026-07-01 10:30:00+02:00
48
+ """
49
+
50
+ mode: TimeZoneMode
51
+ zone: TimeZone | None = None
52
+
53
+ def __post_init__(self) -> None:
54
+ """
55
+ Check that the zone is given exactly when the mode needs it.
56
+
57
+ .. versionadded:: 0.1.0
58
+
59
+ Raises
60
+ ------
61
+ InvalidTypeError
62
+ When a setting is not of the type its annotation names.
63
+ InvalidTimeZoneChangeError
64
+ When ``ATTRIBUTE`` or ``SHIFT`` has no zone, or ``REMOVE`` has one.
65
+ """
66
+ require_field_types(self)
67
+
68
+ needs_zone = self.mode != TimeZoneMode.REMOVE
69
+ has_zone = self.zone is not None
70
+ if needs_zone != has_zone:
71
+ raise InvalidTimeZoneChangeError(self.mode.name, needs_zone)
@@ -0,0 +1,81 @@
1
+ """
2
+ How the time zone of a datetime column changes.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class TimeZoneMode(Enum):
11
+ """
12
+ How the time zone of a datetime column changes, used by ``TimeZoneChange``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> from datetime import datetime
19
+ >>> import numdaplot as ndp
20
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
21
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
22
+ >>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
23
+ time
24
+ DATETIME Europe/Paris
25
+ 0 2026-07-01 10:30:00+02:00
26
+ """
27
+
28
+ ATTRIBUTE = auto()
29
+ """
30
+ Gives a zone to datetimes without one: the clock time stays the same.
31
+
32
+ A time that does not exist in the zone, or exists twice when the clocks change, raises
33
+ ``ValueConversionError``.
34
+
35
+ Examples
36
+ --------
37
+ >>> from datetime import datetime
38
+ >>> import numdaplot as ndp
39
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
40
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
41
+ >>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
42
+ time
43
+ DATETIME Europe/Paris
44
+ 0 2026-07-01 10:30:00+02:00
45
+ """
46
+
47
+ SHIFT = auto()
48
+ """
49
+ Moves datetimes with a zone to another zone: the instant stays the same, the clock time changes.
50
+
51
+ Examples
52
+ --------
53
+ >>> from datetime import datetime
54
+ >>> import numdaplot as ndp
55
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
56
+ >>> utc = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("UTC"))
57
+ >>> utc_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=utc))
58
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.SHIFT, zone=ndp.TimeZone("Europe/Paris"))
59
+ >>> utc_times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
60
+ time
61
+ DATETIME Europe/Paris
62
+ 0 2026-07-01 12:30:00+02:00
63
+ """
64
+
65
+ REMOVE = auto()
66
+ """
67
+ Removes the zone of datetimes: the clock time stays the same.
68
+
69
+ Examples
70
+ --------
71
+ >>> from datetime import datetime
72
+ >>> import numdaplot as ndp
73
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
74
+ >>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
75
+ >>> paris_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
76
+ >>> no_zone = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.REMOVE)
77
+ >>> paris_times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=no_zone))
78
+ time
79
+ DATETIME
80
+ 0 2026-07-01 10:30:00
81
+ """
@@ -0,0 +1,58 @@
1
+ """
2
+ Each number read as a duration in a unit.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.dates.duration_unit import DurationUnit
10
+ from numdaplot.dates.time_function import TimeFunction
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class ToDuration(TimeFunction):
16
+ """
17
+ Each number read as a duration in a unit: 1.5 in days gives 36 hours.
18
+
19
+ The result is a ``DURATION`` Array, rounded to the nanosecond. Applies to integers and decimals, not to
20
+ booleans. ``DurationIn`` does the opposite.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ unit
27
+ The unit of the numbers.
28
+
29
+
30
+ Raises
31
+ ------
32
+ InvalidTypeError
33
+ When a setting is not of the type its annotation names.
34
+ TimeOverflowError
35
+ When ``Array.apply`` meets a number that gives a duration beyond about 292 years.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> nights = ndp.Array.from_list([3, 10])
41
+ >>> nights.apply(ndp.ToDuration(unit=ndp.DurationUnit.DAY))
42
+ Array(['3 days 00:00:00', '10 days 00:00:00'], dtype=DURATION)
43
+ """
44
+
45
+ unit: DurationUnit
46
+
47
+ def __post_init__(self) -> None:
48
+ """
49
+ Check the type of every setting.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Raises
54
+ ------
55
+ InvalidTypeError
56
+ When a setting is not of the type its annotation names.
57
+ """
58
+ require_field_types(self)
@@ -0,0 +1,7 @@
1
+ """
2
+ Errors and warnings raised by numdaplot.
3
+
4
+ Every error inherits ``NumdaplotError``, so ``except ndp.NumdaplotError`` catches all of them.
5
+
6
+ .. versionadded:: 0.1.0
7
+ """
@@ -0,0 +1,36 @@
1
+ """
2
+ Warning emitted when two Arrays of different shapes are combined.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_warning import NumdaplotWarning
8
+
9
+
10
+ class BroadcastWarning(NumdaplotWarning):
11
+ """
12
+ Emitted when an operation stretches an Array to match the shape of another one.
13
+
14
+ The operation still runs, as in numpy. The warning only signals that the shapes differ,
15
+ which is often a mistake. It is never emitted when an Array is combined with a single value.
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
+ >>> grid = ndp.Array.from_list([[1, 2], [3, 4]])
27
+ >>> row = ndp.Array.from_list([10, 20])
28
+ >>> with warnings.catch_warnings(record=True) as caught_warnings:
29
+ ... warnings.simplefilter("always")
30
+ ... sums = grid + row
31
+ >>> sums
32
+ Array([[11, 22],
33
+ [13, 24]], dtype=INT64)
34
+ >>> print(caught_warnings[0].message)
35
+ Shapes (2, 2) and (2,) differ, values are repeated to match.
36
+ """
@@ -0,0 +1,35 @@
1
+ """
2
+ Warning emitted when a calculation on decimals gives NaN or an infinite value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_warning import NumdaplotWarning
8
+
9
+
10
+ class CalculationWarning(NumdaplotWarning):
11
+ """
12
+ Emitted when values of a calculation on decimals have no defined result or do not fit their type.
13
+
14
+ The calculation still runs: these values become NaN or an infinite value. The warning points at the line of
15
+ the calculation in the calling code.
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
+ >>> distances = ndp.Array.from_list([0.0, 3.0])
27
+ >>> hours = ndp.Array.from_list([0.0, 2.0])
28
+ >>> with warnings.catch_warnings(record=True) as caught_warnings:
29
+ ... warnings.simplefilter("always")
30
+ ... speeds = distances / hours
31
+ >>> speeds
32
+ Array([nan, 1.5], dtype=FLOAT64)
33
+ >>> print(caught_warnings[0].message)
34
+ The operation / has values without a defined result, such as 0 / 0: they became NaN.
35
+ """
@@ -0,0 +1,77 @@
1
+ """
2
+ Error raised when a cell is outside the Layout of a Figure.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ CELL_OUT_OF_RANGE_MESSAGE = "Cell ({row}, {column}) is outside a Layout of {row_count} rows and {column_count} columns."
10
+
11
+
12
+ class CellOutOfRangeError(NumdaplotError):
13
+ """
14
+ Raised when a ``Cell``, or a cell it spans, is beyond the rows or the columns of the ``Layout`` of a ``Figure``.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ row
21
+ The row of the cell, from 0.
22
+ column
23
+ The column of the cell, from 0.
24
+ row_count
25
+ The number of rows of the Layout.
26
+ column_count
27
+ The number of columns of the Layout.
28
+
29
+ Attributes
30
+ ----------
31
+ row
32
+ The row of the cell, from 0.
33
+ column
34
+ The column of the cell, from 0.
35
+ row_count
36
+ The number of rows of the Layout.
37
+ column_count
38
+ The number of columns of the Layout.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
44
+ >>> plot = ndp.Plot.line(prices)
45
+ >>> figure = ndp.Figure(ndp.Layout(rows=2, columns=2))
46
+ >>> try:
47
+ ... figure.place(plot, ndp.Cell(row=2, column=0))
48
+ ... except ndp.CellOutOfRangeError as error:
49
+ ... print(error)
50
+ Cell (2, 0) is outside a Layout of 2 rows and 2 columns.
51
+ """
52
+
53
+ def __init__(self, row: int, column: int, row_count: int, column_count: int) -> None:
54
+ """
55
+ Build the error message from the cell and the size of the Layout.
56
+
57
+ .. versionadded:: 0.1.0
58
+
59
+ Parameters
60
+ ----------
61
+ row
62
+ The row of the cell, from 0.
63
+ column
64
+ The column of the cell, from 0.
65
+ row_count
66
+ The number of rows of the Layout.
67
+ column_count
68
+ The number of columns of the Layout.
69
+ """
70
+ message = CELL_OUT_OF_RANGE_MESSAGE.format(
71
+ row=row, column=column, row_count=row_count, column_count=column_count
72
+ )
73
+ super().__init__(message)
74
+ self.row = row
75
+ self.column = column
76
+ self.row_count = row_count
77
+ self.column_count = column_count
@@ -0,0 +1,64 @@
1
+ """
2
+ Error raised when a Table has no column of a given name.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ COLUMN_NOT_FOUND_MESSAGE = "No column is named {column_name!r}."
10
+ TABLE_COLUMN_NOT_FOUND_MESSAGE = "No column of {table_name} is named {column_name!r}."
11
+
12
+
13
+ class ColumnNotFoundError(NumdaplotError):
14
+ """
15
+ Raised when an operation names a column that the Table does not have.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Parameters
20
+ ----------
21
+ column_name
22
+ The name that matches no column.
23
+ table_name
24
+ The Table searched, such as ``"the other Table"`` of a join. When omitted, only one Table is involved.
25
+
26
+ Attributes
27
+ ----------
28
+ column_name
29
+ The name that matches no column.
30
+ table_name
31
+ The Table searched, or None.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([1, 2])})
37
+ >>> try:
38
+ ... table.column("prise")
39
+ ... except ndp.ColumnNotFoundError as error:
40
+ ... print(error)
41
+ No column is named 'prise'.
42
+ """
43
+
44
+ def __init__(self, column_name: str, table_name: str | None = None) -> None:
45
+ """
46
+ Build the error message from the column name, and from the Table searched when it is given.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ column_name
53
+ The name that matches no column.
54
+ table_name
55
+ The Table searched. When omitted, only one Table is involved.
56
+ """
57
+ message = COLUMN_NOT_FOUND_MESSAGE.format(column_name=column_name)
58
+ if table_name is not None:
59
+ message = TABLE_COLUMN_NOT_FOUND_MESSAGE.format(table_name=table_name, column_name=column_name)
60
+
61
+ super().__init__(message)
62
+
63
+ self.column_name = column_name
64
+ self.table_name = table_name
@@ -0,0 +1,60 @@
1
+ """
2
+ Error raised when two settings that exclude each other are both given.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ CONFLICTING_SETTINGS_MESSAGE = "{first_name} and {second_name} cannot be given together."
10
+
11
+
12
+ class ConflictingSettingsError(NumdaplotError):
13
+ """
14
+ Raised when two settings that exclude each other are both given.
15
+
16
+ For example, a ``ScatterChart`` colors its points with one ``color`` or by the values of ``color_by``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ first_name
23
+ Name of the first setting.
24
+ second_name
25
+ Name of the second setting.
26
+
27
+ Attributes
28
+ ----------
29
+ first_name
30
+ Name of the first setting.
31
+ second_name
32
+ Name of the second setting.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> try:
38
+ ... ndp.ScatterChart(x="surface", y="price", color=ndp.Color.RED, color_by="city")
39
+ ... except ndp.ConflictingSettingsError as error:
40
+ ... print(error)
41
+ color and color_by cannot be given together.
42
+ """
43
+
44
+ def __init__(self, first_name: str, second_name: str) -> None:
45
+ """
46
+ Build the error message from the two setting names.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ first_name
53
+ Name of the first setting.
54
+ second_name
55
+ Name of the second setting.
56
+ """
57
+ message = CONFLICTING_SETTINGS_MESSAGE.format(first_name=first_name, second_name=second_name)
58
+ super().__init__(message)
59
+ self.first_name = first_name
60
+ self.second_name = second_name
@@ -0,0 +1,62 @@
1
+ """
2
+ Error raised when an operation does not apply to the number of dimensions of an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ DIMENSION_MESSAGE = "{operation} does not apply to an Array of {dimension_count} dimension(s)."
10
+
11
+
12
+ class DimensionError(NumdaplotError):
13
+ """
14
+ Raised when an operation does not apply to the number of dimensions of an Array.
15
+
16
+ For example, an axis only applies to a two-dimensional Array, and a one-dimensional Array has no columns.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ operation
23
+ Description of the rejected operation.
24
+ dimension_count
25
+ Number of dimensions of the Array.
26
+
27
+ Attributes
28
+ ----------
29
+ operation
30
+ Description of the rejected operation.
31
+ dimension_count
32
+ Number of dimensions of the Array.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> array = ndp.Array.from_list([1, 2, 3])
38
+ >>> try:
39
+ ... array.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
40
+ ... except ndp.DimensionError as error:
41
+ ... print(error)
42
+ An axis does not apply to an Array of 1 dimension(s).
43
+ """
44
+
45
+ def __init__(self, operation: str, dimension_count: int) -> None:
46
+ """
47
+ Build the error message from the operation and the dimension count.
48
+
49
+ .. versionadded:: 0.1.0
50
+
51
+ Parameters
52
+ ----------
53
+ operation
54
+ Description of the rejected operation.
55
+ dimension_count
56
+ Number of dimensions of the Array.
57
+ """
58
+ message = DIMENSION_MESSAGE.format(operation=operation, dimension_count=dimension_count)
59
+ super().__init__(message)
60
+
61
+ self.operation = operation
62
+ self.dimension_count = dimension_count
@@ -0,0 +1,32 @@
1
+ """
2
+ Warning emitted when a Plot or a Figure cannot be shown in a window.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_warning import NumdaplotWarning
8
+
9
+
10
+ class DisplayWarning(NumdaplotWarning):
11
+ """
12
+ Emitted when ``show`` cannot open a window, because matplotlib has no graphical backend.
13
+
14
+ This happens outside a Jupyter notebook when Python has no ``tkinter``, or on a server or in a container without
15
+ a screen. Nothing is shown. The warning points at the line calling ``show`` in the calling code, and suggests
16
+ installing ``tkinter`` or saving the image with ``save``: ``No window can be opened, matplotlib has no graphical
17
+ backend here. Install tkinter (python3-tk on Debian and Ubuntu) to see the plot, or save it with Plot.save.``
18
+
19
+ Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
20
+ ``NumdaplotWarning``.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Examples
25
+ --------
26
+ >>> import numdaplot as ndp
27
+ >>> import warnings
28
+ >>> plot = ndp.Plot.bar(ndp.Array.from_list([12.0, 15.5]))
29
+ >>> with warnings.catch_warnings():
30
+ ... warnings.simplefilter("ignore", ndp.DisplayWarning)
31
+ ... plot.show()
32
+ """