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,54 @@
1
+ """
2
+ Transformation of each value of an Array with a numpy function of one operand.
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.operations.operand import find_operand_type_names
13
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
14
+
15
+
16
+ def transform_values(values: NDArray[Any], function: numpy.ufunc, name: str) -> NDArray[Any]:
17
+ """
18
+ Return the result of a numpy function applied to each value.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ values
25
+ The values of an Array.
26
+ function
27
+ The numpy function, such as ``numpy.negative``.
28
+ name
29
+ The operator or function name shown in error messages, such as ``"-"``.
30
+
31
+ Returns
32
+ -------
33
+ NDArray
34
+ The transformed values.
35
+
36
+ Raises
37
+ ------
38
+ IncompatibleTypesError
39
+ When the function does not apply to the type of the values.
40
+
41
+ Examples
42
+ --------
43
+ >>> import numpy
44
+ >>> from numdaplot.arrays.operations.transformation import transform_values
45
+ >>> transform_values(numpy.array([1, -2]), numpy.negative, "-")
46
+ array([-1, 2])
47
+ """
48
+ try:
49
+ transformed_values = function(values)
50
+ except TypeError as error:
51
+ type_names = find_operand_type_names([values])
52
+ raise IncompatibleTypesError(name, type_names) from error
53
+
54
+ return transformed_values
@@ -0,0 +1,94 @@
1
+ """
2
+ Checks that the values of an Array have a type an operation applies to.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ from numpy.typing import NDArray
10
+
11
+ from numdaplot.data_types.numpy_mapping import from_numpy_dtype
12
+ from numdaplot.data_types.value_family import ValueFamily, find_family
13
+ from numdaplot.data_types.value_type import find_value_type
14
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
15
+ from numdaplot.rules.rule_values import ScalarValue
16
+
17
+
18
+ def require_family(values: NDArray[Any], accepted_families: frozenset[ValueFamily], operation: str) -> None:
19
+ """
20
+ Check that the values of an Array belong to one of the families an operation applies to.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ values
27
+ The values of an Array.
28
+ accepted_families
29
+ The families the operation applies to.
30
+ operation
31
+ Name of the operation, shown in the error message.
32
+
33
+ Raises
34
+ ------
35
+ IncompatibleTypesError
36
+ When the type of the values belongs to another family.
37
+
38
+ Examples
39
+ --------
40
+ >>> import numpy
41
+ >>> import numdaplot as ndp
42
+ >>> from numdaplot.arrays.operations.type_requirements import require_family
43
+ >>> from numdaplot.data_types.value_family import ValueFamily
44
+ >>> try:
45
+ ... require_family(numpy.array(["a"]), frozenset({ValueFamily.NUMBER}), "Mean")
46
+ ... except ndp.IncompatibleTypesError as error:
47
+ ... print(error)
48
+ Cannot apply Mean to TEXT.
49
+ """
50
+ array_type = from_numpy_dtype(values.dtype)
51
+ array_family = find_family(array_type)
52
+ if array_family not in accepted_families:
53
+ raise IncompatibleTypesError(operation, [array_type.name])
54
+
55
+
56
+ def require_comparable(values: NDArray[Any], reference: ScalarValue, operation: str) -> None:
57
+ """
58
+ Check that the values of an Array can be compared with a reference value.
59
+
60
+ Numbers compare with numbers, texts with texts, dates and datetimes with each other.
61
+
62
+ .. versionadded:: 0.1.0
63
+
64
+ Parameters
65
+ ----------
66
+ values
67
+ The values of an Array.
68
+ reference
69
+ The value they are compared with.
70
+ operation
71
+ Name of the operation, shown in the error message.
72
+
73
+ Raises
74
+ ------
75
+ IncompatibleTypesError
76
+ When the reference value belongs to another family than the values.
77
+
78
+ Examples
79
+ --------
80
+ >>> import numpy
81
+ >>> import numdaplot as ndp
82
+ >>> from numdaplot.arrays.operations.type_requirements import require_comparable
83
+ >>> try:
84
+ ... require_comparable(numpy.array([1, 2]), "10", "Greater")
85
+ ... except ndp.IncompatibleTypesError as error:
86
+ ... print(error)
87
+ Cannot apply Greater to INT64 and TEXT.
88
+ """
89
+ array_type = from_numpy_dtype(values.dtype)
90
+ reference_type = find_value_type(reference)
91
+ array_family = find_family(array_type)
92
+ reference_family = find_family(reference_type)
93
+ if array_family != reference_family:
94
+ raise IncompatibleTypesError(operation, [array_type.name, reference_type.name])
@@ -0,0 +1,66 @@
1
+ """
2
+ Settings of the replacement of a region of an Array.
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.positions.region import Region
13
+ from numdaplot.rules.rule_values import ScalarValue
14
+ from numdaplot.settings.field_types import require_field_types
15
+
16
+ if TYPE_CHECKING:
17
+ from numdaplot.arrays.array import Array
18
+
19
+
20
+ # eq=False because comparing two settings would compare their Arrays with ==, which Array refuses.
21
+ @dataclass(frozen=True, eq=False)
22
+ class Replacement:
23
+ """
24
+ Settings of the replacement of a region of an Array, used by ``Array.replace``.
25
+
26
+ .. versionadded:: 0.1.0
27
+
28
+ Parameters
29
+ ----------
30
+ region
31
+ The positions to replace.
32
+ value
33
+ A ``ScalarValue``, such as ``0`` or ``"Paris"``, written at every position of the region, or an Array of
34
+ exactly the shape of the region. Its type must fit in the type of the Array: a decimal cannot replace
35
+ an integer.
36
+
37
+
38
+ Raises
39
+ ------
40
+ InvalidTypeError
41
+ When a setting is not of the type its annotation names.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> scores = ndp.Array.from_list([10, 20, 30])
47
+ >>> first_score = ndp.Region(rows=ndp.Index(0))
48
+ >>> scores.replace(ndp.Replacement(region=first_score, value=0))
49
+ Array([ 0, 20, 30], dtype=INT64)
50
+ """
51
+
52
+ region: Region
53
+ value: ScalarValue | Array
54
+
55
+ def __post_init__(self) -> None:
56
+ """
57
+ Check the type of every setting.
58
+
59
+ .. versionadded:: 0.1.0
60
+
61
+ Raises
62
+ ------
63
+ InvalidTypeError
64
+ When a setting is not of the type its annotation names.
65
+ """
66
+ require_field_types(self)
@@ -0,0 +1,5 @@
1
+ """
2
+ Selection of Array values by rule and by position.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,131 @@
1
+ """
2
+ Masks of the rules comparing each value with reference values.
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.operations.type_requirements import require_comparable
13
+ from numdaplot.arrays.selection.missing_mask import find_missing
14
+ from numdaplot.arrays.selection.time_reference import compare_with_reference
15
+ from numdaplot.rules.between import Between
16
+ from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
17
+ from numdaplot.rules.equal import Equal
18
+ from numdaplot.rules.greater import Greater
19
+ from numdaplot.rules.greater_or_equal import GreaterOrEqual
20
+ from numdaplot.rules.less import Less
21
+ from numdaplot.rules.less_or_equal import LessOrEqual
22
+ from numdaplot.rules.not_equal import NotEqual
23
+ from numdaplot.rules.value_rule import ValueRule
24
+
25
+ COMPARISON_FUNCTIONS = dict[type[ValueRule[Any]], numpy.ufunc](
26
+ {
27
+ Equal: numpy.equal,
28
+ NotEqual: numpy.not_equal,
29
+ Greater: numpy.greater,
30
+ GreaterOrEqual: numpy.greater_equal,
31
+ Less: numpy.less,
32
+ LessOrEqual: numpy.less_equal,
33
+ }
34
+ )
35
+ BETWEEN_NAME = "Between"
36
+
37
+
38
+ def build_comparison_mask(values: NDArray[Any], rule: ValueRule[Any]) -> NDArray[numpy.bool_]:
39
+ """
40
+ Return which values satisfy a rule comparing them with a single reference value.
41
+
42
+ A missing value never satisfies the rule, not even ``NotEqual``. A date, a datetime or a duration that nanoseconds
43
+ cannot hold lies beyond every datetime or duration: ``Less`` accepts them all for a reference in the year 3000.
44
+
45
+ .. versionadded:: 0.1.0
46
+
47
+ Parameters
48
+ ----------
49
+ values
50
+ The values of an Array.
51
+ rule
52
+ ``Equal``, ``NotEqual``, ``Greater``, ``GreaterOrEqual``, ``Less`` or ``LessOrEqual``.
53
+
54
+ Returns
55
+ -------
56
+ NDArray[numpy.bool_]
57
+ True at each value satisfying the rule.
58
+
59
+ Raises
60
+ ------
61
+ IncompatibleTypesError
62
+ When the reference value cannot be compared with the values.
63
+
64
+ Examples
65
+ --------
66
+ >>> import numpy
67
+ >>> import numdaplot as ndp
68
+ >>> from numdaplot.arrays.selection.comparison_masks import build_comparison_mask
69
+ >>> build_comparison_mask(numpy.array([1, 5, 9]), ndp.Greater(4))
70
+ array([False, True, True])
71
+ """
72
+ rule_class = type(rule)
73
+ require_comparable(values, rule.value, rule_class.__name__)
74
+
75
+ compare = COMPARISON_FUNCTIONS[rule_class]
76
+ matches = compare_with_reference(values, rule.value, compare)
77
+ missing = find_missing(values)
78
+ present = ~missing
79
+ mask = matches & present
80
+
81
+ return mask
82
+
83
+
84
+ def build_between_mask(values: NDArray[Any], rule: Between[Any]) -> NDArray[numpy.bool_]:
85
+ """
86
+ Return which values lie inside the interval of a ``Between`` rule.
87
+
88
+ .. versionadded:: 0.1.0
89
+
90
+ Parameters
91
+ ----------
92
+ values
93
+ The values of an Array.
94
+ rule
95
+ The interval and the bounds it includes.
96
+
97
+ Returns
98
+ -------
99
+ NDArray[numpy.bool_]
100
+ True at each value inside the interval. A missing value is never inside.
101
+
102
+ Raises
103
+ ------
104
+ IncompatibleTypesError
105
+ When the bounds cannot be compared with the values.
106
+
107
+ Examples
108
+ --------
109
+ >>> import numpy
110
+ >>> import numdaplot as ndp
111
+ >>> from numdaplot.arrays.selection.comparison_masks import build_between_mask
112
+ >>> build_between_mask(numpy.array([1, 5, 9]), ndp.Between(low=1, high=5, bounds=ndp.Bounds.HIGH_ONLY))
113
+ array([False, True, False])
114
+ """
115
+ require_comparable(values, rule.low, BETWEEN_NAME)
116
+
117
+ compare_with_low = numpy.greater
118
+ if rule.bounds in LOW_INCLUDED_BOUNDS:
119
+ compare_with_low = numpy.greater_equal
120
+
121
+ compare_with_high = numpy.less
122
+ if rule.bounds in HIGH_INCLUDED_BOUNDS:
123
+ compare_with_high = numpy.less_equal
124
+
125
+ above_low = compare_with_reference(values, rule.low, compare_with_low)
126
+ below_high = compare_with_reference(values, rule.high, compare_with_high)
127
+ missing = find_missing(values)
128
+ present = ~missing
129
+ mask = above_low & below_high & present
130
+
131
+ return mask
@@ -0,0 +1,118 @@
1
+ """
2
+ Masks of the rules looking for values in a list or for a text inside each value.
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.operations.operand import convert_time_value
13
+ from numdaplot.arrays.operations.type_requirements import require_comparable, require_family
14
+ from numdaplot.arrays.selection.missing_mask import find_missing
15
+ from numdaplot.arrays.selection.time_reference import remove_far_references
16
+ from numdaplot.data_types.value_family import ValueFamily
17
+ from numdaplot.rules.case import Case
18
+ from numdaplot.rules.contains import Contains
19
+ from numdaplot.rules.is_in import IsIn
20
+
21
+ IS_IN_NAME = "IsIn"
22
+ CONTAINS_NAME = "Contains"
23
+ TEXT_FAMILIES = frozenset({ValueFamily.TEXT})
24
+ EMPTY_TEXT = ""
25
+ NOT_FOUND_POSITION = -1
26
+
27
+
28
+ def build_membership_mask(values: NDArray[Any], rule: IsIn[Any]) -> NDArray[numpy.bool_]:
29
+ """
30
+ Return which values belong to the accepted values of an ``IsIn`` rule.
31
+
32
+ .. versionadded:: 0.1.0
33
+
34
+ Parameters
35
+ ----------
36
+ values
37
+ The values of an Array.
38
+ rule
39
+ The accepted values.
40
+
41
+ Returns
42
+ -------
43
+ NDArray[numpy.bool_]
44
+ True at each accepted value. A missing value is never accepted.
45
+
46
+ Raises
47
+ ------
48
+ IncompatibleTypesError
49
+ When the accepted values cannot be compared with the values.
50
+
51
+ Examples
52
+ --------
53
+ >>> import numpy
54
+ >>> import numdaplot as ndp
55
+ >>> from numdaplot.arrays.selection.membership_masks import build_membership_mask
56
+ >>> build_membership_mask(numpy.array([1, 2, 3]), ndp.IsIn([1, 3]))
57
+ array([ True, False, True])
58
+ """
59
+ first_accepted_value = rule.values[0]
60
+ require_comparable(values, first_accepted_value, IS_IN_NAME)
61
+
62
+ near_values = remove_far_references(values, rule.values)
63
+ accepted_values = [convert_time_value(accepted_value) for accepted_value in near_values]
64
+ matches = numpy.isin(values, accepted_values)
65
+ missing = find_missing(values)
66
+ present = ~missing
67
+ mask = matches & present
68
+
69
+ return mask
70
+
71
+
72
+ def build_contains_mask(values: NDArray[Any], rule: Contains) -> NDArray[numpy.bool_]:
73
+ """
74
+ Return which texts contain the text of a ``Contains`` rule.
75
+
76
+ .. versionadded:: 0.1.0
77
+
78
+ Parameters
79
+ ----------
80
+ values
81
+ The values of a ``TEXT`` Array.
82
+ rule
83
+ The searched text and whether case is ignored.
84
+
85
+ Returns
86
+ -------
87
+ NDArray[numpy.bool_]
88
+ True at each text containing the searched text.
89
+
90
+ Raises
91
+ ------
92
+ IncompatibleTypesError
93
+ When the values are not texts.
94
+
95
+ Examples
96
+ --------
97
+ >>> import numpy
98
+ >>> import numdaplot as ndp
99
+ >>> from numdaplot.arrays.selection.membership_masks import build_contains_mask
100
+ >>> build_contains_mask(numpy.array(["Paris", "Lyon"]), ndp.Contains("paris", case=ndp.Case.IGNORED))
101
+ array([ True, False])
102
+ """
103
+ require_family(values, TEXT_FAMILIES, CONTAINS_NAME)
104
+
105
+ missing = find_missing(values)
106
+ present = ~missing
107
+ # numpy cannot search a missing text. The mask of the present texts removes the empty text standing for it.
108
+ searched_values = numpy.where(missing, EMPTY_TEXT, values)
109
+ searched_text = rule.text
110
+ if rule.case == Case.IGNORED:
111
+ searched_values = numpy.strings.lower(searched_values)
112
+ searched_text = rule.text.lower()
113
+
114
+ positions = numpy.strings.find(searched_values, searched_text)
115
+ found = positions != NOT_FOUND_POSITION
116
+ mask = found & present
117
+
118
+ return mask
@@ -0,0 +1,50 @@
1
+ """
2
+ Positions of the missing 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
+ NAN_KINDS = frozenset({"f", "T"})
13
+ TIME_KINDS = frozenset({"M", "m"})
14
+
15
+
16
+ def find_missing(values: NDArray[Any]) -> NDArray[numpy.bool_]:
17
+ """
18
+ Return which values are missing: NaN for decimals and texts, NaT for dates, datetimes and durations.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ values
25
+ The values of an Array.
26
+
27
+ Returns
28
+ -------
29
+ NDArray[numpy.bool_]
30
+ True at each missing value. Always false for types that cannot be missing.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numpy
35
+ >>> from numdaplot.arrays.selection.missing_mask import find_missing
36
+ >>> find_missing(numpy.array([1.0, numpy.nan]))
37
+ array([False, True])
38
+ """
39
+ value_kind = values.dtype.kind
40
+ if value_kind in NAN_KINDS:
41
+ missing_values = numpy.isnan(values)
42
+ return missing_values
43
+
44
+ if value_kind in TIME_KINDS:
45
+ missing_times = numpy.isnat(values)
46
+ return missing_times
47
+
48
+ no_missing_value = numpy.zeros(values.shape, dtype=numpy.bool_)
49
+
50
+ return no_missing_value
@@ -0,0 +1,178 @@
1
+ """
2
+ Numpy index of the positions of a Region inside 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.creation.range_values import compute_range_values
13
+ from numdaplot.errors.dimension_error import DimensionError
14
+ from numdaplot.errors.invalid_position_error import InvalidPositionError
15
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
16
+ from numdaplot.positions.index import Index
17
+ from numdaplot.positions.range import Range
18
+ from numdaplot.positions.region import Region
19
+
20
+ ONE_DIMENSION = 1
21
+ TWO_DIMENSIONS = 2
22
+ WHOLE_NUMBER_KINDS = frozenset({"i", "u"})
23
+ REGION_OPERATION = "A Region"
24
+ COLUMNS_OPERATION = "A Region with columns"
25
+ COLUMN_NAMES_OPERATION = "Column names in a Region for an Array"
26
+ COLUMN_NAMES_ALTERNATIVE = "Index or Range positions"
27
+
28
+
29
+ def build_region_index(region: Region, dimensions: tuple[int, ...]) -> tuple[NDArray[Any], ...]:
30
+ """
31
+ Return the numpy index selecting the positions of a Region.
32
+
33
+ Rows and columns given as an ``Index`` keep their dimension, so the selection of one row
34
+ of a two-dimensional Array is still two-dimensional.
35
+
36
+ .. versionadded:: 0.1.0
37
+
38
+ Parameters
39
+ ----------
40
+ region
41
+ The rows and the columns to select.
42
+ dimensions
43
+ The dimensions of the Array.
44
+
45
+ Returns
46
+ -------
47
+ tuple[NDArray, ...]
48
+ One array of positions per dimension, usable inside numpy brackets.
49
+
50
+ Raises
51
+ ------
52
+ DimensionError
53
+ When the Array has more than two dimensions, or when columns are given for a
54
+ one-dimensional Array.
55
+ RefusedOperationError
56
+ When columns are given as names, which only a Table has.
57
+ InvalidPositionError
58
+ When a position is not a whole number inside its dimension.
59
+
60
+ Examples
61
+ --------
62
+ >>> import numdaplot as ndp
63
+ >>> from numdaplot.arrays.selection.region_index import build_region_index
64
+ >>> build_region_index(ndp.Region(rows=ndp.Index(-1)), (3,))
65
+ (array([-1]),)
66
+ """
67
+ dimension_count = len(dimensions)
68
+ if dimension_count > TWO_DIMENSIONS:
69
+ raise DimensionError(REGION_OPERATION, dimension_count)
70
+
71
+ if isinstance(region.columns, list):
72
+ raise RefusedOperationError(COLUMN_NAMES_OPERATION, COLUMN_NAMES_ALTERNATIVE)
73
+
74
+ row_count = dimensions[0]
75
+ row_positions = find_positions(region.rows, row_count)
76
+ if dimension_count == ONE_DIMENSION:
77
+ if region.columns is not None:
78
+ raise DimensionError(COLUMNS_OPERATION, dimension_count)
79
+
80
+ return (row_positions,)
81
+
82
+ column_count = dimensions[1]
83
+ column_positions = find_positions(region.columns, column_count)
84
+ region_index = numpy.ix_(row_positions, column_positions)
85
+
86
+ return region_index
87
+
88
+
89
+ def find_positions(selector: Index | Range | None, size: int) -> NDArray[Any]:
90
+ """
91
+ Return the positions chosen in one dimension.
92
+
93
+ .. versionadded:: 0.1.0
94
+
95
+ Parameters
96
+ ----------
97
+ selector
98
+ One position, a sequence of positions, or ``None`` for every position.
99
+ size
100
+ The size of the dimension.
101
+
102
+ Returns
103
+ -------
104
+ NDArray
105
+ The chosen positions, negative ones counting from the end.
106
+
107
+ Raises
108
+ ------
109
+ InvalidPositionError
110
+ When a position is not a whole number inside the dimension.
111
+
112
+ Examples
113
+ --------
114
+ >>> import numdaplot as ndp
115
+ >>> from numdaplot.arrays.selection.region_index import find_positions
116
+ >>> find_positions(ndp.Range(start=0, stop=4, step=2), 5)
117
+ array([0, 2, 4])
118
+ """
119
+ match selector:
120
+ case None:
121
+ positions = numpy.arange(size)
122
+ case Index():
123
+ positions = numpy.array([selector.position])
124
+ case Range():
125
+ positions = compute_range_values(selector)
126
+
127
+ require_valid_positions(positions, size)
128
+
129
+ return positions
130
+
131
+
132
+ def require_valid_positions(positions: NDArray[Any], size: int) -> None:
133
+ """
134
+ Check that positions are whole numbers inside a dimension.
135
+
136
+ .. versionadded:: 0.1.0
137
+
138
+ Parameters
139
+ ----------
140
+ positions
141
+ The positions to check.
142
+ size
143
+ The size of the dimension, which accepts the positions from ``-size`` to ``size - 1``.
144
+
145
+ Raises
146
+ ------
147
+ InvalidPositionError
148
+ At the first position that is not a whole number or falls outside the dimension.
149
+
150
+ Examples
151
+ --------
152
+ >>> import numpy
153
+ >>> import numdaplot as ndp
154
+ >>> from numdaplot.arrays.selection.region_index import require_valid_positions
155
+ >>> try:
156
+ ... require_valid_positions(numpy.array([0, 3]), 3)
157
+ ... except ndp.InvalidPositionError as error:
158
+ ... print(error)
159
+ Expected a whole position between -3 and 2, got 3.
160
+ """
161
+ if positions.size == 0:
162
+ return
163
+
164
+ if positions.dtype.kind not in WHOLE_NUMBER_KINDS:
165
+ first_position = positions[0]
166
+ rejected_position = first_position.item()
167
+ raise InvalidPositionError(rejected_position, size)
168
+
169
+ lowest_position = -size
170
+ below_lowest = positions < lowest_position
171
+ above_highest = positions >= size
172
+ outside = below_lowest | above_highest
173
+ has_outside_position = outside.any()
174
+ if has_outside_position:
175
+ outside_positions = positions[outside]
176
+ first_outside_position = outside_positions[0]
177
+ rejected_position = first_outside_position.item()
178
+ raise InvalidPositionError(rejected_position, size)