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,56 @@
1
+ """
2
+ Error raised when a file to read does not exist.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import builtins
8
+
9
+ from numdaplot.errors.numdaplot_error import NumdaplotError
10
+
11
+ FILE_NOT_FOUND_MESSAGE = "No file found at {path}."
12
+
13
+
14
+ class FileNotFoundError(NumdaplotError, builtins.FileNotFoundError):
15
+ """
16
+ Raised when a Table is read from a path where there is no file.
17
+
18
+ It is also a Python ``FileNotFoundError``, so code catching the Python error keeps working.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ path
25
+ The path of the file, as given.
26
+
27
+ Attributes
28
+ ----------
29
+ path
30
+ The path of the file, as given.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> try:
36
+ ... ndp.Table.from_csv("missing.csv")
37
+ ... except ndp.FileNotFoundError as error:
38
+ ... print(error)
39
+ No file found at missing.csv.
40
+ """
41
+
42
+ def __init__(self, path: str) -> None:
43
+ """
44
+ Build the error message from the path.
45
+
46
+ .. versionadded:: 0.1.0
47
+
48
+ Parameters
49
+ ----------
50
+ path
51
+ The path of the file, as given.
52
+ """
53
+ message = FILE_NOT_FOUND_MESSAGE.format(path=path)
54
+ super().__init__(message)
55
+
56
+ self.path = path
@@ -0,0 +1,80 @@
1
+ """
2
+ Error raised when a chart cannot be added to a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INCOMPATIBLE_CHARTS_MESSAGE = "A {chart_name} with {chart_positions} cannot be added to a Plot with {plot_positions}."
10
+
11
+
12
+ class IncompatibleChartsError(NumdaplotError):
13
+ """
14
+ Raised when a chart added to a Plot does not have the kind of values of an axis it shares with the Plot.
15
+
16
+ Its ``x`` values are numbers, dates, texts or times of day while the Plot has another kind, or it measures numbers
17
+ on an axis of times of day, or the reverse.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ chart_name
24
+ Name of the chart class added, such as ``LineChart``.
25
+ chart_positions
26
+ What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
27
+ values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
28
+ plot_positions
29
+ What the Plot has on the shared axis.
30
+
31
+ Attributes
32
+ ----------
33
+ chart_name
34
+ Name of the chart class added, such as ``LineChart``.
35
+ chart_positions
36
+ What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
37
+ values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
38
+ plot_positions
39
+ What the Plot has on the shared axis.
40
+
41
+ Examples
42
+ --------
43
+ >>> from datetime import date
44
+ >>> import numdaplot as ndp
45
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
46
+ >>> days = ndp.Array.from_list([date(2026, 1, 1), date(2026, 1, 2)])
47
+ >>> sales = ndp.Array.from_list([120.0, 80.0])
48
+ >>> shops = ndp.Table.from_arrays({"city": cities, "day": days, "sales": sales})
49
+ >>> plot = ndp.Plot.bar(shops, ndp.BarChart(x="city", y=["sales"]))
50
+ >>> line = ndp.LineChart(x="day", y=["sales"])
51
+ >>> try:
52
+ ... plot.add_line(shops, line)
53
+ ... except ndp.IncompatibleChartsError as error:
54
+ ... print(error)
55
+ A LineChart with dates cannot be added to a Plot with texts.
56
+ """
57
+
58
+ def __init__(self, chart_name: str, chart_positions: str, plot_positions: str) -> None:
59
+ """
60
+ Build the error message from the chart and what each one has on the shared axis.
61
+
62
+ .. versionadded:: 0.1.0
63
+
64
+ Parameters
65
+ ----------
66
+ chart_name
67
+ Name of the chart class added, such as ``LineChart``.
68
+ chart_positions
69
+ What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
70
+ values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
71
+ plot_positions
72
+ What the Plot has on the shared axis.
73
+ """
74
+ message = INCOMPATIBLE_CHARTS_MESSAGE.format(
75
+ chart_name=chart_name, chart_positions=chart_positions, plot_positions=plot_positions
76
+ )
77
+ super().__init__(message)
78
+ self.chart_name = chart_name
79
+ self.chart_positions = chart_positions
80
+ self.plot_positions = plot_positions
@@ -0,0 +1,104 @@
1
+ """
2
+ Error raised when an operation does not apply to the types of its values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ TYPE_NAME_SEPARATOR = " and "
10
+ INCOMPATIBLE_TYPES_MESSAGE = "Cannot apply {operation} to {type_names}."
11
+ COLUMN_TYPE_NAME = "the {type_name} column {column_name!r}"
12
+
13
+
14
+ class IncompatibleTypesError(NumdaplotError):
15
+ """
16
+ Raised when an operation, a rule, a statistic or a math function does not apply to the types it receives.
17
+
18
+ For example, a number cannot be added to a text, and ``Contains`` only applies to text.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ operation
25
+ Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
26
+ type_names
27
+ Names of the ``ndp.Type`` members the operation received, in order.
28
+
29
+ Attributes
30
+ ----------
31
+ operation
32
+ Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
33
+ type_names
34
+ Names of the ``ndp.Type`` members the operation received, in order.
35
+ column_name
36
+ Name of the Table column holding the first type, or ``None`` for an Array or a type alone.
37
+
38
+ Examples
39
+ --------
40
+ >>> import numdaplot as ndp
41
+ >>> array = ndp.Array.from_list([1, 2])
42
+ >>> try:
43
+ ... array + "euros"
44
+ ... except ndp.IncompatibleTypesError as error:
45
+ ... print(error)
46
+ Cannot apply + to INT64 and TEXT.
47
+ >>> sales = ndp.Table.from_arrays({"city": ndp.Array.from_list(["Paris"])})
48
+ >>> mean_city = ndp.Calculation(column="city", function=ndp.Mean())
49
+ >>> try:
50
+ ... sales.aggregate(ndp.Aggregation(calculations=[mean_city]))
51
+ ... except ndp.IncompatibleTypesError as error:
52
+ ... print(error)
53
+ Cannot apply Mean to the TEXT column 'city'.
54
+ """
55
+
56
+ def __init__(self, operation: str, type_names: list[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
65
+ Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
66
+ type_names
67
+ Names of the ``ndp.Type`` members the operation received, in order.
68
+ """
69
+ joined_type_names = TYPE_NAME_SEPARATOR.join(type_names)
70
+ message = INCOMPATIBLE_TYPES_MESSAGE.format(operation=operation, type_names=joined_type_names)
71
+ super().__init__(message)
72
+
73
+ self.operation = operation
74
+ self.type_names = list(type_names)
75
+ self.column_name: str | None = None
76
+
77
+ def name_column(self, column_name: str) -> None:
78
+ """
79
+ Name the Table column holding the first type in the message, unless a column is already named.
80
+
81
+ .. versionadded:: 0.1.0
82
+
83
+ Parameters
84
+ ----------
85
+ column_name
86
+ The name of the column.
87
+
88
+ Examples
89
+ --------
90
+ >>> import numdaplot as ndp
91
+ >>> error = ndp.IncompatibleTypesError("Greater", ["DATETIME", "INT64"])
92
+ >>> error.name_column("day")
93
+ >>> print(error)
94
+ Cannot apply Greater to the DATETIME column 'day' and INT64.
95
+ """
96
+ if self.column_name is not None:
97
+ return
98
+
99
+ self.column_name = column_name
100
+ first_type_name, *other_type_names = self.type_names
101
+ named_type = COLUMN_TYPE_NAME.format(type_name=first_type_name, column_name=column_name)
102
+ joined_type_names = TYPE_NAME_SEPARATOR.join([named_type, *other_type_names])
103
+ message = INCOMPATIBLE_TYPES_MESSAGE.format(operation=self.operation, type_names=joined_type_names)
104
+ self.args = (message,)
@@ -0,0 +1,61 @@
1
+ """
2
+ Error raised when the result of a calculation does not fit an integer type.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INTEGER_OVERFLOW_MESSAGE = (
10
+ "The operation {operation_name} gives values too large for {type_name}. Convert the values to FLOAT64 first."
11
+ )
12
+
13
+
14
+ class IntegerOverflowError(NumdaplotError):
15
+ """
16
+ Raised when an integer result does not fit its type, which would otherwise wrap around to a wrong number.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ operation_name
23
+ The operator or the statistic, such as ``*`` or ``Sum``.
24
+ type_name
25
+ Name of the ``ndp.Type`` member that cannot hold the result.
26
+
27
+ Attributes
28
+ ----------
29
+ operation_name
30
+ The operator or the statistic, such as ``*`` or ``Sum``.
31
+ type_name
32
+ Name of the ``ndp.Type`` member that cannot hold the result.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> try:
38
+ ... ndp.Array.from_list([2**62]) * 4
39
+ ... except ndp.IntegerOverflowError as error:
40
+ ... print(error)
41
+ The operation * gives values too large for INT64. Convert the values to FLOAT64 first.
42
+ """
43
+
44
+ def __init__(self, operation_name: str, type_name: str) -> None:
45
+ """
46
+ Build the error message from the operation and the type names.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ operation_name
53
+ The operator or the statistic, such as ``*`` or ``Sum``.
54
+ type_name
55
+ Name of the ``ndp.Type`` member that cannot hold the result.
56
+ """
57
+ message = INTEGER_OVERFLOW_MESSAGE.format(operation_name=operation_name, type_name=type_name)
58
+ super().__init__(message)
59
+
60
+ self.operation_name = operation_name
61
+ self.type_name = type_name
@@ -0,0 +1,52 @@
1
+ """
2
+ Error raised when a logarithm base is not usable.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_BASE_MESSAGE = "Expected a logarithm base greater than 0 and different from 1, got {base}."
10
+
11
+
12
+ class InvalidBaseError(NumdaplotError):
13
+ """
14
+ Raised when a logarithm base is lower than or equal to 0, or equal to 1.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ base
21
+ The rejected base.
22
+
23
+ Attributes
24
+ ----------
25
+ base
26
+ The rejected base.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.Logarithm(base=1)
33
+ ... except ndp.InvalidBaseError as error:
34
+ ... print(error)
35
+ Expected a logarithm base greater than 0 and different from 1, got 1.
36
+ """
37
+
38
+ def __init__(self, base: float) -> None:
39
+ """
40
+ Build the error message from the base.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ base
47
+ The rejected base.
48
+ """
49
+ message = INVALID_BASE_MESSAGE.format(base=base)
50
+ super().__init__(message)
51
+
52
+ self.base = base
@@ -0,0 +1,66 @@
1
+ """
2
+ Error raised when the bins of a histogram have a width of 0 or less, or a duration beyond a day.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from datetime import timedelta
8
+
9
+ from numdaplot.errors.numdaplot_error import NumdaplotError
10
+
11
+ INVALID_BIN_WIDTH_MESSAGE = "Expected a bin width above 0, got {width}."
12
+ INVALID_BIN_DURATION_MESSAGE = "Expected a bin width above 0 and at most 1 day, got {width}."
13
+
14
+
15
+ class InvalidBinWidthError(NumdaplotError):
16
+ """
17
+ Raised when a ``BinWidth`` is 0 or negative, or a duration beyond a day.
18
+
19
+ Such a width would never cover the values, or be wider than every time of day.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ width
26
+ The rejected width.
27
+
28
+ Attributes
29
+ ----------
30
+ width
31
+ The rejected width.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> try:
37
+ ... ndp.BinWidth(-5.0)
38
+ ... except ndp.InvalidBinWidthError as error:
39
+ ... print(error)
40
+ Expected a bin width above 0, got -5.0.
41
+ >>> from datetime import timedelta
42
+ >>> try:
43
+ ... ndp.BinWidth(timedelta(days=2))
44
+ ... except ndp.InvalidBinWidthError as error:
45
+ ... print(error)
46
+ Expected a bin width above 0 and at most 1 day, got 2 days, 0:00:00.
47
+ """
48
+
49
+ def __init__(self, width: float | timedelta) -> None:
50
+ """
51
+ Build the error message from the width.
52
+
53
+ .. versionadded:: 0.1.0
54
+
55
+ Parameters
56
+ ----------
57
+ width
58
+ The rejected width.
59
+ """
60
+ message_format = INVALID_BIN_WIDTH_MESSAGE
61
+ if isinstance(width, timedelta):
62
+ message_format = INVALID_BIN_DURATION_MESSAGE
63
+
64
+ message = message_format.format(width=width)
65
+ super().__init__(message)
66
+ self.width = width
@@ -0,0 +1,58 @@
1
+ """
2
+ Error raised when the bounds of an interval are reversed or not comparable.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_BOUNDS_MESSAGE = "Expected comparable bounds with low <= high, got low={low!r} and high={high!r}."
10
+
11
+
12
+ class InvalidBoundsError(NumdaplotError):
13
+ """
14
+ Raised when the low bound is greater than the high bound, or when both cannot be compared.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ low
21
+ The rejected low bound.
22
+ high
23
+ The rejected high bound.
24
+
25
+ Attributes
26
+ ----------
27
+ low
28
+ The rejected low bound.
29
+ high
30
+ The rejected high bound.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> try:
36
+ ... ndp.Between(low=20, high=10)
37
+ ... except ndp.InvalidBoundsError as error:
38
+ ... print(error)
39
+ Expected comparable bounds with low <= high, got low=20 and high=10.
40
+ """
41
+
42
+ def __init__(self, low: object, high: object) -> None:
43
+ """
44
+ Build the error message from the rejected bounds.
45
+
46
+ .. versionadded:: 0.1.0
47
+
48
+ Parameters
49
+ ----------
50
+ low
51
+ The rejected low bound.
52
+ high
53
+ The rejected high bound.
54
+ """
55
+ message = INVALID_BOUNDS_MESSAGE.format(low=low, high=high)
56
+ super().__init__(message)
57
+ self.low = low
58
+ self.high = high
@@ -0,0 +1,81 @@
1
+ """
2
+ Error raised when the columns given to a chart do not fit the data it draws.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ MISSING_SETTING_MESSAGE = "{chart_name} needs {setting_name} for {data_name}."
10
+ EXTRA_SETTING_MESSAGE = "{chart_name} takes no {setting_name} for {data_name}."
11
+
12
+
13
+ class InvalidChartDataError(NumdaplotError):
14
+ """
15
+ Raised when a chart misses a column setting a Table needs, or has one an Array does not use.
16
+
17
+ A Table needs the ``y`` columns of a chart, while an Array draws each of its columns and takes no column name.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ chart_name
24
+ Name of the chart class, such as ``LineChart``.
25
+ setting_name
26
+ Name of the setting, such as ``y``.
27
+ data_name
28
+ The data drawn: ``a Table`` or ``an Array``.
29
+ needs_setting
30
+ True when the setting is missing, False when it is given but not used.
31
+
32
+ Attributes
33
+ ----------
34
+ chart_name
35
+ Name of the chart class, such as ``LineChart``.
36
+ setting_name
37
+ Name of the setting, such as ``y``.
38
+ data_name
39
+ The data drawn: ``a Table`` or ``an Array``.
40
+ needs_setting
41
+ True when the setting is missing, False when it is given but not used.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
47
+ >>> chart = ndp.LineChart(y=["price"])
48
+ >>> try:
49
+ ... ndp.Plot.line(prices, chart)
50
+ ... except ndp.InvalidChartDataError as error:
51
+ ... print(error)
52
+ LineChart takes no y for an Array.
53
+ """
54
+
55
+ def __init__(self, chart_name: str, setting_name: str, data_name: str, needs_setting: bool) -> None:
56
+ """
57
+ Build the error message from the chart, the setting and whether it is missing or extra.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Parameters
62
+ ----------
63
+ chart_name
64
+ Name of the chart class, such as ``LineChart``.
65
+ setting_name
66
+ Name of the setting, such as ``y``.
67
+ data_name
68
+ The data drawn: ``a Table`` or ``an Array``.
69
+ needs_setting
70
+ True when the setting is missing, False when it is given but not used.
71
+ """
72
+ message_template = EXTRA_SETTING_MESSAGE
73
+ if needs_setting:
74
+ message_template = MISSING_SETTING_MESSAGE
75
+
76
+ message = message_template.format(chart_name=chart_name, setting_name=setting_name, data_name=data_name)
77
+ super().__init__(message)
78
+ self.chart_name = chart_name
79
+ self.setting_name = setting_name
80
+ self.data_name = data_name
81
+ self.needs_setting = needs_setting
@@ -0,0 +1,63 @@
1
+ """
2
+ Error raised when a chart does not have one color per series.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_COLOR_COUNT_MESSAGE = "Expected one color per series, {series_count} series and {color_count} color(s) given."
10
+
11
+
12
+ class InvalidColorCountError(NumdaplotError):
13
+ """
14
+ Raised when the colors of a chart are not exactly one per series.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ color_count
21
+ The number of colors given.
22
+ series_count
23
+ The number of series drawn.
24
+
25
+ Attributes
26
+ ----------
27
+ color_count
28
+ The number of colors given.
29
+ series_count
30
+ The number of series drawn.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> days = ndp.Array.from_list([1, 2])
36
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
37
+ >>> costs = ndp.Array.from_list([8.0, 9.0])
38
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
39
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"], colors=[ndp.Color.BLUE])
40
+ >>> try:
41
+ ... ndp.Plot.line(sales, chart)
42
+ ... except ndp.InvalidColorCountError as error:
43
+ ... print(error)
44
+ Expected one color per series, 2 series and 1 color(s) given.
45
+ """
46
+
47
+ def __init__(self, color_count: int, series_count: int) -> None:
48
+ """
49
+ Build the error message from the two counts.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Parameters
54
+ ----------
55
+ color_count
56
+ The number of colors given.
57
+ series_count
58
+ The number of series drawn.
59
+ """
60
+ message = INVALID_COLOR_COUNT_MESSAGE.format(color_count=color_count, series_count=series_count)
61
+ super().__init__(message)
62
+ self.color_count = color_count
63
+ self.series_count = series_count
@@ -0,0 +1,51 @@
1
+ """
2
+ Error raised when a custom color is not written as ``#rrggbb``.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ INVALID_COLOR_MESSAGE = "Expected a color written as #rrggbb, got {text!r}."
10
+
11
+
12
+ class InvalidColorError(NumdaplotError):
13
+ """
14
+ Raised when the text of a ``CustomColor`` is not ``#`` followed by six hexadecimal digits.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ text
21
+ The rejected text.
22
+
23
+ Attributes
24
+ ----------
25
+ text
26
+ The rejected text.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.CustomColor("#ff88")
33
+ ... except ndp.InvalidColorError as error:
34
+ ... print(error)
35
+ Expected a color written as #rrggbb, got '#ff88'.
36
+ """
37
+
38
+ def __init__(self, text: str) -> None:
39
+ """
40
+ Build the error message from the rejected text.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ text
47
+ The rejected text.
48
+ """
49
+ message = INVALID_COLOR_MESSAGE.format(text=text)
50
+ super().__init__(message)
51
+ self.text = text