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,98 @@
1
+ """
2
+ Chart drawing each value as a bar.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from dataclasses import dataclass
9
+
10
+ from numdaplot.plots.charts.bar_layout import BarLayout
11
+ from numdaplot.plots.charts.chart import Chart
12
+ from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
13
+ from numdaplot.plots.charts.orientation import Orientation
14
+ from numdaplot.plots.style.color import Color
15
+ from numdaplot.plots.style.custom_color import CustomColor
16
+ from numdaplot.settings.field_types import require_field_types
17
+ from numdaplot.tables.columns.column_names import require_optional_column_name
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class BarChart(Chart):
22
+ """
23
+ Chart drawing each value as a bar, used by ``Plot.bar``.
24
+
25
+ Each ``x`` value gets its own position, labeled with that value, in the order of the rows. A missing value
26
+ draws no bar, and a row whose ``x`` text is missing is left out.
27
+
28
+ .. versionadded:: 0.1.0
29
+
30
+ Parameters
31
+ ----------
32
+ x
33
+ For a Table, the column labeling the bars: numbers, dates, datetimes, times of day (labeled ``HH:MM``), texts
34
+ or booleans, the row numbers when omitted. An Array takes none, its rows being numbered.
35
+ y
36
+ For a Table, the columns drawn, holding numbers, one series of bars each. A Table needs it, even for a single
37
+ column. An Array takes none: when omitted, each of its columns is a series.
38
+ orientation
39
+ The direction of the bars, ``Orientation.VERTICAL`` by default.
40
+ layout
41
+ How the bars of several series share a position, ``BarLayout.GROUPED`` by default.
42
+ colors
43
+ One color per series, the colors of the default cycle when omitted. The chart keeps its own list.
44
+
45
+ Raises
46
+ ------
47
+ InvalidTypeError
48
+ When a setting is not of the type its annotation names.
49
+ InvalidColumnNameError
50
+ When ``x`` or a name in ``y`` is an empty text.
51
+ EmptyListError
52
+ When ``y`` or ``colors`` is an empty list.
53
+ DuplicateColumnError
54
+ When a column name appears twice in ``y``.
55
+
56
+ Examples
57
+ --------
58
+ >>> import numdaplot as ndp
59
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
60
+ >>> sales_2025 = ndp.Array.from_list([120.0, 80.0, 45.0])
61
+ >>> sales_2026 = ndp.Array.from_list([150.0, 95.0, 40.0])
62
+ >>> sales = ndp.Table.from_arrays({"city": cities, "2025": sales_2025, "2026": sales_2026})
63
+ >>> chart = ndp.BarChart(x="city", y=["2025", "2026"])
64
+ >>> plot = ndp.Plot.bar(sales, chart)
65
+ >>> plot.show()
66
+ """
67
+
68
+ x: str | None = None
69
+ y: list[str] | None = None
70
+ orientation: Orientation = Orientation.VERTICAL
71
+ layout: BarLayout = BarLayout.GROUPED
72
+ colors: Sequence[Color | CustomColor] | None = None
73
+
74
+ def __post_init__(self) -> None:
75
+ """
76
+ Check the columns and the colors and replace them with copies that only the chart holds.
77
+
78
+ .. versionadded:: 0.1.0
79
+
80
+ Raises
81
+ ------
82
+ InvalidTypeError
83
+ When a setting is not of the type its annotation names.
84
+ InvalidColumnNameError
85
+ When ``x`` or a name in ``y`` is an empty text.
86
+ EmptyListError
87
+ When ``y`` or ``colors`` is an empty list.
88
+ DuplicateColumnError
89
+ When a column name appears twice in ``y``.
90
+ """
91
+ require_field_types(self)
92
+
93
+ require_optional_column_name(self.x)
94
+
95
+ columns_copy = copy_columns(self.y)
96
+ colors_copy = copy_colors(self.colors)
97
+ object.__setattr__(self, "y", columns_copy)
98
+ object.__setattr__(self, "colors", colors_copy)
@@ -0,0 +1,58 @@
1
+ """
2
+ How the bars of several series share a position of a BarChart.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class BarLayout(Enum):
11
+ """
12
+ How the bars of several series share a position of a ``BarChart``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
20
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
21
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
22
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
23
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.STACKED)
24
+ >>> plot = ndp.Plot.bar(sales, chart)
25
+ >>> plot.show()
26
+ """
27
+
28
+ GROUPED = auto()
29
+ """
30
+ Side by side. Default value.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
36
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
37
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
38
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
39
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.GROUPED)
40
+ >>> plot = ndp.Plot.bar(sales, chart)
41
+ >>> plot.show()
42
+ """
43
+
44
+ STACKED = auto()
45
+ """
46
+ On top of each other, positive values above zero and negative values below it.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
52
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
53
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
54
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
55
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.STACKED)
56
+ >>> plot = ndp.Plot.bar(sales, chart)
57
+ >>> plot.show()
58
+ """
@@ -0,0 +1,61 @@
1
+ """
2
+ Bins of a histogram given by their number.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_count_error import InvalidCountError
10
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+ MINIMUM_BIN_COUNT = 1
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class BinCount:
17
+ """
18
+ Bins of a ``HistogramChart`` given by their number, of the same width from the smallest to the largest value.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ count
25
+ The number of bins, at least 1.
26
+
27
+ Raises
28
+ ------
29
+ InvalidTypeError
30
+ When a setting is not of the type its annotation names.
31
+ InvalidCountError
32
+ When the count is lower than 1.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 15.0])
38
+ >>> chart = ndp.HistogramChart(bins=ndp.BinCount(4))
39
+ >>> plot = ndp.Plot.histogram(prices, chart)
40
+ >>> plot.show()
41
+ """
42
+
43
+ count: int
44
+
45
+ def __post_init__(self) -> None:
46
+ """
47
+ Check the number of bins.
48
+
49
+ .. versionadded:: 0.1.0
50
+
51
+ Raises
52
+ ------
53
+ InvalidTypeError
54
+ When a setting is not of the type its annotation names.
55
+ InvalidCountError
56
+ When the count is lower than 1.
57
+ """
58
+ require_field_types(self)
59
+
60
+ if self.count < MINIMUM_BIN_COUNT:
61
+ raise InvalidCountError(self.count, MINIMUM_BIN_COUNT)
@@ -0,0 +1,78 @@
1
+ """
2
+ Bins of a histogram given by their width.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from datetime import timedelta
9
+
10
+ from numdaplot.errors.invalid_bin_width_error import InvalidBinWidthError
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ NO_DURATION = timedelta(0)
14
+ LONGEST_DURATION = timedelta(days=1)
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class BinWidth:
19
+ """
20
+ Bins of a ``HistogramChart`` given by their width, their bounds being multiples of it.
21
+
22
+ With a width of 5, the bins are 10 to 15, 15 to 20 and so on, whatever the smallest value. Times of day take
23
+ a duration: with ``timedelta(minutes=30)``, the bins are 08:00 to 08:30, 08:30 to 09:00 and so on.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ width
30
+ The width of each bin: a number above 0 for numbers, a duration above 0 and of at most a day for times of
31
+ day.
32
+
33
+ Raises
34
+ ------
35
+ InvalidTypeError
36
+ When a setting is not of the type its annotation names.
37
+ InvalidBinWidthError
38
+ When the width is 0 or negative, or a duration beyond a day.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 21.0])
44
+ >>> chart = ndp.HistogramChart(bins=ndp.BinWidth(2.5))
45
+ >>> plot = ndp.Plot.histogram(prices, chart)
46
+ >>> plot.show()
47
+ >>> from datetime import time, timedelta
48
+ >>> hours = ndp.Array.from_list([time(8, 10), time(8, 40), time(9, 5), time(17, 50)])
49
+ >>> half_hours = ndp.HistogramChart(bins=ndp.BinWidth(timedelta(minutes=30)))
50
+ >>> ndp.Plot.histogram(hours, half_hours).show()
51
+ """
52
+
53
+ width: float | timedelta
54
+
55
+ def __post_init__(self) -> None:
56
+ """
57
+ Check the width of the bins.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Raises
62
+ ------
63
+ InvalidTypeError
64
+ When a setting is not of the type its annotation names.
65
+ InvalidBinWidthError
66
+ When the width is 0 or negative, or a duration beyond a day.
67
+ """
68
+ require_field_types(self)
69
+
70
+ if isinstance(self.width, timedelta):
71
+ is_outside_day = self.width <= NO_DURATION or self.width > LONGEST_DURATION
72
+ if is_outside_day:
73
+ raise InvalidBinWidthError(self.width)
74
+
75
+ return
76
+
77
+ if self.width <= 0:
78
+ raise InvalidBinWidthError(self.width)
@@ -0,0 +1,97 @@
1
+ """
2
+ Chart summing up the spread of values as boxes.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from dataclasses import dataclass
9
+
10
+ from numdaplot.plots.charts.chart import Chart
11
+ from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
12
+ from numdaplot.plots.charts.outliers import Outliers
13
+ from numdaplot.plots.style.color import Color
14
+ from numdaplot.plots.style.custom_color import CustomColor
15
+ from numdaplot.settings.field_types import require_field_types
16
+ from numdaplot.tables.columns.column_names import require_optional_column_name
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class BoxChart(Chart):
21
+ """
22
+ Chart summing up the spread of the values of each column as a box, used by ``Plot.box``.
23
+
24
+ The box goes from the first to the third quartile, with a line at the median. The whiskers reach the
25
+ furthest values within 1.5 box heights of the box, and the values beyond them are outliers. Missing values
26
+ are left out.
27
+
28
+ .. versionadded:: 0.1.0
29
+
30
+ Parameters
31
+ ----------
32
+ columns
33
+ For a Table, the columns drawn, holding numbers or times of day, not both. A Table needs it, even for a
34
+ single column. An Array takes none: when omitted, each of its columns is drawn. Times of day are measured on
35
+ an axis labeled ``HH:MM``.
36
+ group_by
37
+ For a Table, a column of texts, categories, booleans or times of day (written ``HH:MM``) splitting the rows into
38
+ groups, each drawn at its own position in alphabetical order, with the boxes of the columns side by side. A row
39
+ whose group is missing is left out. One box per column when omitted.
40
+ outliers
41
+ Whether the outliers are drawn, ``Outliers.SHOWN`` by default.
42
+ colors
43
+ One color per column, the colors of the default cycle when omitted. The chart keeps its own list.
44
+
45
+ Raises
46
+ ------
47
+ InvalidTypeError
48
+ When a setting is not of the type its annotation names.
49
+ InvalidColumnNameError
50
+ When ``group_by`` or a name in ``columns`` is an empty text.
51
+ EmptyListError
52
+ When ``columns`` or ``colors`` is an empty list.
53
+ DuplicateColumnError
54
+ When a column name appears twice in ``columns``.
55
+
56
+ Examples
57
+ --------
58
+ >>> import numdaplot as ndp
59
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon"])
60
+ >>> prices_2025 = ndp.Array.from_list([12.0, 9.5, 14.0, 10.0, 13.5, 8.0, 15.0, 11.0])
61
+ >>> prices_2026 = ndp.Array.from_list([14.0, 10.5, 16.0, 11.0, 15.5, 9.0, 17.0, 12.5])
62
+ >>> prices = ndp.Table.from_arrays({"city": cities, "2025": prices_2025, "2026": prices_2026})
63
+ >>> chart = ndp.BoxChart(columns=["2025", "2026"], group_by="city")
64
+ >>> plot = ndp.Plot.box(prices, chart)
65
+ >>> plot.show()
66
+ """
67
+
68
+ columns: list[str] | None = None
69
+ group_by: str | None = None
70
+ outliers: Outliers = Outliers.SHOWN
71
+ colors: Sequence[Color | CustomColor] | None = None
72
+
73
+ def __post_init__(self) -> None:
74
+ """
75
+ Check the columns and the colors and replace them with copies that only the chart holds.
76
+
77
+ .. versionadded:: 0.1.0
78
+
79
+ Raises
80
+ ------
81
+ InvalidTypeError
82
+ When a setting is not of the type its annotation names.
83
+ InvalidColumnNameError
84
+ When ``group_by`` or a name in ``columns`` is an empty text.
85
+ EmptyListError
86
+ When ``columns`` or ``colors`` is an empty list.
87
+ DuplicateColumnError
88
+ When a column name appears twice in ``columns``.
89
+ """
90
+ require_field_types(self)
91
+
92
+ require_optional_column_name(self.group_by)
93
+
94
+ columns_copy = copy_columns(self.columns)
95
+ colors_copy = copy_colors(self.colors)
96
+ object.__setattr__(self, "columns", columns_copy)
97
+ object.__setattr__(self, "colors", colors_copy)
@@ -0,0 +1,61 @@
1
+ """
2
+ Whether the cells of a HeatmapChart show their value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class CellValues(Enum):
11
+ """
12
+ Whether the cells of a ``HeatmapChart`` show their value.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
20
+ >>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
21
+ >>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
22
+ >>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
23
+ >>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
24
+ >>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.SHOWN)
25
+ >>> plot = ndp.Plot.heatmap(temperatures, chart)
26
+ >>> plot.show()
27
+ """
28
+
29
+ SHOWN = auto()
30
+ """
31
+ Each cell shows its value with at most two decimals, in black or white to stay readable.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
37
+ >>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
38
+ >>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
39
+ >>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
40
+ >>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
41
+ >>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.SHOWN)
42
+ >>> plot = ndp.Plot.heatmap(temperatures, chart)
43
+ >>> plot.show()
44
+ """
45
+
46
+ HIDDEN = auto()
47
+ """
48
+ The cells only show their color. Default value.
49
+
50
+ Examples
51
+ --------
52
+ >>> import numdaplot as ndp
53
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
54
+ >>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
55
+ >>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
56
+ >>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
57
+ >>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
58
+ >>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.HIDDEN)
59
+ >>> plot = ndp.Plot.heatmap(temperatures, chart)
60
+ >>> plot.show()
61
+ """
@@ -0,0 +1,59 @@
1
+ """
2
+ Base class of every chart.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
8
+
9
+ CONSTRUCTOR_OPERATION = "Creating a Chart with ndp.Chart()"
10
+ CONSTRUCTOR_ALTERNATIVE = "a chart such as ndp.LineChart"
11
+
12
+
13
+ class Chart:
14
+ """
15
+ Base class of every chart, which says what a Plot draws and how its series look.
16
+
17
+ A chart is immutable and checks its settings when it is created.
18
+
19
+ Only its subclasses are created: calling ``ndp.Chart()`` raises ``RefusedOperationError``.
20
+
21
+ Every chart, each passed to its own creation method of ``Plot``:
22
+
23
+ |Chart|What it draws|Example|
24
+ |---|---|---|
25
+ |``LineChart``|Each series as a line, with ``Plot.line``|``ndp.LineChart(x="month", y=["sales"])``|
26
+ |``BarChart``|Each value as a bar, with ``Plot.bar``|``ndp.BarChart(x="city", y=["sales"])``|
27
+ |``ScatterChart``|Each row as a point, with ``Plot.scatter``|``ndp.ScatterChart(x="price", y="stock")``|
28
+ |``HistogramChart``|The values per bin, with ``Plot.histogram``|``ndp.HistogramChart(columns=["price"])``|
29
+ |``BoxChart``|The spread of each column as a box, with ``Plot.box``|``ndp.BoxChart(columns=["price"])``|
30
+ |``PieChart``|Each row as a slice of a pie, with ``Plot.pie``|``ndp.PieChart(labels="city", values="sales")``|
31
+ |``HeatmapChart``|Each value as a colored cell, with ``Plot.heatmap``|``ndp.HeatmapChart()``|
32
+ |``MissingChart``|The missing values per column, with ``Plot.missing_by_column``|``ndp.MissingChart()``|
33
+
34
+ .. versionadded:: 0.1.0
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
40
+ >>> bar_plot = ndp.Plot.bar(prices, ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL))
41
+ >>> bar_plot.show()
42
+ >>> line_plot = ndp.Plot.line(prices, ndp.LineChart(marker=ndp.MarkerShape.CIRCLE))
43
+ >>> line_plot.show()
44
+ """
45
+
46
+ def __init__(self) -> None:
47
+ """
48
+ Refuse the creation of the base class itself, and let a subclass be created.
49
+
50
+ .. versionadded:: 0.1.0
51
+
52
+ Raises
53
+ ------
54
+ RefusedOperationError
55
+ When the created object is a Chart and not one of its subclasses.
56
+ """
57
+ created_class = type(self)
58
+ if created_class is Chart:
59
+ raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
@@ -0,0 +1,105 @@
1
+ """
2
+ Checks shared by the column and color settings of the charts.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+
9
+ from numdaplot.errors.empty_list_error import EmptyListError
10
+ from numdaplot.plots.style.color import Color
11
+ from numdaplot.plots.style.custom_color import CustomColor
12
+ from numdaplot.tables.columns.column_names import require_column_names
13
+
14
+ COLUMN_ITEM_NAME = "column"
15
+ COLOR_ITEM_NAME = "color"
16
+
17
+
18
+ def copy_columns(columns: list[str] | None) -> list[str] | None:
19
+ """
20
+ Check the names of the columns a chart draws and return a copy that only the chart holds.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ columns
27
+ The names of the columns, or None for an Array.
28
+
29
+ Returns
30
+ -------
31
+ list[str] or None
32
+ A copy of the names, or None.
33
+
34
+ Raises
35
+ ------
36
+ EmptyListError
37
+ When the list is empty.
38
+ InvalidColumnNameError
39
+ When a column name is an empty text.
40
+ DuplicateColumnError
41
+ When a name appears twice.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> from numdaplot.plots.charts.chart_settings import copy_columns
47
+ >>> try:
48
+ ... copy_columns(["price", "price"])
49
+ ... except ndp.DuplicateColumnError as error:
50
+ ... print(error)
51
+ The column name 'price' appears more than once.
52
+ """
53
+ if columns is None:
54
+ return None
55
+
56
+ if columns == []:
57
+ raise EmptyListError(COLUMN_ITEM_NAME)
58
+
59
+ require_column_names(columns)
60
+ columns_copy = list(columns)
61
+
62
+ return columns_copy
63
+
64
+
65
+ def copy_colors(colors: Sequence[Color | CustomColor] | None) -> list[Color | CustomColor] | None:
66
+ """
67
+ Check the colors of the series of a chart and return a copy that only the chart holds.
68
+
69
+ .. versionadded:: 0.1.0
70
+
71
+ Parameters
72
+ ----------
73
+ colors
74
+ One color per series, in a list or another sequence, or None for the colors of the default cycle.
75
+
76
+ Returns
77
+ -------
78
+ list[Color | CustomColor] or None
79
+ A copy of the colors, or None.
80
+
81
+ Raises
82
+ ------
83
+ EmptyListError
84
+ When the list is empty.
85
+
86
+ Examples
87
+ --------
88
+ >>> import numdaplot as ndp
89
+ >>> from numdaplot.plots.charts.chart_settings import copy_colors
90
+ >>> try:
91
+ ... copy_colors([])
92
+ ... except ndp.EmptyListError as error:
93
+ ... print(error)
94
+ Expected at least one color, got an empty list.
95
+ """
96
+ if colors is None:
97
+ return None
98
+
99
+ color_count = len(colors)
100
+ if color_count == 0:
101
+ raise EmptyListError(COLOR_ITEM_NAME)
102
+
103
+ colors_copy = list(colors)
104
+
105
+ return colors_copy