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,83 @@
1
+ """
2
+ Kinds of values a chart places along its ``x`` axis.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class PositionKind(Enum):
11
+ """
12
+ Kinds of values a chart places along its ``x`` axis, each drawn with its own kind of axis.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> from numdaplot.plots.data.array_values import read_array_values
20
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
21
+ >>> read_array_values(prices, "LineChart").positions.kind
22
+ <PositionKind.NUMBERS: 1>
23
+ """
24
+
25
+ NUMBERS = auto()
26
+ """
27
+ Numbers, placed on a numbered axis.
28
+
29
+ Examples
30
+ --------
31
+ >>> import numdaplot as ndp
32
+ >>> from numdaplot.plots.data.array_values import read_array_values
33
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
34
+ >>> read_array_values(prices, "LineChart").positions.kind
35
+ <PositionKind.NUMBERS: 1>
36
+ """
37
+
38
+ MOMENTS = auto()
39
+ """
40
+ Dates or datetimes, placed on a time axis.
41
+
42
+ Examples
43
+ --------
44
+ >>> from datetime import date
45
+ >>> import numdaplot as ndp
46
+ >>> from numdaplot.plots.data.table_values import read_table_values
47
+ >>> days = ndp.Array.from_list([date(2026, 1, 1), date(2026, 1, 2)])
48
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
49
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
50
+ >>> read_table_values(sales, "day", ["price"], "LineChart").positions.kind
51
+ <PositionKind.MOMENTS: 2>
52
+ """
53
+
54
+ TEXTS = auto()
55
+ """
56
+ Texts, each placed at its own position labeled with it.
57
+
58
+ Examples
59
+ --------
60
+ >>> import numdaplot as ndp
61
+ >>> from numdaplot.plots.data.table_values import read_table_values
62
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
63
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
64
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
65
+ >>> read_table_values(sales, "city", ["price"], "LineChart").positions.kind
66
+ <PositionKind.TEXTS: 3>
67
+ """
68
+
69
+ TIMES = auto()
70
+ """
71
+ Times of day, placed on an axis of one day labeled ``HH:MM``.
72
+
73
+ Examples
74
+ --------
75
+ >>> from datetime import time
76
+ >>> import numdaplot as ndp
77
+ >>> from numdaplot.plots.data.table_values import read_table_values
78
+ >>> hours = ndp.Array.from_list([time(8), time(17, 30)])
79
+ >>> counts = ndp.Array.from_list([12.0, 15.5])
80
+ >>> traffic = ndp.Table.from_arrays({"hour": hours, "count": counts})
81
+ >>> read_table_values(traffic, "hour", ["count"], "LineChart").positions.kind
82
+ <PositionKind.TIMES: 4>
83
+ """
@@ -0,0 +1,340 @@
1
+ """
2
+ Charts of a Plot with their columns shown under new names.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import dataclasses
8
+ from typing import cast
9
+
10
+ import numpy
11
+
12
+ from numdaplot.plots.chart_layer import ChartLayer
13
+ from numdaplot.plots.data.chart_values import ChartValues, Series
14
+ from numdaplot.plots.data.missing_cells import MissingCounts
15
+ from numdaplot.plots.data.point_values import PointValues
16
+ from numdaplot.plots.data.sample_values import SampleValues
17
+ from numdaplot.plots.data.table_values import name_columns
18
+ from numdaplot.tables.columns.renaming import Renaming
19
+
20
+
21
+ def rename_layers(layers: list[ChartLayer], renaming: Renaming | None) -> list[ChartLayer]:
22
+ """
23
+ Return the charts of a Plot with their columns shown under their new names.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ layers
30
+ Every chart of the Plot.
31
+ renaming
32
+ The names under which some columns are shown, or None to keep every name.
33
+
34
+ Returns
35
+ -------
36
+ list[ChartLayer]
37
+ New charts whose names, and the default labels built from them, are the shown names.
38
+
39
+ Examples
40
+ --------
41
+ >>> import numdaplot as ndp
42
+ >>> from numdaplot.plots.chart_layer import ChartLayer
43
+ >>> from numdaplot.plots.data.array_values import read_array_values
44
+ >>> from numdaplot.plots.data.renamed_layers import rename_layers
45
+ >>> grid = ndp.Array.from_list([[12.0, 8.0]])
46
+ >>> layer = ChartLayer(ndp.LineChart(), read_array_values(grid, "LineChart"))
47
+ >>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="0", new_name="Paris")])
48
+ >>> [series.name for series in rename_layers([layer], renaming)[0].values.series]
49
+ ['Paris', '1']
50
+ """
51
+ if renaming is None:
52
+ return layers
53
+
54
+ new_names = {change.old_name: change.new_name for change in renaming.changes}
55
+ renamed_layers = list[ChartLayer]()
56
+ for layer in layers:
57
+ renamed_layer = rename_layer(layer, new_names)
58
+ renamed_layers.append(renamed_layer)
59
+
60
+ return renamed_layers
61
+
62
+
63
+ def rename_layer(layer: ChartLayer, new_names: dict[str, str]) -> ChartLayer:
64
+ """
65
+ Return one chart with its columns shown under their new names.
66
+
67
+ .. versionadded:: 0.1.0
68
+
69
+ Parameters
70
+ ----------
71
+ layer
72
+ A chart and its values.
73
+ new_names
74
+ The new name of each renamed column.
75
+
76
+ Returns
77
+ -------
78
+ ChartLayer
79
+ A new chart, with renamed values and points.
80
+
81
+ Examples
82
+ --------
83
+ >>> import numdaplot as ndp
84
+ >>> from numdaplot.plots.chart_layer import ChartLayer
85
+ >>> from numdaplot.plots.data.array_values import read_array_values
86
+ >>> from numdaplot.plots.data.renamed_layers import rename_layer
87
+ >>> layer = ChartLayer(ndp.LineChart(), read_array_values(ndp.Array.from_list([12.0]), "LineChart"))
88
+ >>> rename_layer(layer, {"0": "Paris"}).values.series[0].name
89
+ 'Paris'
90
+ """
91
+ renamed_values = rename_values(layer.values, new_names)
92
+ renamed_points = layer.points
93
+ if layer.points is not None:
94
+ renamed_points = rename_points(layer.points, new_names)
95
+
96
+ renamed_layer = dataclasses.replace(layer, values=renamed_values, points=renamed_points)
97
+
98
+ return renamed_layer
99
+
100
+
101
+ def rename_values(values: ChartValues | SampleValues, new_names: dict[str, str]) -> ChartValues | SampleValues:
102
+ """
103
+ Return the values of one chart with their columns shown under their new names.
104
+
105
+ The label of the axis of the values follows when it names the drawn columns.
106
+
107
+ .. versionadded:: 0.1.0
108
+
109
+ Parameters
110
+ ----------
111
+ values
112
+ The values of a chart.
113
+ new_names
114
+ The new name of each renamed column.
115
+
116
+ Returns
117
+ -------
118
+ ChartValues or SampleValues
119
+ New values of the same kind.
120
+
121
+ Examples
122
+ --------
123
+ >>> import numdaplot as ndp
124
+ >>> from numdaplot.plots.data.table_values import read_table_values
125
+ >>> from numdaplot.plots.data.renamed_layers import rename_values
126
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
127
+ >>> sales = ndp.Table.from_arrays({"price": prices})
128
+ >>> rename_values(read_table_values(sales, None, ["price"], "LineChart"), {"price": "Price"}).value_name
129
+ 'Price'
130
+ """
131
+ if isinstance(values, MissingCounts):
132
+ renamed_counts = rename_missing_counts(values, new_names)
133
+ return renamed_counts
134
+
135
+ renamed_series = rename_series(values.series, new_names)
136
+ renamed_value_name = rename_value_name(values, renamed_series)
137
+ if isinstance(values, SampleValues):
138
+ renamed_group_name = rename_optional(values.group_name, new_names)
139
+ renamed_samples = dataclasses.replace(
140
+ values, series=renamed_series, group_name=renamed_group_name, value_name=renamed_value_name
141
+ )
142
+ return renamed_samples
143
+
144
+ renamed_position_name = rename_optional(values.positions.name, new_names)
145
+ renamed_positions = dataclasses.replace(values.positions, name=renamed_position_name)
146
+ renamed_chart_values = dataclasses.replace(
147
+ values, positions=renamed_positions, series=renamed_series, value_name=renamed_value_name
148
+ )
149
+
150
+ return renamed_chart_values
151
+
152
+
153
+ def rename_missing_counts(counts: MissingCounts, new_names: dict[str, str]) -> MissingCounts:
154
+ """
155
+ Return the counts of a missing value chart with its columns shown under their new names.
156
+
157
+ .. versionadded:: 0.1.0
158
+
159
+ Parameters
160
+ ----------
161
+ counts
162
+ The counts, one position per column of the Table.
163
+ new_names
164
+ The new name of each renamed column.
165
+
166
+ Returns
167
+ -------
168
+ MissingCounts
169
+ New counts whose positions are the shown names.
170
+
171
+ Examples
172
+ --------
173
+ >>> import numdaplot as ndp
174
+ >>> from numdaplot.plots.data.missing_cells import read_missing_counts
175
+ >>> from numdaplot.plots.data.renamed_layers import rename_missing_counts
176
+ >>> flats = ndp.Table.from_arrays({"price": ndp.Array.from_list([12.0, None])})
177
+ >>> counts = read_missing_counts(flats, ndp.Measure.COUNT)
178
+ >>> rename_missing_counts(counts, {"price": "Price"}).positions.values.tolist()
179
+ ['Price']
180
+ """
181
+ raw_columns = counts.positions.values.tolist()
182
+ column_names = cast(list[str], raw_columns)
183
+ shown_names = list[str]()
184
+ for column_name in column_names:
185
+ shown_name = new_names.get(column_name, column_name)
186
+ shown_names.append(shown_name)
187
+
188
+ position_dtype = counts.positions.values.dtype
189
+ shown_values = numpy.array(shown_names, dtype=position_dtype)
190
+ renamed_positions = dataclasses.replace(counts.positions, values=shown_values)
191
+ renamed_counts = dataclasses.replace(counts, positions=renamed_positions)
192
+
193
+ return renamed_counts
194
+
195
+
196
+ def rename_series(series: list[Series], new_names: dict[str, str]) -> list[Series]:
197
+ """
198
+ Return series named after the shown names of their columns.
199
+
200
+ .. versionadded:: 0.1.0
201
+
202
+ Parameters
203
+ ----------
204
+ series
205
+ The series of a chart.
206
+ new_names
207
+ The new name of each renamed column.
208
+
209
+ Returns
210
+ -------
211
+ list[Series]
212
+ New series with the same numbers.
213
+
214
+ Examples
215
+ --------
216
+ >>> import numpy
217
+ >>> from numdaplot.plots.data.chart_values import Series
218
+ >>> from numdaplot.plots.data.renamed_layers import rename_series
219
+ >>> rename_series([Series("price", numpy.array([12.0]))], {"price": "Price"})[0].name
220
+ 'Price'
221
+ """
222
+ renamed_series = list[Series]()
223
+ for one_series in series:
224
+ shown_name = new_names.get(one_series.name, one_series.name)
225
+ shown_series = dataclasses.replace(one_series, name=shown_name)
226
+ renamed_series.append(shown_series)
227
+
228
+ return renamed_series
229
+
230
+
231
+ def rename_value_name(values: ChartValues | SampleValues, renamed_series: list[Series]) -> str | None:
232
+ """
233
+ Return the label of the axis of the values, following the series when it names them.
234
+
235
+ .. versionadded:: 0.1.0
236
+
237
+ Parameters
238
+ ----------
239
+ values
240
+ The values of a chart, with their series under their column names.
241
+ renamed_series
242
+ The same series under their shown names.
243
+
244
+ Returns
245
+ -------
246
+ str or None
247
+ The names of the renamed series when the label names the series, the label unchanged otherwise, such as
248
+ ``"value"`` for an Array.
249
+
250
+ Examples
251
+ --------
252
+ >>> import numdaplot as ndp
253
+ >>> from numdaplot.plots.data.table_values import read_table_values
254
+ >>> from numdaplot.plots.data.renamed_layers import rename_series, rename_value_name
255
+ >>> prices = ndp.Array.from_list([12.0])
256
+ >>> costs = ndp.Array.from_list([8.0])
257
+ >>> sales = ndp.Table.from_arrays({"price": prices, "cost": costs})
258
+ >>> values = read_table_values(sales, None, ["price", "cost"], "LineChart")
259
+ >>> rename_value_name(values, rename_series(values.series, {"cost": "Cost"}))
260
+ 'price, Cost'
261
+ """
262
+ if values.value_name is None:
263
+ return None
264
+
265
+ column_names = [one_series.name for one_series in values.series]
266
+ shown_names = [one_series.name for one_series in renamed_series]
267
+ if column_names == []:
268
+ return values.value_name
269
+
270
+ column_label = name_columns(column_names)
271
+ if values.value_name != column_label:
272
+ return values.value_name
273
+
274
+ shown_label = name_columns(shown_names)
275
+
276
+ return shown_label
277
+
278
+
279
+ def rename_points(points: PointValues, new_names: dict[str, str]) -> PointValues:
280
+ """
281
+ Return the colors and the sizes of points with their columns shown under their new names.
282
+
283
+ .. versionadded:: 0.1.0
284
+
285
+ Parameters
286
+ ----------
287
+ points
288
+ The colors and the sizes of a scatter chart.
289
+ new_names
290
+ The new name of each renamed column.
291
+
292
+ Returns
293
+ -------
294
+ PointValues
295
+ New points with the same colors and sizes.
296
+
297
+ Examples
298
+ --------
299
+ >>> from numdaplot.plots.data.point_values import PointValues
300
+ >>> from numdaplot.plots.data.renamed_layers import rename_points
301
+ >>> rename_points(PointValues("zone", None, None, None), {"zone": "Zone"}).color_name
302
+ 'Zone'
303
+ """
304
+ color_name = rename_optional(points.color_name, new_names)
305
+ size_name = rename_optional(points.size_name, new_names)
306
+ renamed_points = dataclasses.replace(points, color_name=color_name, size_name=size_name)
307
+
308
+ return renamed_points
309
+
310
+
311
+ def rename_optional(name: str | None, new_names: dict[str, str]) -> str | None:
312
+ """
313
+ Return the shown name of a column, when there is a column.
314
+
315
+ .. versionadded:: 0.1.0
316
+
317
+ Parameters
318
+ ----------
319
+ name
320
+ A column name, or None.
321
+ new_names
322
+ The new name of each renamed column.
323
+
324
+ Returns
325
+ -------
326
+ str or None
327
+ The new name, the name itself when it is not renamed, or None.
328
+
329
+ Examples
330
+ --------
331
+ >>> from numdaplot.plots.data.renamed_layers import rename_optional
332
+ >>> rename_optional("day", {"day": "Day"}), rename_optional("hour", {"day": "Day"}), rename_optional(None, {})
333
+ ('Day', 'hour', None)
334
+ """
335
+ if name is None:
336
+ return None
337
+
338
+ shown_name = new_names.get(name, name)
339
+
340
+ return shown_name
@@ -0,0 +1,160 @@
1
+ """
2
+ Values a histogram or a box chart sums up, read from a Table or an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Any
9
+
10
+ import numpy
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.arrays.array import Array
14
+ from numdaplot.data_types.type import Type
15
+ from numdaplot.plots.data.array_values import read_array_values
16
+ from numdaplot.plots.data.chart_data import require_column_setting, require_no_column_settings
17
+ from numdaplot.plots.data.chart_values import Series
18
+ from numdaplot.plots.data.column_reading import read_texts
19
+ from numdaplot.plots.data.table_values import name_columns, read_series
20
+ from numdaplot.tables.columns.column_names import require_known_columns
21
+ from numdaplot.tables.table import Table
22
+ from numdaplot.tables.table_data import read_stored_frame
23
+
24
+ COLUMNS_SETTING = "columns"
25
+ GROUP_SETTING = "group_by"
26
+
27
+
28
+ @dataclass(frozen=True, eq=False)
29
+ class SampleValues:
30
+ """
31
+ The columns of numbers or times of day a histogram or a box chart sums up, and the groups splitting their rows.
32
+
33
+ .. versionadded:: 0.1.0
34
+
35
+ Parameters
36
+ ----------
37
+ series
38
+ One series per column, NaN where a value is missing, a time of day being its hours since midnight.
39
+ groups
40
+ The group of each row, None where it is missing, or None without ``group_by``.
41
+ group_name
42
+ The ``group_by`` column, or None.
43
+ value_name
44
+ The default label of the axis of the values: the name of the single column of a Table, None otherwise.
45
+ value_type
46
+ The type of the first series, of the family of every series: numbers or times of day.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numpy
51
+ >>> import numdaplot as ndp
52
+ >>> from numdaplot.plots.data.chart_values import Series
53
+ >>> from numdaplot.plots.data.sample_values import SampleValues
54
+ >>> SampleValues([Series("price", numpy.array([12.0]))], None, None, "price", ndp.Type.FLOAT64).value_name
55
+ 'price'
56
+ """
57
+
58
+ series: list[Series]
59
+ groups: NDArray[Any] | None
60
+ group_name: str | None
61
+ value_name: str | None
62
+ value_type: Type
63
+
64
+
65
+ def read_sample_values(
66
+ data: Table | Array, column_names: list[str] | None, group_name: str | None, chart_name: str
67
+ ) -> SampleValues:
68
+ """
69
+ Return the columns a histogram or a box chart sums up, and their groups.
70
+
71
+ .. versionadded:: 0.1.0
72
+
73
+ Parameters
74
+ ----------
75
+ data
76
+ The Table or the Array drawn.
77
+ column_names
78
+ The columns of a Table, None for an Array, whose columns are all read.
79
+ group_name
80
+ The ``group_by`` column of a Table, holding texts, booleans or times of day, or None.
81
+ chart_name
82
+ Name of the chart class, shown in error messages.
83
+
84
+ Returns
85
+ -------
86
+ SampleValues
87
+ One series per column, and the group of each row.
88
+
89
+ Raises
90
+ ------
91
+ InvalidChartDataError
92
+ When a Table has no columns, or an Array has columns or ``group_by``.
93
+ ColumnNotFoundError
94
+ When a column does not exist.
95
+ IncompatibleTypesError
96
+ When a column holds neither numbers nor times of day, the columns mix them, or ``group_by`` holds
97
+ neither texts, booleans nor times of day.
98
+ DimensionError
99
+ When an Array has more than two dimensions.
100
+
101
+ Examples
102
+ --------
103
+ >>> import numdaplot as ndp
104
+ >>> from numdaplot.plots.data.sample_values import read_sample_values
105
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
106
+ >>> prices = ndp.Array.from_list([12.0, 9.5])
107
+ >>> flats = ndp.Table.from_arrays({"city": cities, "price": prices})
108
+ >>> read_sample_values(flats, ["price"], "city", "BoxChart").groups
109
+ array(['Paris', 'Lyon'], dtype=object)
110
+ """
111
+ if isinstance(data, Array):
112
+ column_settings = dict[str, object]({COLUMNS_SETTING: column_names, GROUP_SETTING: group_name})
113
+ require_no_column_settings(chart_name, column_settings)
114
+ array_values = read_array_values(data, chart_name)
115
+ array_samples = SampleValues(array_values.series, None, None, array_values.value_name, array_values.value_type)
116
+ return array_samples
117
+
118
+ required_names = require_column_setting(chart_name, COLUMNS_SETTING, column_names)
119
+ frame = read_stored_frame(data)
120
+ known_names = frame.columns.tolist()
121
+ require_known_columns(required_names, known_names)
122
+ series, value_type = read_series(frame, required_names, chart_name)
123
+ value_name = name_columns(required_names)
124
+ groups = None
125
+ if group_name is not None:
126
+ require_known_columns([group_name], known_names)
127
+ groups = read_texts(frame[group_name], chart_name)
128
+
129
+ table_samples = SampleValues(series, groups, group_name, value_name, value_type)
130
+
131
+ return table_samples
132
+
133
+
134
+ def drop_missing_numbers(numbers: NDArray[numpy.float64]) -> NDArray[numpy.float64]:
135
+ """
136
+ Return the numbers that are present, in their order.
137
+
138
+ .. versionadded:: 0.1.0
139
+
140
+ Parameters
141
+ ----------
142
+ numbers
143
+ Numbers, NaN where a value is missing.
144
+
145
+ Returns
146
+ -------
147
+ NDArray[numpy.float64]
148
+ The numbers without NaN.
149
+
150
+ Examples
151
+ --------
152
+ >>> import numpy
153
+ >>> from numdaplot.plots.data.sample_values import drop_missing_numbers
154
+ >>> drop_missing_numbers(numpy.array([3.0, numpy.nan, 1.0]))
155
+ array([3., 1.])
156
+ """
157
+ present = ~numpy.isnan(numbers)
158
+ present_numbers = numbers[present]
159
+
160
+ return present_numbers