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,124 @@
1
+ """
2
+ Output of a Plot: display, image files and matplotlib figures.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from matplotlib.figure import Figure
8
+
9
+ from numdaplot.plots.drawing.plot_drawing import build_figure
10
+ from numdaplot.plots.output.image_saving import write_image
11
+ from numdaplot.plots.output.plot_display import show_drawing
12
+ from numdaplot.plots.output.shown_object import ShownObject
13
+ from numdaplot.plots.plot_data import PlotData
14
+ from numdaplot.plots.style.image_options import ImageOptions
15
+ from numdaplot.settings.argument_types import checked_arguments
16
+ from numdaplot.tables.conflict import Conflict
17
+ from numdaplot.tables.files.file_paths import FilePath
18
+
19
+
20
+ class PlotOutput(PlotData):
21
+ """
22
+ Output of a Plot: display, image files and matplotlib figures.
23
+
24
+ Use ``ndp.Plot``; this group only adds the output methods.
25
+
26
+ .. versionadded:: 0.1.0
27
+ """
28
+
29
+ def to_matplotlib(self) -> Figure:
30
+ """
31
+ Return a new matplotlib figure of the Plot, to change it with matplotlib.
32
+
33
+ Changing the figure never changes the Plot. The figure is not managed by ``matplotlib.pyplot``, so
34
+ a notebook does not display it on its own.
35
+
36
+ .. versionadded:: 0.1.0
37
+
38
+ Returns
39
+ -------
40
+ matplotlib.figure.Figure
41
+ The figure, drawn on a single matplotlib ``Axes``.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
47
+ >>> style = ndp.PlotStyle(title="Prices")
48
+ >>> figure = ndp.Plot.line(prices, style=style).to_matplotlib()
49
+ >>> figure.axes[0].get_title()
50
+ 'Prices'
51
+ >>> figure.axes[0].lines[0].get_ydata()
52
+ array([12. , 15.5, 14. ])
53
+ """
54
+ drawing = self._describe_drawing()
55
+ figure = build_figure(drawing)
56
+
57
+ return figure
58
+
59
+ @checked_arguments
60
+ def save(self, path: FilePath, options: ImageOptions | None = None, on_conflict: Conflict = Conflict.ERROR) -> None:
61
+ """
62
+ Save the Plot as an image, in the format named by the extension of the path.
63
+
64
+ ``.png`` gives an image made of pixels, ``.svg`` and ``.pdf`` images made of lines and texts that stay
65
+ sharp at any zoom. The image has the size of the style, 640 by 480 pixels for a PNG image by default.
66
+
67
+ .. versionadded:: 0.1.0
68
+
69
+ Parameters
70
+ ----------
71
+ path
72
+ The path of the image, a ``FilePath`` such as ``"chart.png"`` or ``Path("images/chart.svg")``, ending with
73
+ ``.png``, ``.svg`` or ``.pdf``.
74
+ options
75
+ The resolution of a PNG image, 100 dots per inch when omitted. SVG and PDF images take none.
76
+ on_conflict
77
+ ``ERROR`` by default, refusing to overwrite an existing file, or ``REPLACE`` to overwrite it.
78
+
79
+ Raises
80
+ ------
81
+ InvalidTypeError
82
+ When an argument is not of the type its annotation names.
83
+ UnsupportedImageFormatError
84
+ When the path does not end with ``.png``, ``.svg`` or ``.pdf``.
85
+ RefusedSettingError
86
+ When options are given for an SVG or PDF image.
87
+ FileExistsError
88
+ When a file exists at the path and ``on_conflict`` is ``ERROR``.
89
+ FileAccessError
90
+ When the file system refuses the file: missing folder, missing permission and so on.
91
+
92
+ Examples
93
+ --------
94
+ >>> import tempfile
95
+ >>> from pathlib import Path
96
+ >>> import numdaplot as ndp
97
+ >>> path = Path(tempfile.mkdtemp()) / "prices.svg"
98
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
99
+ >>> plot = ndp.Plot.line(prices)
100
+ >>> plot.save(path)
101
+ >>> path.read_text().startswith("<?xml")
102
+ True
103
+ """
104
+ drawing = self._describe_drawing()
105
+ write_image(drawing, path, options, on_conflict)
106
+
107
+ def show(self) -> None:
108
+ """
109
+ Show the Plot: as an image in a Jupyter notebook, in a matplotlib window anywhere else.
110
+
111
+ In a script, the window stays open until it is closed. When no window can be opened, because Python has no
112
+ ``tkinter`` or runs on a server, nothing is shown and a ``DisplayWarning`` suggests saving the Plot instead.
113
+
114
+ .. versionadded:: 0.1.0
115
+
116
+ Examples
117
+ --------
118
+ >>> import numdaplot as ndp
119
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
120
+ >>> plot = ndp.Plot.bar(prices)
121
+ >>> plot.show()
122
+ """
123
+ drawing = self._describe_drawing()
124
+ show_drawing(drawing, ShownObject.PLOT)
@@ -0,0 +1,273 @@
1
+ """
2
+ Charts drawn over the charts of a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import replace
8
+ from typing import Self
9
+
10
+ from numdaplot.arrays.array import Array
11
+ from numdaplot.plots.chart_layer import ChartLayer
12
+ from numdaplot.plots.charts.bar_chart import BarChart
13
+ from numdaplot.plots.charts.line_chart import LineChart
14
+ from numdaplot.plots.charts.scatter_chart import ScatterChart
15
+ from numdaplot.plots.charts.value_axis import ValueAxis
16
+ from numdaplot.plots.drawing.layer_alignment import align_layers
17
+ from numdaplot.plots.layer_reading import read_bar_layer, read_line_layer, read_scatter_layer
18
+ from numdaplot.plots.overlay_checks import (
19
+ require_overlay_base,
20
+ require_same_positions,
21
+ require_same_values,
22
+ require_vertical_bars,
23
+ )
24
+ from numdaplot.plots.plot_data import PlotData
25
+ from numdaplot.settings.argument_types import checked_arguments
26
+ from numdaplot.tables.table import Table
27
+
28
+ ADD_LINE_NAME = "add_line"
29
+ ADD_BAR_NAME = "add_bar"
30
+ ADD_SCATTER_NAME = "add_scatter"
31
+
32
+
33
+ class PlotOverlays(PlotData):
34
+ """
35
+ Charts drawn over the charts of a Plot.
36
+
37
+ Use ``ndp.Plot``; this group only adds the ``add_*`` methods.
38
+
39
+ .. versionadded:: 0.1.0
40
+ """
41
+
42
+ @checked_arguments
43
+ def add_line(self, data: Table | Array, chart: LineChart | None = None, axis: ValueAxis = ValueAxis.LEFT) -> Self:
44
+ """
45
+ Return a new Plot with lines added over the charts of this one.
46
+
47
+ The lines take the colors of the default cycle after the ones already used. Over bars or texts, their
48
+ ``x`` values are placed on the labels of the Plot, new labels following the others.
49
+
50
+ .. versionadded:: 0.1.0
51
+
52
+ Parameters
53
+ ----------
54
+ data
55
+ The Table or the Array of the lines, which may differ from the one of the Plot.
56
+ chart
57
+ The columns drawn and the look of the lines.
58
+ The default ``LineChart`` when omitted, which draws an Array: a Table needs the columns named.
59
+ axis
60
+ ``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
61
+ their own on the right.
62
+
63
+ Returns
64
+ -------
65
+ Self
66
+ A new Plot; this one is left unchanged.
67
+
68
+ Raises
69
+ ------
70
+ InvalidTypeError
71
+ When an argument is not of the type its annotation names.
72
+ RefusedSettingError
73
+ When the Plot does not draw lines, vertical bars or points.
74
+ IncompatibleChartsError
75
+ When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
76
+ or when one measures numbers and the other times of day on the same axis.
77
+ DuplicateLabelError
78
+ When a label appears twice in the ``x`` values of one chart placed on labels.
79
+ InvalidChartDataError
80
+ When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
81
+ InvalidColorCountError
82
+ When the colors of the chart are not one per line.
83
+
84
+ Examples
85
+ --------
86
+ >>> import numdaplot as ndp
87
+ >>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
88
+ >>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
89
+ >>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 140.0])
90
+ >>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
91
+ >>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]))
92
+ >>> line = ndp.LineChart(x="month", y=["target"], marker=ndp.MarkerShape.CIRCLE)
93
+ >>> both = plot.add_line(shop, line)
94
+ >>> both.show()
95
+ """
96
+ if chart is None:
97
+ chart = LineChart()
98
+
99
+ layer = read_line_layer(data, chart)
100
+ added_plot = self._add_layer(layer, axis, ADD_LINE_NAME)
101
+
102
+ return added_plot
103
+
104
+ @checked_arguments
105
+ def add_bar(self, data: Table | Array, chart: BarChart | None = None, axis: ValueAxis = ValueAxis.LEFT) -> Self:
106
+ """
107
+ Return a new Plot with vertical bars added over the charts of this one.
108
+
109
+ The bars are drawn over the ones already there, at the same positions: to draw bars side by side, give
110
+ several columns to a single ``BarChart``. Their ``x`` values are placed on the labels of the Plot, new
111
+ labels following the others.
112
+
113
+ .. versionadded:: 0.1.0
114
+
115
+ Parameters
116
+ ----------
117
+ data
118
+ The Table or the Array of the bars, which may differ from the one of the Plot.
119
+ chart
120
+ The columns drawn and the look of the bars, which must be vertical.
121
+ The default ``BarChart`` when omitted, which draws an Array: a Table needs the columns named.
122
+ axis
123
+ ``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
124
+ their own on the right.
125
+
126
+ Returns
127
+ -------
128
+ Self
129
+ A new Plot; this one is left unchanged.
130
+
131
+ Raises
132
+ ------
133
+ InvalidTypeError
134
+ When an argument is not of the type its annotation names.
135
+ RefusedSettingError
136
+ When the bars are horizontal, or the Plot does not draw lines, vertical bars or points.
137
+ IncompatibleChartsError
138
+ When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
139
+ or when one measures numbers and the other times of day on the same axis.
140
+ DuplicateLabelError
141
+ When a label appears twice in the ``x`` values of one chart.
142
+ InvalidChartDataError
143
+ When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
144
+ InvalidColorCountError
145
+ When the colors of the chart are not one per series.
146
+
147
+ Examples
148
+ --------
149
+ >>> import numdaplot as ndp
150
+ >>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
151
+ >>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
152
+ >>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 160.0])
153
+ >>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
154
+ >>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["target"], colors=[ndp.CustomColor("#d9d9d9")]))
155
+ >>> bars = ndp.BarChart(x="month", y=["sales"], colors=[ndp.Color.BLUE])
156
+ >>> both = plot.add_bar(shop, bars)
157
+ >>> both.show()
158
+ """
159
+ if chart is None:
160
+ chart = BarChart()
161
+
162
+ require_vertical_bars(chart, ADD_BAR_NAME)
163
+ layer = read_bar_layer(data, chart)
164
+ added_plot = self._add_layer(layer, axis, ADD_BAR_NAME)
165
+
166
+ return added_plot
167
+
168
+ @checked_arguments
169
+ def add_scatter(
170
+ self, data: Table | Array, chart: ScatterChart | None = None, axis: ValueAxis = ValueAxis.LEFT
171
+ ) -> Self:
172
+ """
173
+ Return a new Plot with points added over the charts of this one.
174
+
175
+ The points take the color of the default cycle after the ones already used, unless ``color`` or
176
+ ``color_by`` is given. Over bars or texts, their ``x`` values are placed on the labels of the Plot.
177
+
178
+ .. versionadded:: 0.1.0
179
+
180
+ Parameters
181
+ ----------
182
+ data
183
+ The Table or the Array of the points, which may differ from the one of the Plot.
184
+ chart
185
+ The columns drawn and the look of the points.
186
+ The default ``ScatterChart`` when omitted, which draws an Array: a Table needs the columns named.
187
+ axis
188
+ ``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
189
+ their own on the right.
190
+
191
+ Returns
192
+ -------
193
+ Self
194
+ A new Plot; this one is left unchanged.
195
+
196
+ Raises
197
+ ------
198
+ InvalidTypeError
199
+ When an argument is not of the type its annotation names.
200
+ RefusedSettingError
201
+ When the Plot does not draw lines, vertical bars or points.
202
+ IncompatibleChartsError
203
+ When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
204
+ or when one measures numbers and the other times of day on the same axis.
205
+ DuplicateLabelError
206
+ When a label appears twice in the ``x`` values of one chart placed on labels.
207
+ InvalidChartDataError
208
+ When a Table has no ``y`` column, or an Array has a column setting.
209
+ InvalidColorCountError
210
+ When ``color`` is given for an Array of several columns.
211
+
212
+ Examples
213
+ --------
214
+ >>> import numdaplot as ndp
215
+ >>> days = ndp.Array.from_list([1, 2, 3, 4, 5, 6])
216
+ >>> trend = ndp.Array.from_list([10.0, 12.0, 14.0, 16.0, 18.0, 20.0])
217
+ >>> measures = ndp.Array.from_list([10.5, 11.2, 14.8, 15.1, 18.9, 19.4])
218
+ >>> readings = ndp.Table.from_arrays({"day": days, "trend": trend, "measure": measures})
219
+ >>> plot = ndp.Plot.line(readings, ndp.LineChart(x="day", y=["trend"]))
220
+ >>> points = ndp.ScatterChart(x="day", y="measure")
221
+ >>> both = plot.add_scatter(readings, points)
222
+ >>> both.show()
223
+ """
224
+ if chart is None:
225
+ chart = ScatterChart()
226
+
227
+ layer = read_scatter_layer(data, chart)
228
+ added_plot = self._add_layer(layer, axis, ADD_SCATTER_NAME)
229
+
230
+ return added_plot
231
+
232
+ def _add_layer(self, layer: ChartLayer, axis: ValueAxis, method_name: str) -> Self:
233
+ """
234
+ Return a new Plot with a chart added after the ones of this one, once checked against them.
235
+
236
+ .. versionadded:: 0.1.0
237
+
238
+ Parameters
239
+ ----------
240
+ layer
241
+ The chart added and its values.
242
+ axis
243
+ The vertical axis the chart is measured on.
244
+ method_name
245
+ The method adding the chart, shown in error messages.
246
+
247
+ Returns
248
+ -------
249
+ Self
250
+ The new Plot, with the style of this one.
251
+
252
+ Raises
253
+ ------
254
+ RefusedSettingError
255
+ When the Plot does not draw lines, vertical bars or points.
256
+ IncompatibleChartsError
257
+ When the ``x`` values are not of the kind of the ones of the Plot, or when one measures numbers and the
258
+ other times of day on the same axis.
259
+ DuplicateLabelError
260
+ When a label appears twice in the ``x`` values of one chart placed on labels.
261
+ """
262
+ first_layer = self._layers[0]
263
+ require_overlay_base(first_layer, method_name)
264
+ require_same_positions(first_layer, layer)
265
+ require_same_values(self._layers, layer, axis)
266
+ axis_layer = replace(layer, value_axis=axis)
267
+ layers = [*self._layers, axis_layer]
268
+ # Aligning the charts on their labels checks them, so a wrong chart is refused when it is added.
269
+ align_layers(layers)
270
+ plot_class = type(self)
271
+ added_plot = plot_class._create(layers, self._style)
272
+
273
+ return added_plot
@@ -0,0 +1,195 @@
1
+ """
2
+ Creation of a Plot giving an overview of the values of a Table or an Array.
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.heatmap_chart import HeatmapChart
12
+ from numdaplot.plots.charts.missing_chart import MissingChart
13
+ from numdaplot.plots.charts.missing_map_chart import MissingMapChart
14
+ from numdaplot.plots.data.heatmap_values import read_heatmap_values
15
+ from numdaplot.plots.data.missing_cells import read_missing_cells, read_missing_counts
16
+ from numdaplot.plots.plot_data import PlotData
17
+ from numdaplot.plots.style.plot_style import PlotStyle
18
+ from numdaplot.settings.argument_types import checked_arguments
19
+ from numdaplot.tables.table import Table
20
+
21
+
22
+ class PlotOverviewCreation(PlotData):
23
+ """
24
+ Creation of a Plot giving an overview of the values of a Table or an Array.
25
+
26
+ Use ``ndp.Plot.heatmap``, ``ndp.Plot.missing_by_column`` and ``ndp.Plot.missing_map``.
27
+
28
+ .. versionadded:: 0.1.0
29
+ """
30
+
31
+ @classmethod
32
+ @checked_arguments
33
+ def heatmap(cls, data: Table | Array, chart: HeatmapChart | None = None, style: PlotStyle | None = None) -> Self:
34
+ """
35
+ Return a Plot coloring each value of columns of numbers along a color scale.
36
+
37
+ For a Table, ``HeatmapChart.columns`` names the columns drawn and ``HeatmapChart.labels`` the column labeling
38
+ the rows.
39
+ For an Array of one or two dimensions, each column is drawn and each row is labeled with its number.
40
+ When there are more rows or columns than the image can show, each band shows the mean of its cells, without
41
+ their values written, with a ``ReadabilityWarning``.
42
+
43
+ .. versionadded:: 0.1.0
44
+
45
+ Parameters
46
+ ----------
47
+ data
48
+ The Table or the Array drawn.
49
+ chart
50
+ The columns drawn, the row labels, the color scale and the cell values.
51
+ The default ``HeatmapChart`` when omitted, which draws an Array: a Table needs the columns named.
52
+ style
53
+ The look of the Plot, the default ``PlotStyle`` when omitted.
54
+
55
+ Returns
56
+ -------
57
+ Self
58
+ The Plot, which ``show`` displays and ``save`` writes as an image.
59
+
60
+ Raises
61
+ ------
62
+ InvalidTypeError
63
+ When an argument is not of the type its annotation names.
64
+ InvalidChartDataError
65
+ When a Table has no ``columns``, or an Array has ``columns`` or ``labels``.
66
+ ColumnNotFoundError
67
+ When a column does not exist.
68
+ IncompatibleTypesError
69
+ When ``labels`` holds booleans or durations, or a drawn column does not hold numbers.
70
+ DimensionError
71
+ When an Array has more than two dimensions.
72
+
73
+ Warns
74
+ -----
75
+ ReadabilityWarning
76
+ When the cells are merged into bands.
77
+
78
+ Examples
79
+ --------
80
+ >>> import numdaplot as ndp
81
+ >>> days = ndp.Array.from_list(["Mon", "Tue", "Wed", "Thu", "Fri"])
82
+ >>> morning = ndp.Array.from_list([12.0, 15.0, 9.0, 14.0, 20.0])
83
+ >>> noon = ndp.Array.from_list([30.0, 28.0, 25.0, 33.0, 41.0])
84
+ >>> evening = ndp.Array.from_list([18.0, 22.0, None, 19.0, 35.0])
85
+ >>> orders = ndp.Table.from_arrays({"day": days, "morning": morning, "noon": noon, "evening": evening})
86
+ >>> chart = ndp.HeatmapChart(columns=["morning", "noon", "evening"], labels="day", values=ndp.CellValues.SHOWN)
87
+ >>> style = ndp.PlotStyle(title="Orders")
88
+ >>> plot = ndp.Plot.heatmap(orders, chart, style)
89
+ >>> plot.show()
90
+ """
91
+ if chart is None:
92
+ chart = HeatmapChart()
93
+
94
+ values = read_heatmap_values(data, chart)
95
+ layer = ChartLayer(chart, values)
96
+ plot = cls._create_from_layer(layer, style)
97
+
98
+ return plot
99
+
100
+ @classmethod
101
+ @checked_arguments
102
+ def missing_by_column(cls, table: Table, chart: MissingChart | None = None, style: PlotStyle | None = None) -> Self:
103
+ """
104
+ Return a Plot drawing one bar per column of a Table, as high as its missing values.
105
+
106
+ Above each bar are its number of missing values and their share of the rows, written on one line going upwards
107
+ when the bars are too narrow, and left out when they are too narrow for that.
108
+
109
+ .. versionadded:: 0.1.0
110
+
111
+ Parameters
112
+ ----------
113
+ table
114
+ The Table whose missing values are counted.
115
+ chart
116
+ The measure, the number of missing values of each column when omitted.
117
+ style
118
+ The look of the Plot, the default ``PlotStyle`` when omitted.
119
+
120
+ Returns
121
+ -------
122
+ Self
123
+ The Plot, which ``show`` displays and ``save`` writes as an image.
124
+
125
+ Raises
126
+ ------
127
+ InvalidTypeError
128
+ When an argument is not of the type its annotation names.
129
+
130
+ Examples
131
+ --------
132
+ >>> import numdaplot as ndp
133
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Nice", "Pau", "Lyon"])
134
+ >>> prices = ndp.Array.from_list([12.0, None, None, 15.5, None])
135
+ >>> surfaces = ndp.Array.from_list([30.0, 45.0, None, 60.0, 52.0])
136
+ >>> flats = ndp.Table.from_arrays({"city": cities, "price": prices, "surface": surfaces})
137
+ >>> style = ndp.PlotStyle(title="Missing values")
138
+ >>> plot = ndp.Plot.missing_by_column(flats, style=style)
139
+ >>> plot.show()
140
+ """
141
+ if chart is None:
142
+ chart = MissingChart()
143
+
144
+ values = read_missing_counts(table, chart.measure)
145
+ layer = ChartLayer(chart, values)
146
+ plot = cls._create_from_layer(layer, style)
147
+
148
+ return plot
149
+
150
+ @classmethod
151
+ @checked_arguments
152
+ def missing_map(cls, table: Table, style: PlotStyle | None = None) -> Self:
153
+ """
154
+ Return a Plot drawing each value of a Table as a cell, light gray when present and dark when missing.
155
+
156
+ The columns are side by side and the rows go down from the first one, which shows whether the missing
157
+ values gather in some rows or columns. When there are more rows or columns than the image can show, each mark
158
+ stands for at least one missing value among the cells it covers, so no missing value is lost. The legend gives
159
+ the total of missing values.
160
+
161
+ .. versionadded:: 0.1.0
162
+
163
+ Parameters
164
+ ----------
165
+ table
166
+ The Table whose missing values are drawn.
167
+ style
168
+ The look of the Plot, the default ``PlotStyle`` when omitted.
169
+
170
+ Returns
171
+ -------
172
+ Self
173
+ The Plot, which ``show`` displays and ``save`` writes as an image.
174
+
175
+ Raises
176
+ ------
177
+ InvalidTypeError
178
+ When an argument is not of the type its annotation names.
179
+
180
+ Examples
181
+ --------
182
+ >>> import numdaplot as ndp
183
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Nice", "Pau", "Lyon", "Nice", "Paris", "Pau"])
184
+ >>> prices = ndp.Array.from_list([12.0, None, None, 15.5, None, 18.0, 11.0, 14.0])
185
+ >>> surfaces = ndp.Array.from_list([30.0, 45.0, None, 60.0, 52.0, 41.0, None, 38.0])
186
+ >>> flats = ndp.Table.from_arrays({"city": cities, "price": prices, "surface": surfaces})
187
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.OUTSIDE_RIGHT)
188
+ >>> plot = ndp.Plot.missing_map(flats, style)
189
+ >>> plot.show()
190
+ """
191
+ values = read_missing_cells(table)
192
+ layer = ChartLayer(MissingMapChart(), values)
193
+ plot = cls._create_from_layer(layer, style)
194
+
195
+ return plot