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,45 @@
1
+ """
2
+ Kind of object a display shows: a Plot or a Figure.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum
8
+
9
+
10
+ class ShownObject(Enum):
11
+ """
12
+ Kind of object a display shows, named in the message of a ``DisplayWarning``.
13
+
14
+ The value is the name of the class.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> from numdaplot.plots.output.shown_object import ShownObject
21
+ >>> ShownObject.FIGURE.value
22
+ 'Figure'
23
+ """
24
+
25
+ PLOT = "Plot"
26
+ """
27
+ A Plot, shown with ``Plot.show``.
28
+
29
+ Examples
30
+ --------
31
+ >>> from numdaplot.plots.output.shown_object import ShownObject
32
+ >>> ShownObject.PLOT.value
33
+ 'Plot'
34
+ """
35
+
36
+ FIGURE = "Figure"
37
+ """
38
+ A Figure, shown with ``Figure.show``.
39
+
40
+ Examples
41
+ --------
42
+ >>> from numdaplot.plots.output.shown_object import ShownObject
43
+ >>> ShownObject.FIGURE.value
44
+ 'Figure'
45
+ """
@@ -0,0 +1,245 @@
1
+ """
2
+ Checks of a chart added to a Plot with ``add_line``, ``add_bar`` or ``add_scatter``.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import cast
8
+
9
+ from numdaplot.data_types.value_family import ValueFamily, find_family
10
+ from numdaplot.errors.incompatible_charts_error import IncompatibleChartsError
11
+ from numdaplot.errors.refused_setting_error import RefusedSettingError
12
+ from numdaplot.plots.chart_layer import ChartLayer
13
+ from numdaplot.plots.charts.bar_chart import BarChart
14
+ from numdaplot.plots.charts.chart import Chart
15
+ from numdaplot.plots.charts.line_chart import LineChart
16
+ from numdaplot.plots.charts.orientation import Orientation
17
+ from numdaplot.plots.charts.scatter_chart import ScatterChart
18
+ from numdaplot.plots.charts.value_axis import ValueAxis
19
+ from numdaplot.plots.data.chart_values import ChartValues
20
+ from numdaplot.plots.data.position_kind import PositionKind
21
+
22
+ OVERLAID_CHARTS = (LineChart, BarChart, ScatterChart)
23
+ POSITION_NAMES = {
24
+ PositionKind.NUMBERS: "numbers",
25
+ PositionKind.MOMENTS: "dates",
26
+ PositionKind.TEXTS: "texts",
27
+ PositionKind.TIMES: "times of day",
28
+ }
29
+ VALUE_NAMES = {
30
+ ValueFamily.NUMBER: "numbers",
31
+ ValueFamily.TIME: "times of day",
32
+ }
33
+ AXIS_NAMES = {
34
+ ValueAxis.LEFT: "left",
35
+ ValueAxis.RIGHT: "right",
36
+ }
37
+ VALUE_DESCRIPTION = "{value_name} on the {axis_name} axis"
38
+ PLOT_NAME = "a Plot of {chart_name}"
39
+ HORIZONTAL_BARS_NAME = "a Plot of horizontal bars"
40
+ HORIZONTAL_SETTING = "Orientation.HORIZONTAL"
41
+
42
+
43
+ def require_overlay_base(first_layer: ChartLayer, method_name: str) -> None:
44
+ """
45
+ Check that a Plot accepts added charts: its first chart draws lines, vertical bars or points.
46
+
47
+ .. versionadded:: 0.1.0
48
+
49
+ Parameters
50
+ ----------
51
+ first_layer
52
+ The first chart of the Plot and its values.
53
+ method_name
54
+ The method adding a chart, such as ``add_line``, shown in the error message.
55
+
56
+ Raises
57
+ ------
58
+ RefusedSettingError
59
+ When the first chart is not a LineChart, a BarChart or a ScatterChart, or draws horizontal bars.
60
+
61
+ Examples
62
+ --------
63
+ >>> import numdaplot as ndp
64
+ >>> from numdaplot.plots.chart_layer import ChartLayer
65
+ >>> from numdaplot.plots.data.sample_values import read_sample_values
66
+ >>> from numdaplot.plots.overlay_checks import require_overlay_base
67
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
68
+ >>> layer = ChartLayer(ndp.BoxChart(), read_sample_values(prices, None, None, "BoxChart"))
69
+ >>> try:
70
+ ... require_overlay_base(layer, "add_line")
71
+ ... except ndp.RefusedSettingError as error:
72
+ ... print(error)
73
+ add_line does not accept a Plot of BoxChart.
74
+ """
75
+ chart = first_layer.chart
76
+ if not isinstance(chart, OVERLAID_CHARTS):
77
+ chart_class = type(chart)
78
+ plot_name = PLOT_NAME.format(chart_name=chart_class.__name__)
79
+ raise RefusedSettingError(plot_name, method_name)
80
+
81
+ draws_horizontal_bars = is_horizontal_bar_chart(chart)
82
+ if draws_horizontal_bars:
83
+ raise RefusedSettingError(HORIZONTAL_BARS_NAME, method_name)
84
+
85
+
86
+ def require_vertical_bars(chart: BarChart, method_name: str) -> None:
87
+ """
88
+ Check that bars added to a Plot are vertical, their ``x`` values sharing the horizontal axis.
89
+
90
+ .. versionadded:: 0.1.0
91
+
92
+ Parameters
93
+ ----------
94
+ chart
95
+ The bars added.
96
+ method_name
97
+ The method adding them, shown in the error message.
98
+
99
+ Raises
100
+ ------
101
+ RefusedSettingError
102
+ When the bars are horizontal.
103
+
104
+ Examples
105
+ --------
106
+ >>> import numdaplot as ndp
107
+ >>> from numdaplot.plots.overlay_checks import require_vertical_bars
108
+ >>> try:
109
+ ... require_vertical_bars(ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL), "add_bar")
110
+ ... except ndp.RefusedSettingError as error:
111
+ ... print(error)
112
+ add_bar does not accept Orientation.HORIZONTAL.
113
+ """
114
+ if chart.orientation == Orientation.HORIZONTAL:
115
+ raise RefusedSettingError(HORIZONTAL_SETTING, method_name)
116
+
117
+
118
+ def require_same_positions(first_layer: ChartLayer, added_layer: ChartLayer) -> None:
119
+ """
120
+ Check that a chart added to a Plot has the same kind of ``x`` values as its first chart.
121
+
122
+ .. versionadded:: 0.1.0
123
+
124
+ Parameters
125
+ ----------
126
+ first_layer
127
+ The first chart of the Plot and its values.
128
+ added_layer
129
+ The chart added and its values.
130
+
131
+ Raises
132
+ ------
133
+ IncompatibleChartsError
134
+ When one has numbers, dates or texts and the other another kind.
135
+
136
+ Examples
137
+ --------
138
+ >>> import numdaplot as ndp
139
+ >>> from numdaplot.plots.chart_layer import ChartLayer
140
+ >>> from numdaplot.plots.data.array_values import read_array_values
141
+ >>> from numdaplot.plots.overlay_checks import require_same_positions
142
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
143
+ >>> layer = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
144
+ >>> require_same_positions(layer, layer)
145
+ """
146
+ first_values = cast(ChartValues, first_layer.values)
147
+ added_values = cast(ChartValues, added_layer.values)
148
+ plot_kind = first_values.positions.kind
149
+ added_kind = added_values.positions.kind
150
+ if added_kind == plot_kind:
151
+ return
152
+
153
+ added_class = type(added_layer.chart)
154
+ added_name = POSITION_NAMES[added_kind]
155
+ plot_name = POSITION_NAMES[plot_kind]
156
+ raise IncompatibleChartsError(added_class.__name__, added_name, plot_name)
157
+
158
+
159
+ def require_same_values(layers: list[ChartLayer], added_layer: ChartLayer, axis: ValueAxis) -> None:
160
+ """
161
+ Check that a chart added to a Plot measures the same kind of values as the charts already on its axis.
162
+
163
+ .. versionadded:: 0.1.0
164
+
165
+ Parameters
166
+ ----------
167
+ layers
168
+ The charts of the Plot and their values.
169
+ added_layer
170
+ The chart added and its values.
171
+ axis
172
+ The vertical axis the added chart is measured on.
173
+
174
+ Raises
175
+ ------
176
+ IncompatibleChartsError
177
+ When one measures numbers and the other times of day on the same axis.
178
+
179
+ Examples
180
+ --------
181
+ >>> from datetime import time
182
+ >>> import numdaplot as ndp
183
+ >>> from numdaplot.plots.chart_layer import ChartLayer
184
+ >>> from numdaplot.plots.data.array_values import read_array_values
185
+ >>> from numdaplot.plots.overlay_checks import require_same_values
186
+ >>> counts = ndp.Array.from_list([3.0, 5.0])
187
+ >>> hours = ndp.Array.from_list([time(8), time(9)])
188
+ >>> count_line = ChartLayer(ndp.LineChart(), read_array_values(counts, "LineChart"))
189
+ >>> hour_line = ChartLayer(ndp.LineChart(), read_array_values(hours, "LineChart"))
190
+ >>> try:
191
+ ... require_same_values([count_line], hour_line, ndp.ValueAxis.LEFT)
192
+ ... except ndp.IncompatibleChartsError as error:
193
+ ... print(error)
194
+ A LineChart with times of day on the left axis cannot be added to a Plot with numbers on the left axis.
195
+ """
196
+ added_values = cast(ChartValues, added_layer.values)
197
+ added_family = find_family(added_values.value_type)
198
+ axis_name = AXIS_NAMES[axis]
199
+
200
+ for layer in layers:
201
+ if layer.value_axis != axis:
202
+ continue
203
+
204
+ values = cast(ChartValues, layer.values)
205
+ plot_family = find_family(values.value_type)
206
+ if plot_family == added_family:
207
+ return
208
+
209
+ added_class = type(added_layer.chart)
210
+ added_value_name = VALUE_NAMES[added_family]
211
+ plot_value_name = VALUE_NAMES[plot_family]
212
+ added_name = VALUE_DESCRIPTION.format(value_name=added_value_name, axis_name=axis_name)
213
+ plot_name = VALUE_DESCRIPTION.format(value_name=plot_value_name, axis_name=axis_name)
214
+ raise IncompatibleChartsError(added_class.__name__, added_name, plot_name)
215
+
216
+
217
+ def is_horizontal_bar_chart(chart: Chart) -> bool:
218
+ """
219
+ Return whether a chart draws horizontal bars.
220
+
221
+ .. versionadded:: 0.1.0
222
+
223
+ Parameters
224
+ ----------
225
+ chart
226
+ Any chart.
227
+
228
+ Returns
229
+ -------
230
+ bool
231
+ True for a BarChart of horizontal bars.
232
+
233
+ Examples
234
+ --------
235
+ >>> import numdaplot as ndp
236
+ >>> from numdaplot.plots.overlay_checks import is_horizontal_bar_chart
237
+ >>> is_horizontal_bar_chart(ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL))
238
+ True
239
+ """
240
+ if not isinstance(chart, BarChart):
241
+ return False
242
+
243
+ is_horizontal = chart.orientation == Orientation.HORIZONTAL
244
+
245
+ return is_horizontal
@@ -0,0 +1,31 @@
1
+ """
2
+ The ``ndp.Plot`` class: a drawn view of a Table or an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.plots.plot_distribution_creation import PlotDistributionCreation
8
+ from numdaplot.plots.plot_output import PlotOutput
9
+ from numdaplot.plots.plot_overlays import PlotOverlays
10
+ from numdaplot.plots.plot_overview_creation import PlotOverviewCreation
11
+ from numdaplot.plots.plot_series_creation import PlotSeriesCreation
12
+
13
+
14
+ class Plot(PlotSeriesCreation, PlotDistributionCreation, PlotOverviewCreation, PlotOverlays, PlotOutput):
15
+ """
16
+ A drawn view of a Table or an Array, made by creation methods such as ``Plot.line``.
17
+
18
+ A Plot is immutable: it keeps the values it was made from, so changing the data afterwards never changes it.
19
+ It is only displayed by ``show``, never on its own in a notebook.
20
+
21
+ Calling ``ndp.Plot(...)`` is refused with ``RefusedOperationError``, which names the methods to use instead.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Examples
26
+ --------
27
+ >>> import numdaplot as ndp
28
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
29
+ >>> plot = ndp.Plot.line(prices)
30
+ >>> plot.show()
31
+ """
@@ -0,0 +1,140 @@
1
+ """
2
+ Charts and style stored by a Plot, shared by every group of Plot methods.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Never, Self
8
+
9
+ from matplotlib.figure import FigureBase
10
+
11
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
12
+ from numdaplot.plots.chart_layer import ChartLayer
13
+ from numdaplot.plots.data.shown_columns import require_distinct_shown_names
14
+ from numdaplot.plots.drawing.plot_drawing import FigureDrawing, draw_plot
15
+ from numdaplot.plots.drawing.size_inches import convert_size_to_inches
16
+ from numdaplot.plots.style.plot_style import PlotStyle
17
+
18
+ CONSTRUCTOR_OPERATION = "Creating a Plot with ndp.Plot(...)"
19
+ CONSTRUCTOR_ALTERNATIVE = "ndp.Plot.line, bar, scatter, histogram, box, pie, heatmap, missing_by_column or missing_map"
20
+
21
+
22
+ class PlotData:
23
+ """
24
+ Charts and style stored by a Plot, shared by every group of Plot methods.
25
+
26
+ Use ``ndp.Plot`` and its creation methods; this base class only holds the charts and the style.
27
+
28
+ .. versionadded:: 0.1.0
29
+ """
30
+
31
+ _layers: list[ChartLayer]
32
+ _style: PlotStyle
33
+
34
+ def __init__(self, *arguments: Never, **keyword_arguments: Never) -> None:
35
+ """
36
+ Refuse the creation of a Plot by its constructor: the creation methods such as ``line`` create Plots.
37
+
38
+ .. versionadded:: 0.1.0
39
+
40
+ Parameters
41
+ ----------
42
+ arguments
43
+ Any value, refused.
44
+ keyword_arguments
45
+ Any named value, refused.
46
+
47
+ Raises
48
+ ------
49
+ RefusedOperationError
50
+ Always, naming the creation methods.
51
+ """
52
+ raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
53
+
54
+ @classmethod
55
+ def _create(cls, layers: list[ChartLayer], style: PlotStyle) -> Self:
56
+ """
57
+ Return a new Plot keeping the charts and the style.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Parameters
62
+ ----------
63
+ layers
64
+ The charts and their values, made by the creation methods, the first one giving the default labels.
65
+ The Plot keeps its own copy of the list.
66
+ style
67
+ The look of the Plot.
68
+
69
+ Returns
70
+ -------
71
+ Self
72
+ The new Plot.
73
+
74
+ Raises
75
+ ------
76
+ DuplicateColumnError
77
+ When the style shows a column under the name of another column of the charts.
78
+ """
79
+ require_distinct_shown_names(layers, style.renaming)
80
+ created_plot = cls.__new__(cls)
81
+ created_plot._layers = list(layers)
82
+ created_plot._style = style
83
+
84
+ return created_plot
85
+
86
+ @classmethod
87
+ def _create_from_layer(cls, layer: ChartLayer, style: PlotStyle | None) -> Self:
88
+ """
89
+ Return a new Plot drawing one chart, with the default ``PlotStyle`` when none is given.
90
+
91
+ .. versionadded:: 0.1.0
92
+
93
+ Parameters
94
+ ----------
95
+ layer
96
+ The chart and its values.
97
+ style
98
+ The look of the Plot, or None for the default ``PlotStyle``.
99
+
100
+ Returns
101
+ -------
102
+ Self
103
+ The Plot of the chart.
104
+ """
105
+ chosen_style = style
106
+ if chosen_style is None:
107
+ chosen_style = PlotStyle()
108
+
109
+ created_plot = cls._create([layer], chosen_style)
110
+
111
+ return created_plot
112
+
113
+ def _draw_on(self, target: FigureBase) -> None:
114
+ """
115
+ Draw the Plot on an empty matplotlib figure or subfigure, as ``show``, ``save`` and ``Figure`` do.
116
+
117
+ .. versionadded:: 0.1.0
118
+
119
+ Parameters
120
+ ----------
121
+ target
122
+ The figure or subfigure drawn on.
123
+ """
124
+ draw_plot(target, self._layers, self._style)
125
+
126
+ def _describe_drawing(self) -> FigureDrawing:
127
+ """
128
+ Return what the Plot draws, and the size of its style.
129
+
130
+ .. versionadded:: 0.1.0
131
+
132
+ Returns
133
+ -------
134
+ FigureDrawing
135
+ The drawing of the Plot.
136
+ """
137
+ size_inches = convert_size_to_inches(self._style.size)
138
+ drawing = FigureDrawing(self._draw_on, size_inches)
139
+
140
+ return drawing
@@ -0,0 +1,237 @@
1
+ """
2
+ Creation of a Plot showing how values are spread or shared out.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Self
8
+
9
+ from numdaplot.arrays.array import Array
10
+ from numdaplot.plots.chart_layer import ChartLayer
11
+ from numdaplot.plots.charts.box_chart import BoxChart
12
+ from numdaplot.plots.charts.histogram_chart import HistogramChart
13
+ from numdaplot.plots.charts.pie_chart import PieChart
14
+ from numdaplot.plots.data.pie_values import read_pie_values
15
+ from numdaplot.plots.data.sample_values import read_sample_values
16
+ from numdaplot.plots.drawing.histogram_drawing import require_bins_on_values
17
+ from numdaplot.plots.drawing.series_colors import require_color_count
18
+ from numdaplot.plots.plot_data import PlotData
19
+ from numdaplot.plots.style.axis_settings import require_no_axis_settings
20
+ from numdaplot.plots.style.plot_style import PlotStyle
21
+ from numdaplot.settings.argument_types import checked_arguments
22
+ from numdaplot.tables.table import Table
23
+
24
+ HISTOGRAM_CHART_NAME = "HistogramChart"
25
+ BOX_CHART_NAME = "BoxChart"
26
+
27
+
28
+ class PlotDistributionCreation(PlotData):
29
+ """
30
+ Creation of a Plot showing how values are spread or shared out.
31
+
32
+ Use ``ndp.Plot.histogram``, ``ndp.Plot.box`` and ``ndp.Plot.pie``.
33
+
34
+ .. versionadded:: 0.1.0
35
+ """
36
+
37
+ @classmethod
38
+ @checked_arguments
39
+ def histogram(
40
+ cls, data: Table | Array, chart: HistogramChart | None = None, style: PlotStyle | None = None
41
+ ) -> Self:
42
+ """
43
+ Return a Plot drawing how many values of columns of numbers or times of day fall in each bin.
44
+
45
+ For a Table, ``HistogramChart.columns`` names the columns drawn. For an Array of one or two dimensions, each
46
+ column is drawn. Several columns share the same bins.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Parameters
51
+ ----------
52
+ data
53
+ The Table or the Array drawn.
54
+ chart
55
+ The columns drawn, the bins, the measure and the colors.
56
+ The default ``HistogramChart`` when omitted, which draws an Array: a Table needs the columns named.
57
+ style
58
+ The look of the Plot, the default ``PlotStyle`` when omitted.
59
+
60
+ Returns
61
+ -------
62
+ Self
63
+ The Plot, which ``show`` displays and ``save`` writes as an image.
64
+
65
+ Raises
66
+ ------
67
+ InvalidTypeError
68
+ When an argument is not of the type its annotation names.
69
+ InvalidChartDataError
70
+ When a Table has no ``columns``, or an Array has ``columns``.
71
+ ColumnNotFoundError
72
+ When a column does not exist.
73
+ IncompatibleTypesError
74
+ When a drawn column holds neither numbers nor times of day, the columns mix them, or the width of the bins
75
+ is a number for times of day or a duration for numbers.
76
+ DimensionError
77
+ When an Array has more than two dimensions.
78
+ InvalidColorCountError
79
+ When the colors of the chart are not one per column.
80
+
81
+ Examples
82
+ --------
83
+ >>> import numdaplot as ndp
84
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 15.0, 18.5, 11.0])
85
+ >>> flats = ndp.Table.from_arrays({"price": prices})
86
+ >>> chart = ndp.HistogramChart(columns=["price"], bins=ndp.BinWidth(2.0), measure=ndp.Measure.RATIO)
87
+ >>> style = ndp.PlotStyle(title="Prices", x_label="Price (euros)")
88
+ >>> plot = ndp.Plot.histogram(flats, chart, style)
89
+ >>> plot.show()
90
+ """
91
+ if chart is None:
92
+ chart = HistogramChart()
93
+
94
+ values = read_sample_values(data, chart.columns, None, HISTOGRAM_CHART_NAME)
95
+ require_bins_on_values(chart.bins, values.value_type)
96
+ series_count = len(values.series)
97
+ require_color_count(chart.colors, series_count)
98
+ layer = ChartLayer(chart, values)
99
+ plot = cls._create_from_layer(layer, style)
100
+
101
+ return plot
102
+
103
+ @classmethod
104
+ @checked_arguments
105
+ def box(cls, data: Table | Array, chart: BoxChart | None = None, style: PlotStyle | None = None) -> Self:
106
+ """
107
+ Return a Plot summing up the spread of columns of numbers or times of day as boxes.
108
+
109
+ For a Table, ``BoxChart.columns`` names the columns drawn, and ``BoxChart.group_by`` may split their rows into
110
+ groups. For an Array of one or two dimensions, each column is a box.
111
+
112
+ .. versionadded:: 0.1.0
113
+
114
+ Parameters
115
+ ----------
116
+ data
117
+ The Table or the Array drawn.
118
+ chart
119
+ The columns drawn, their groups, the outliers and the colors.
120
+ The default ``BoxChart`` when omitted, which draws an Array: a Table needs the columns named.
121
+ style
122
+ The look of the Plot, the default ``PlotStyle`` when omitted.
123
+
124
+ Returns
125
+ -------
126
+ Self
127
+ The Plot, which ``show`` displays and ``save`` writes as an image.
128
+
129
+ Raises
130
+ ------
131
+ InvalidTypeError
132
+ When an argument is not of the type its annotation names.
133
+ InvalidChartDataError
134
+ When a Table has no ``columns``, or an Array has ``columns`` or ``group_by``.
135
+ ColumnNotFoundError
136
+ When a column does not exist.
137
+ IncompatibleTypesError
138
+ When a drawn column holds neither numbers nor times of day, the columns mix them, or ``group_by`` holds
139
+ neither texts, booleans nor times of day.
140
+ DimensionError
141
+ When an Array has more than two dimensions.
142
+ InvalidColorCountError
143
+ When the colors of the chart are not one per column.
144
+
145
+ Examples
146
+ --------
147
+ >>> import numdaplot as ndp
148
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Paris", "Lyon", "Pau", "Paris", "Lyon", "Pau"])
149
+ >>> prices = ndp.Array.from_list([14.0, 9.5, 7.0, 16.5, 10.0, 8.5, 15.0, 11.5, 6.0])
150
+ >>> flats = ndp.Table.from_arrays({"city": cities, "price": prices})
151
+ >>> chart = ndp.BoxChart(columns=["price"], group_by="city")
152
+ >>> style = ndp.PlotStyle(y_label="Price per night (euros)")
153
+ >>> plot = ndp.Plot.box(flats, chart, style)
154
+ >>> plot.show()
155
+ """
156
+ if chart is None:
157
+ chart = BoxChart()
158
+
159
+ values = read_sample_values(data, chart.columns, chart.group_by, BOX_CHART_NAME)
160
+ series_count = len(values.series)
161
+ require_color_count(chart.colors, series_count)
162
+ layer = ChartLayer(chart, values)
163
+ plot = cls._create_from_layer(layer, style)
164
+
165
+ return plot
166
+
167
+ @classmethod
168
+ @checked_arguments
169
+ def pie(cls, table: Table, chart: PieChart, style: PlotStyle | None = None) -> Self:
170
+ """
171
+ Return a Plot sharing out the values of a column of a Table as slices of a disc.
172
+
173
+ ``PieChart.labels`` names the column of texts labeling the slices and ``PieChart.values`` the column of numbers
174
+ sizing them. A Plot of a pie has no axes, so its style takes no axis label.
175
+
176
+ .. versionadded:: 0.1.0
177
+
178
+ Parameters
179
+ ----------
180
+ table
181
+ The Table drawn.
182
+ chart
183
+ The labels, the values, the percentages and the colors.
184
+ style
185
+ The look of the Plot, the default ``PlotStyle`` when omitted.
186
+
187
+ Returns
188
+ -------
189
+ Self
190
+ The Plot, which ``show`` displays and ``save`` writes as an image.
191
+
192
+ Raises
193
+ ------
194
+ InvalidTypeError
195
+ When an argument is not of the type its annotation names.
196
+ ColumnNotFoundError
197
+ When a column does not exist.
198
+ IncompatibleTypesError
199
+ When ``labels`` does not hold texts, or ``values`` does not hold numbers.
200
+ MissingValueError
201
+ When a label or a value is missing.
202
+ OutOfDomainError
203
+ When a value is negative.
204
+ EmptyTotalError
205
+ When the values add up to 0.
206
+ DuplicateLabelError
207
+ When two slices have the same label.
208
+ InvalidColorCountError
209
+ When the colors of the chart are not one per slice.
210
+ RefusedSettingError
211
+ When the style has an axis setting: ``x_label``, ``y_label``, ``right_label``, ``x_tick_rotation`` or
212
+ ``y_tick_rotation``.
213
+
214
+ Warns
215
+ -----
216
+ ReadabilityWarning
217
+ When there are more than 5 slices.
218
+
219
+ Examples
220
+ --------
221
+ >>> import numdaplot as ndp
222
+ >>> devices = ndp.Array.from_list(["Phone", "Computer", "Tablet"])
223
+ >>> visits = ndp.Array.from_list([5400.0, 3100.0, 900.0])
224
+ >>> traffic = ndp.Table.from_arrays({"device": devices, "visits": visits})
225
+ >>> chart = ndp.PieChart(labels="device", values="visits")
226
+ >>> style = ndp.PlotStyle(title="Visits per device")
227
+ >>> plot = ndp.Plot.pie(traffic, chart, style)
228
+ >>> plot.show()
229
+ """
230
+ values = read_pie_values(table, chart)
231
+ slice_count = len(values.rows)
232
+ require_color_count(chart.colors, slice_count)
233
+ require_no_axis_settings(style)
234
+ layer = ChartLayer(chart, values)
235
+ plot = cls._create_from_layer(layer, style)
236
+
237
+ return plot