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,104 @@
1
+ """
2
+ Uniform distribution of whole numbers.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.creation.distribution import Distribution
10
+ from numdaplot.errors.invalid_bounds_error import InvalidBoundsError
11
+ from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS, Bounds
12
+ from numdaplot.settings.field_types import require_field_types
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class RandomIntegers(Distribution):
17
+ """
18
+ Whole numbers drawn with the same chance from ``low`` to ``high``.
19
+
20
+ Both bounds can be drawn by default: ``RandomIntegers(low=1, high=6)`` rolls a die.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ low
27
+ Low bound.
28
+ high
29
+ High bound.
30
+ bounds
31
+ Which bounds can be drawn. Both are included by default.
32
+
33
+ Raises
34
+ ------
35
+ InvalidTypeError
36
+ When a setting is not of the type its annotation names.
37
+ InvalidBoundsError
38
+ When no whole number lies between the bounds, such as ``low`` greater than ``high``,
39
+ or ``low=3, high=4`` with both bounds excluded.
40
+
41
+ Examples
42
+ --------
43
+ >>> import numdaplot as ndp
44
+ >>> dice = ndp.RandomIntegers(low=1, high=6)
45
+ >>> ndp.Array.random(dice, shape=ndp.Shape([5]), seed=0)
46
+ Array([6, 4, 4, 2, 2], dtype=INT64)
47
+ """
48
+
49
+ low: int
50
+ high: int
51
+ bounds: Bounds = Bounds.INCLUDED
52
+
53
+ def __post_init__(self) -> None:
54
+ """
55
+ Check that at least one whole number can be drawn.
56
+
57
+ .. versionadded:: 0.1.0
58
+
59
+ Raises
60
+ ------
61
+ InvalidTypeError
62
+ When a setting is not of the type its annotation names.
63
+ InvalidBoundsError
64
+ When no whole number lies between the bounds.
65
+ """
66
+ require_field_types(self)
67
+
68
+ lowest_value, value_limit = find_drawn_interval(self)
69
+ if lowest_value >= value_limit:
70
+ raise InvalidBoundsError(self.low, self.high)
71
+
72
+
73
+ def find_drawn_interval(distribution: RandomIntegers) -> tuple[int, int]:
74
+ """
75
+ Return the lowest value that can be drawn and the value that every drawn value stays below.
76
+
77
+ .. versionadded:: 0.1.0
78
+
79
+ Parameters
80
+ ----------
81
+ distribution
82
+ The distribution whose bounds are read.
83
+
84
+ Returns
85
+ -------
86
+ tuple[int, int]
87
+ The lowest drawable value, and the high limit excluded from the draw, as numpy expects them.
88
+
89
+ Examples
90
+ --------
91
+ >>> import numdaplot as ndp
92
+ >>> from numdaplot.arrays.creation.random_integers import find_drawn_interval
93
+ >>> find_drawn_interval(ndp.RandomIntegers(low=1, high=6))
94
+ (1, 7)
95
+ """
96
+ lowest_value = distribution.low
97
+ if distribution.bounds not in LOW_INCLUDED_BOUNDS:
98
+ lowest_value += 1
99
+
100
+ value_limit = distribution.high
101
+ if distribution.bounds in HIGH_INCLUDED_BOUNDS:
102
+ value_limit += 1
103
+
104
+ return lowest_value, value_limit
@@ -0,0 +1,97 @@
1
+ """
2
+ Values drawn from a random distribution.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from numpy.typing import NDArray
11
+
12
+ from numdaplot.arrays.creation.normal import Normal
13
+ from numdaplot.arrays.creation.random_integers import RandomIntegers, find_drawn_interval
14
+ from numdaplot.arrays.creation.uniform import Uniform
15
+ from numdaplot.arrays.shape import Shape
16
+ from numdaplot.errors.invalid_seed_error import InvalidSeedError
17
+
18
+ LOWEST_SEED = 0
19
+
20
+
21
+ def draw_random_values(distribution: Uniform | Normal | RandomIntegers, shape: Shape, seed: int | None) -> NDArray[Any]:
22
+ """
23
+ Return values drawn from a random distribution.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ distribution
30
+ The law followed by the values.
31
+ shape
32
+ The shape of the result.
33
+ seed
34
+ A number giving the same values at each call, at least 0. Different values at each call when ``None``.
35
+
36
+ Returns
37
+ -------
38
+ NDArray
39
+ Decimals for ``Uniform`` and ``Normal``, integers for ``RandomIntegers``.
40
+
41
+ Raises
42
+ ------
43
+ InvalidSeedError
44
+ When ``seed`` is lower than 0.
45
+
46
+ Examples
47
+ --------
48
+ >>> import numdaplot as ndp
49
+ >>> from numdaplot.arrays.creation.random_values import draw_random_values
50
+ >>> dice = ndp.RandomIntegers(low=1, high=6)
51
+ >>> draw_random_values(dice, ndp.Shape([4]), 0)
52
+ array([6, 4, 4, 2])
53
+ """
54
+ if seed is not None:
55
+ require_valid_seed(seed)
56
+
57
+ generator = numpy.random.default_rng(seed)
58
+ match distribution:
59
+ case Uniform():
60
+ values = generator.uniform(distribution.low, distribution.high, shape.dimensions)
61
+ case Normal():
62
+ values = generator.normal(distribution.mean, distribution.deviation, shape.dimensions)
63
+ case RandomIntegers():
64
+ lowest_value, value_limit = find_drawn_interval(distribution)
65
+ values = generator.integers(lowest_value, value_limit, shape.dimensions)
66
+
67
+ return values
68
+
69
+
70
+ def require_valid_seed(seed: int) -> None:
71
+ """
72
+ Check that a random seed is not negative.
73
+
74
+ .. versionadded:: 0.1.0
75
+
76
+ Parameters
77
+ ----------
78
+ seed
79
+ The seed to check.
80
+
81
+ Raises
82
+ ------
83
+ InvalidSeedError
84
+ When ``seed`` is lower than 0.
85
+
86
+ Examples
87
+ --------
88
+ >>> import numdaplot as ndp
89
+ >>> from numdaplot.arrays.creation.random_values import require_valid_seed
90
+ >>> try:
91
+ ... require_valid_seed(-1)
92
+ ... except ndp.InvalidSeedError as error:
93
+ ... print(error)
94
+ Expected a seed of at least 0, got -1.
95
+ """
96
+ if seed < LOWEST_SEED:
97
+ raise InvalidSeedError(seed)
@@ -0,0 +1,73 @@
1
+ """
2
+ Numbers of a regular sequence.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import math
8
+ from typing import Any
9
+
10
+ import numpy
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.positions.range import Range
14
+ from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
15
+
16
+ # Decimal steps accumulate rounding errors: 0.1 * 10 gives 0.9999999999999999, not 1.
17
+ STEP_TOLERANCE = 1e-9
18
+
19
+
20
+ def compute_range_values(sequence: Range) -> NDArray[Any]:
21
+ """
22
+ Return the numbers of a regular sequence.
23
+
24
+ A stop reached within a tiny fraction of a step counts as reached, so ``Range(0, 1, 0.1)``
25
+ ends with exactly 1.0 when the stop is included.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ sequence
32
+ The sequence. ``LOW_ONLY`` keeps its start and drops its stop, ``HIGH_ONLY`` the opposite.
33
+
34
+ Returns
35
+ -------
36
+ NDArray
37
+ Integers when the start and the step are integers, decimals otherwise.
38
+ Empty when the excluded bounds leave no number, such as from 1 to 1 with ``Bounds.EXCLUDED``.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> from numdaplot.arrays.creation.range_values import compute_range_values
44
+ >>> compute_range_values(ndp.Range(start=0, stop=10, step=5))
45
+ array([ 0, 5, 10])
46
+ """
47
+ distance = sequence.stop - sequence.start
48
+ step_count = distance / sequence.step
49
+ nearest_step_count = round(step_count)
50
+ step_count_error = abs(step_count - nearest_step_count)
51
+ reaches_stop = step_count_error <= STEP_TOLERANCE
52
+ tolerated_step_count = step_count + STEP_TOLERANCE
53
+
54
+ first_index = 0
55
+ if sequence.bounds not in LOW_INCLUDED_BOUNDS:
56
+ first_index = 1
57
+
58
+ last_index = math.floor(tolerated_step_count)
59
+ includes_stop = sequence.bounds in HIGH_INCLUDED_BOUNDS
60
+ drops_reached_stop = reaches_stop and not includes_stop
61
+ if drops_reached_stop:
62
+ last_index -= 1
63
+
64
+ index_limit = last_index + 1
65
+ indexes = numpy.arange(first_index, index_limit)
66
+ offsets = indexes * sequence.step
67
+ values = sequence.start + offsets
68
+ has_values = indexes.size > 0
69
+ ends_on_stop = reaches_stop and includes_stop and has_values
70
+ if ends_on_stop:
71
+ values[-1] = sequence.stop
72
+
73
+ return values
@@ -0,0 +1,84 @@
1
+ """
2
+ A given count of evenly spaced numbers between two bounds.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_count_error import InvalidCountError
10
+ from numdaplot.rules.bounds import Bounds
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ LOWEST_COUNT_WITH_BOTH_BOUNDS = 2
14
+ LOWEST_COUNT = 1
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Spacing:
19
+ """
20
+ A given count of evenly spaced numbers from ``start`` to ``stop``, used by ``Array.from_spacing``.
21
+
22
+ ``bounds`` tells whether ``start`` and ``stop`` are among the values. With ``start=0``,
23
+ ``stop=1`` and ``count=4``:
24
+
25
+ - ``INCLUDED`` gives 0, 0.333, 0.667, 1;
26
+ - ``LOW_ONLY`` gives 0, 0.25, 0.5, 0.75;
27
+ - ``HIGH_ONLY`` gives 0.25, 0.5, 0.75, 1;
28
+ - ``EXCLUDED`` gives 0.2, 0.4, 0.6, 0.8.
29
+
30
+ .. versionadded:: 0.1.0
31
+
32
+ Parameters
33
+ ----------
34
+ start
35
+ First bound.
36
+ stop
37
+ Second bound, lower than ``start`` for decreasing values.
38
+ count
39
+ Number of values, at least 2 when both bounds are included, at least 1 otherwise.
40
+ bounds
41
+ Which bounds are among the values. Both are included by default.
42
+
43
+ Raises
44
+ ------
45
+ InvalidTypeError
46
+ When a setting is not of the type its annotation names.
47
+ InvalidCountError
48
+ When ``count`` is too low for the bounds.
49
+
50
+ Examples
51
+ --------
52
+ >>> import numdaplot as ndp
53
+ >>> ndp.Array.from_spacing(ndp.Spacing(start=0, stop=1, count=5))
54
+ Array([0. , 0.25, 0.5 , 0.75, 1. ], dtype=FLOAT64)
55
+ >>> ndp.Array.from_spacing(ndp.Spacing(start=0, stop=1, count=4, bounds=ndp.Bounds.EXCLUDED))
56
+ Array([0.2, 0.4, 0.6, 0.8], dtype=FLOAT64)
57
+ """
58
+
59
+ start: float
60
+ stop: float
61
+ count: int
62
+ bounds: Bounds = Bounds.INCLUDED
63
+
64
+ def __post_init__(self) -> None:
65
+ """
66
+ Check that the count is high enough for the bounds.
67
+
68
+ .. versionadded:: 0.1.0
69
+
70
+ Raises
71
+ ------
72
+ InvalidTypeError
73
+ When a setting is not of the type its annotation names.
74
+ InvalidCountError
75
+ When ``count`` is too low for the bounds.
76
+ """
77
+ require_field_types(self)
78
+
79
+ lowest_count = LOWEST_COUNT
80
+ if self.bounds == Bounds.INCLUDED:
81
+ lowest_count = LOWEST_COUNT_WITH_BOTH_BOUNDS
82
+
83
+ if self.count < lowest_count:
84
+ raise InvalidCountError(self.count, lowest_count)
@@ -0,0 +1,63 @@
1
+ """
2
+ Evenly spaced numbers.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from numpy.typing import NDArray
11
+
12
+ from numdaplot.arrays.creation.spacing import Spacing
13
+ from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
14
+
15
+
16
+ def compute_spacing_values(spacing: Spacing) -> NDArray[Any]:
17
+ """
18
+ Return the evenly spaced numbers of a spacing.
19
+
20
+ The interval is cut into equal gaps: one fewer than the count when both bounds are kept,
21
+ one more when both are dropped.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ spacing
28
+ The spacing.
29
+
30
+ Returns
31
+ -------
32
+ NDArray
33
+ ``count`` decimals. An included stop is exactly ``stop``.
34
+
35
+ Examples
36
+ --------
37
+ >>> import numdaplot as ndp
38
+ >>> from numdaplot.arrays.creation.spacing_values import compute_spacing_values
39
+ >>> compute_spacing_values(ndp.Spacing(start=0, stop=1, count=4, bounds=ndp.Bounds.LOW_ONLY))
40
+ array([0. , 0.25, 0.5 , 0.75])
41
+ """
42
+ includes_start = spacing.bounds in LOW_INCLUDED_BOUNDS
43
+ includes_stop = spacing.bounds in HIGH_INCLUDED_BOUNDS
44
+
45
+ gap_count = spacing.count + 1
46
+ first_offset = 1
47
+ if includes_start:
48
+ gap_count -= 1
49
+ first_offset = 0
50
+
51
+ if includes_stop:
52
+ gap_count -= 1
53
+
54
+ distance = spacing.stop - spacing.start
55
+ gap = distance / gap_count
56
+ offset_limit = first_offset + spacing.count
57
+ offsets = numpy.arange(first_offset, offset_limit)
58
+ distances = offsets * gap
59
+ values = spacing.start + distances
60
+ if includes_stop:
61
+ values[-1] = spacing.stop
62
+
63
+ return values
@@ -0,0 +1,63 @@
1
+ """
2
+ Uniform distribution of decimals.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.creation.distribution import Distribution
10
+ from numdaplot.errors.invalid_bounds_error import InvalidBoundsError
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class Uniform(Distribution):
16
+ """
17
+ Decimals drawn with the same chance anywhere from ``low`` to ``high``.
18
+
19
+ ``high`` itself is never drawn, as in numpy. Use ``RandomIntegers`` for whole numbers.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ low
26
+ Lowest value that can be drawn.
27
+ high
28
+ Value that every drawn value stays below, greater than or equal to ``low``.
29
+
30
+ Raises
31
+ ------
32
+ InvalidTypeError
33
+ When a setting is not of the type its annotation names.
34
+ InvalidBoundsError
35
+ When ``low`` is greater than ``high``.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> ndp.Array.random(ndp.Uniform(low=0, high=1), shape=ndp.Shape([3]), seed=0)
41
+ Array([0.63696169, 0.26978671, 0.04097352], dtype=FLOAT64)
42
+ """
43
+
44
+ low: float
45
+ high: float
46
+
47
+ def __post_init__(self) -> None:
48
+ """
49
+ Check that the low bound is not greater than the high bound.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Raises
54
+ ------
55
+ InvalidTypeError
56
+ When a setting is not of the type its annotation names.
57
+ InvalidBoundsError
58
+ When ``low`` is greater than ``high``.
59
+ """
60
+ require_field_types(self)
61
+
62
+ if self.low > self.high:
63
+ raise InvalidBoundsError(self.low, self.high)
@@ -0,0 +1,68 @@
1
+ """
2
+ Settings of the comparison of two Arrays or two Tables.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass
10
+ from typing import TYPE_CHECKING
11
+
12
+ from numdaplot.arrays.type_match import TypeMatch
13
+ from numdaplot.settings.field_types import require_field_types
14
+
15
+ if TYPE_CHECKING:
16
+ from numdaplot.arrays.array import Array
17
+ from numdaplot.tables.table import Table
18
+
19
+
20
+ # eq=False because comparing two settings would compare their Arrays or Tables with ==, which they refuse.
21
+ @dataclass(frozen=True, eq=False)
22
+ class Equality:
23
+ """
24
+ Settings of the comparison of two Arrays or two Tables, used by ``Array.is_equal`` and ``Table.is_equal``.
25
+
26
+ Two Arrays are equal when they have the same shape and the same values at each position.
27
+ Two Tables are equal when they have the same columns, in the same order, with the same values.
28
+ Two missing values at the same position are equal.
29
+
30
+ .. versionadded:: 0.1.0
31
+
32
+ Parameters
33
+ ----------
34
+ other
35
+ The Array or the Table to compare with, of the same kind as the compared one.
36
+ types
37
+ Whether the types must also be the same. Only the values are compared by default.
38
+
39
+
40
+ Raises
41
+ ------
42
+ InvalidTypeError
43
+ When a setting is not of the type its annotation names.
44
+
45
+ Examples
46
+ --------
47
+ >>> import numdaplot as ndp
48
+ >>> integers = ndp.Array.from_list([1, 2])
49
+ >>> decimals = ndp.Array.from_list([1.0, 2.0])
50
+ >>> integers.is_equal(ndp.Equality(other=decimals, types=ndp.TypeMatch.STRICT))
51
+ False
52
+ """
53
+
54
+ other: Array | Table
55
+ types: TypeMatch = TypeMatch.IGNORED
56
+
57
+ def __post_init__(self) -> None:
58
+ """
59
+ Check the type of every setting.
60
+
61
+ .. versionadded:: 0.1.0
62
+
63
+ Raises
64
+ ------
65
+ InvalidTypeError
66
+ When a setting is not of the type its annotation names.
67
+ """
68
+ require_field_types(self)
@@ -0,0 +1,5 @@
1
+ """
2
+ Sorting and deduplication of Array values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,113 @@
1
+ """
2
+ Sorting of the values of an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from numpy.typing import NDArray
11
+
12
+ from numdaplot.arrays.array_sorting import ArraySorting
13
+ from numdaplot.arrays.axis_number import find_numpy_axis
14
+ from numdaplot.arrays.selection.missing_mask import find_missing
15
+ from numdaplot.ordering.missing_position import MissingPosition
16
+ from numdaplot.ordering.order import Order
17
+ from numdaplot.positions.axis import Axis
18
+
19
+ LAST_AXIS = -1
20
+
21
+
22
+ def sort_values(values: NDArray[Any], sorting: ArraySorting, axis: Axis | None) -> NDArray[Any]:
23
+ """
24
+ Return the values sorted inside each row, or inside each column.
25
+
26
+ .. versionadded:: 0.1.0
27
+
28
+ Parameters
29
+ ----------
30
+ values
31
+ The values of an Array.
32
+ sorting
33
+ The order and the place of missing values.
34
+ axis
35
+ ``EACH_ROW`` or ``EACH_COLUMN`` for a two-dimensional Array, or None to sort each row.
36
+
37
+ Returns
38
+ -------
39
+ NDArray
40
+ The sorted values, of the same shape.
41
+
42
+ Raises
43
+ ------
44
+ DimensionError
45
+ When an axis is given for an Array that is not two-dimensional.
46
+
47
+ Examples
48
+ --------
49
+ >>> import numpy
50
+ >>> import numdaplot as ndp
51
+ >>> from numdaplot.arrays.layout.sorting_values import sort_values
52
+ >>> sort_values(numpy.array([[3, 1], [2, 4]]), ndp.ArraySorting(), ndp.Axis.EACH_COLUMN)
53
+ array([[2, 1],
54
+ [3, 4]])
55
+ """
56
+ numpy_axis = find_numpy_axis(axis, values.ndim)
57
+ if numpy_axis is None:
58
+ numpy_axis = LAST_AXIS
59
+
60
+ moved_values = numpy.moveaxis(values, numpy_axis, LAST_AXIS)
61
+ slice_size = moved_values.shape[LAST_AXIS]
62
+ slices = moved_values.reshape(LAST_AXIS, slice_size)
63
+ sorted_slices = numpy.empty_like(slices)
64
+ for i, values_slice in enumerate(slices):
65
+ sorted_slices[i] = sort_slice(values_slice, sorting)
66
+
67
+ sorted_moved_values = sorted_slices.reshape(moved_values.shape)
68
+ sorted_values = numpy.moveaxis(sorted_moved_values, LAST_AXIS, numpy_axis)
69
+
70
+ return sorted_values
71
+
72
+
73
+ def sort_slice(values: NDArray[Any], sorting: ArraySorting) -> NDArray[Any]:
74
+ """
75
+ Return one-dimensional values sorted, with their missing values first or last.
76
+
77
+ .. versionadded:: 0.1.0
78
+
79
+ Parameters
80
+ ----------
81
+ values
82
+ One-dimensional values.
83
+ sorting
84
+ The order and the place of missing values.
85
+
86
+ Returns
87
+ -------
88
+ NDArray
89
+ The sorted values.
90
+
91
+ Examples
92
+ --------
93
+ >>> import numpy
94
+ >>> import numdaplot as ndp
95
+ >>> from numdaplot.arrays.layout.sorting_values import sort_slice
96
+ >>> sort_slice(numpy.array([1.0, numpy.nan, 3.0]), ndp.ArraySorting(order=ndp.Order.DESCENDING))
97
+ array([ 3., 1., nan])
98
+ """
99
+ missing = find_missing(values)
100
+ present = ~missing
101
+ present_values = values[present]
102
+ missing_values = values[missing]
103
+ ordered_values = numpy.sort(present_values)
104
+ if sorting.order == Order.DESCENDING:
105
+ ordered_values = ordered_values[::-1]
106
+
107
+ parts = [ordered_values, missing_values]
108
+ if sorting.missing == MissingPosition.FIRST:
109
+ parts = [missing_values, ordered_values]
110
+
111
+ sorted_values = numpy.concatenate(parts)
112
+
113
+ return sorted_values