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,49 @@
1
+ """
2
+ Distinct 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.selection.missing_mask import find_missing
13
+
14
+ SINGLE_MISSING_VALUE = slice(0, 1)
15
+
16
+
17
+ def find_unique_values(values: NDArray[Any]) -> NDArray[Any]:
18
+ """
19
+ Return each distinct value once, sorted, with a single missing value at the end when there is one.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ values
26
+ The values of an Array, of any number of dimensions.
27
+
28
+ Returns
29
+ -------
30
+ NDArray
31
+ The distinct values, in one dimension.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numpy
36
+ >>> from numdaplot.arrays.layout.unique_values import find_unique_values
37
+ >>> find_unique_values(numpy.array([[3.0, numpy.nan], [1.0, 3.0]]))
38
+ array([ 1., 3., nan])
39
+ """
40
+ missing = find_missing(values)
41
+ present = ~missing
42
+ present_values = values[present]
43
+ missing_values = values[missing]
44
+ distinct_values = numpy.unique(present_values)
45
+ single_missing_values = missing_values[SINGLE_MISSING_VALUE]
46
+ parts = [distinct_values, single_missing_values]
47
+ unique_values = numpy.concatenate(parts)
48
+
49
+ return unique_values
@@ -0,0 +1,5 @@
1
+ """
2
+ Replacement of the values of an Array by other values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,286 @@
1
+ """
2
+ Application of a ValueMapping to the values of an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from datetime import date, datetime, time
9
+ from typing import Any, cast
10
+
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.arrays.conversion.python_values import to_python_list
14
+ from numdaplot.arrays.creation.list_conversion import convert_list
15
+ from numdaplot.arrays.mapping.unmatched import Unmatched
16
+ from numdaplot.arrays.mapping.value_mapping import MAPPING_OPERATION, ValueMapping, find_new_type
17
+ from numdaplot.arrays.operations.type_requirements import require_comparable
18
+ from numdaplot.arrays.selection.missing_mask import find_missing
19
+ from numdaplot.data_types.numpy_mapping import from_numpy_dtype
20
+ from numdaplot.data_types.type import Type
21
+ from numdaplot.errors.unmatched_value_error import UnmatchedValueError
22
+ from numdaplot.errors.unsupported_missing_error import UnsupportedMissingError
23
+ from numdaplot.rules.rule_values import ScalarValue
24
+
25
+ DECIMAL_ADVICE = "Give decimal new values, such as 10.0, which can be missing."
26
+ BOOLEAN_ADVICE = "Give texts as new values, which can be missing."
27
+ MIDNIGHT = time()
28
+ INTEGER_TYPES = frozenset(
29
+ {Type.INT8, Type.INT16, Type.INT32, Type.INT64, Type.UINT8, Type.UINT16, Type.UINT32, Type.UINT64}
30
+ )
31
+
32
+
33
+ def map_values(values: NDArray[Any], mapping: ValueMapping) -> NDArray[Any]:
34
+ """
35
+ Return the values of an Array replaced by the new values of a mapping, in the same shape.
36
+
37
+ .. versionadded:: 0.1.0
38
+
39
+ Parameters
40
+ ----------
41
+ values
42
+ The values of an Array.
43
+ mapping
44
+ The new value of each listed value, and what happens to the others.
45
+
46
+ Returns
47
+ -------
48
+ NDArray
49
+ The new values, stored with the type the new values share. Missing values stay missing.
50
+
51
+ Raises
52
+ ------
53
+ IncompatibleTypesError
54
+ When the old values are not of the type family of the Array.
55
+ UnmatchedValueError
56
+ When a value has no new value and ``others`` is ``Unmatched.ERROR``.
57
+ UnsupportedMissingError
58
+ When the result holds integers or booleans and a missing value.
59
+
60
+ Examples
61
+ --------
62
+ >>> import numpy
63
+ >>> import numdaplot as ndp
64
+ >>> from numdaplot.arrays.mapping.mapped_values import map_values
65
+ >>> mapping = ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")])
66
+ >>> map_values(numpy.array([[1, 2], [2, 1]]), mapping).tolist()
67
+ [['Homme', 'Femme'], ['Femme', 'Homme']]
68
+ """
69
+ for change in mapping.changes:
70
+ require_comparable(values, change.old_value, MAPPING_OPERATION)
71
+
72
+ flat_values = values.ravel()
73
+ new_values = find_flat_new_values(flat_values, mapping)
74
+ new_type = find_new_type(mapping.changes)
75
+ require_missing_supported(new_values, new_type)
76
+ stored_values = convert_list(new_values, new_type)
77
+ shaped_values = stored_values.reshape(values.shape)
78
+
79
+ return shaped_values
80
+
81
+
82
+ def find_flat_new_values(flat_values: NDArray[Any], mapping: ValueMapping) -> list[object]:
83
+ """
84
+ Return the new value of each value of a flat Array, None for a missing one.
85
+
86
+ .. versionadded:: 0.1.0
87
+
88
+ Parameters
89
+ ----------
90
+ flat_values
91
+ The values of an Array in one dimension.
92
+ mapping
93
+ The new value of each listed value, and what happens to the others.
94
+
95
+ Returns
96
+ -------
97
+ list[object]
98
+ The new Python values, in order.
99
+
100
+ Raises
101
+ ------
102
+ UnmatchedValueError
103
+ At the first value without new value, when ``others`` is ``Unmatched.ERROR``.
104
+
105
+ Examples
106
+ --------
107
+ >>> import numpy
108
+ >>> import numdaplot as ndp
109
+ >>> from numdaplot.arrays.mapping.mapped_values import find_flat_new_values
110
+ >>> mapping = ndp.ValueMapping(changes=[ndp.ValueChange(1.0, "one")], others=ndp.Unmatched.MISSING)
111
+ >>> find_flat_new_values(numpy.array([1.0, numpy.nan, 2.0]), mapping)
112
+ ['one', None, None]
113
+ """
114
+ array_type = from_numpy_dtype(flat_values.dtype)
115
+ new_value_by_old = dict[ScalarValue, ScalarValue | None]()
116
+ for change in mapping.changes:
117
+ lookup_value = find_lookup_value(change.old_value, array_type)
118
+ new_value_by_old[lookup_value] = change.new_value
119
+
120
+ missing = find_missing(flat_values)
121
+ raw_missing = missing.tolist()
122
+ is_missing_list = cast(list[bool], raw_missing)
123
+ python_values = to_python_list(flat_values)
124
+ new_values = list[object]()
125
+ for value, is_missing in zip(python_values, is_missing_list, strict=True):
126
+ if is_missing:
127
+ new_values.append(None)
128
+ continue
129
+
130
+ if value in new_value_by_old:
131
+ new_value = new_value_by_old[value]
132
+ new_values.append(new_value)
133
+ continue
134
+
135
+ if mapping.others == Unmatched.ERROR:
136
+ raise UnmatchedValueError(value)
137
+
138
+ new_values.append(None)
139
+
140
+ return new_values
141
+
142
+
143
+ def require_missing_supported(new_values: Sequence[object], new_type: Type | None) -> None:
144
+ """
145
+ Check that a result of integers or booleans holds no missing value, with advice fitting a mapping.
146
+
147
+ .. versionadded:: 0.1.0
148
+
149
+ Parameters
150
+ ----------
151
+ new_values
152
+ The new Python values, None for a missing one.
153
+ new_type
154
+ The type the new values share, or None.
155
+
156
+ Raises
157
+ ------
158
+ UnsupportedMissingError
159
+ When the type is an integer or boolean type and a new value is None.
160
+
161
+ Examples
162
+ --------
163
+ >>> import numdaplot as ndp
164
+ >>> from numdaplot.arrays.mapping.mapped_values import require_missing_supported
165
+ >>> try:
166
+ ... require_missing_supported([10, None], ndp.Type.INT64)
167
+ ... except ndp.UnsupportedMissingError as error:
168
+ ... print(error)
169
+ INT64 values cannot be missing in an Array. Give decimal new values, such as 10.0, which can be missing.
170
+ """
171
+ has_missing = None in new_values
172
+ if not has_missing:
173
+ return
174
+
175
+ if new_type in INTEGER_TYPES:
176
+ raise UnsupportedMissingError(new_type.name, advice=DECIMAL_ADVICE)
177
+
178
+ if new_type == Type.BOOL:
179
+ raise UnsupportedMissingError(new_type.name, advice=BOOLEAN_ADVICE)
180
+
181
+
182
+ def find_lookup_value(old_value: ScalarValue, array_type: Type) -> ScalarValue:
183
+ """
184
+ Return an old value written as the values of the Array are, so that a date finds a datetime at midnight.
185
+
186
+ .. versionadded:: 0.1.0
187
+
188
+ Parameters
189
+ ----------
190
+ old_value
191
+ An old value of a ``ValueChange``.
192
+ array_type
193
+ The type of the values of the Array.
194
+
195
+ Returns
196
+ -------
197
+ ScalarValue
198
+ A date as a datetime at midnight for ``DATETIME`` values, a datetime at midnight as a date for ``DATE``
199
+ values, any other value unchanged.
200
+
201
+ Examples
202
+ --------
203
+ >>> from datetime import date
204
+ >>> import numdaplot as ndp
205
+ >>> from numdaplot.arrays.mapping.mapped_values import find_lookup_value
206
+ >>> find_lookup_value(date(2026, 12, 25), ndp.Type.DATETIME)
207
+ datetime.datetime(2026, 12, 25, 0, 0)
208
+ """
209
+ if array_type == Type.DATETIME:
210
+ datetime_value = write_date_as_datetime(old_value)
211
+ return datetime_value
212
+
213
+ if array_type == Type.DATE:
214
+ date_value = write_midnight_as_date(old_value)
215
+ return date_value
216
+
217
+ return old_value
218
+
219
+
220
+ def write_date_as_datetime(old_value: ScalarValue) -> ScalarValue:
221
+ """
222
+ Return a date as the datetime at midnight of that day, any other value unchanged.
223
+
224
+ .. versionadded:: 0.1.0
225
+
226
+ Parameters
227
+ ----------
228
+ old_value
229
+ An old value of a ``ValueChange``.
230
+
231
+ Returns
232
+ -------
233
+ ScalarValue
234
+ The datetime at midnight, or the value itself.
235
+
236
+ Examples
237
+ --------
238
+ >>> from datetime import date
239
+ >>> from numdaplot.arrays.mapping.mapped_values import write_date_as_datetime
240
+ >>> write_date_as_datetime(date(2026, 12, 25)), write_date_as_datetime(3)
241
+ (datetime.datetime(2026, 12, 25, 0, 0), 3)
242
+ """
243
+ if isinstance(old_value, datetime):
244
+ return old_value
245
+
246
+ if not isinstance(old_value, date):
247
+ return old_value
248
+
249
+ midnight = datetime.combine(old_value, MIDNIGHT)
250
+
251
+ return midnight
252
+
253
+
254
+ def write_midnight_as_date(old_value: ScalarValue) -> ScalarValue:
255
+ """
256
+ Return a datetime at midnight as its date, any other value unchanged.
257
+
258
+ .. versionadded:: 0.1.0
259
+
260
+ Parameters
261
+ ----------
262
+ old_value
263
+ An old value of a ``ValueChange``.
264
+
265
+ Returns
266
+ -------
267
+ ScalarValue
268
+ The date of a datetime at midnight, or the value itself, so that a datetime with a time finds no date.
269
+
270
+ Examples
271
+ --------
272
+ >>> from datetime import datetime
273
+ >>> from numdaplot.arrays.mapping.mapped_values import write_midnight_as_date
274
+ >>> write_midnight_as_date(datetime(2026, 12, 25)), write_midnight_as_date(datetime(2026, 12, 25, 10))
275
+ (datetime.date(2026, 12, 25), datetime.datetime(2026, 12, 25, 10, 0))
276
+ """
277
+ if not isinstance(old_value, datetime):
278
+ return old_value
279
+
280
+ old_time = old_value.time()
281
+ if old_time != MIDNIGHT:
282
+ return old_value
283
+
284
+ old_date = old_value.date()
285
+
286
+ return old_date
@@ -0,0 +1,50 @@
1
+ """
2
+ What happens to a value that no setting gives a new value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Unmatched(Enum):
11
+ """
12
+ What happens to a value of an Array that a ``ValueMapping`` gives no new value.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> sexes = ndp.Array.from_list([1, 2, 9])
20
+ >>> changes = [ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]
21
+ >>> sexes.apply(ndp.ValueMapping(changes=changes, others=ndp.Unmatched.MISSING))
22
+ Array(['Homme', 'Femme', nan], dtype=TEXT)
23
+ """
24
+
25
+ ERROR = auto()
26
+ """
27
+ The value raises ``UnmatchedValueError``. Default value.
28
+
29
+ Examples
30
+ --------
31
+ >>> import numdaplot as ndp
32
+ >>> sexes = ndp.Array.from_list([1, 9])
33
+ >>> try:
34
+ ... sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme")], others=ndp.Unmatched.ERROR))
35
+ ... except ndp.UnmatchedValueError as error:
36
+ ... print(error)
37
+ The value 9 has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing.
38
+ """
39
+
40
+ MISSING = auto()
41
+ """
42
+ The value becomes missing.
43
+
44
+ Examples
45
+ --------
46
+ >>> import numdaplot as ndp
47
+ >>> sexes = ndp.Array.from_list([1, 9])
48
+ >>> sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme")], others=ndp.Unmatched.MISSING))
49
+ Array(['Homme', nan], dtype=TEXT)
50
+ """
@@ -0,0 +1,55 @@
1
+ """
2
+ One old value and the new value replacing it.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.rules.rule_values import ScalarValue
10
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class ValueChange:
15
+ """
16
+ One old value of an Array and the new value replacing it, used by ``ValueMapping``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ old_value
23
+ The value replaced, of the type family of the Array: ``2.0`` finds the integer ``2``.
24
+ new_value
25
+ The value replacing it, or None to make it missing.
26
+
27
+ Raises
28
+ ------
29
+ InvalidTypeError
30
+ When a setting is not of the type its annotation names, such as None as old value.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> severities = ndp.Array.from_list([1, 2, -1])
36
+ >>> changes = [ndp.ValueChange(1, "Indemne"), ndp.ValueChange(2, "Tue"), ndp.ValueChange(-1, None)]
37
+ >>> severities.apply(ndp.ValueMapping(changes=changes))
38
+ Array(['Indemne', 'Tue', nan], dtype=TEXT)
39
+ """
40
+
41
+ old_value: ScalarValue
42
+ new_value: ScalarValue | None
43
+
44
+ def __post_init__(self) -> None:
45
+ """
46
+ Check the type of every setting.
47
+
48
+ .. versionadded:: 0.1.0
49
+
50
+ Raises
51
+ ------
52
+ InvalidTypeError
53
+ When a setting is not of the type its annotation names.
54
+ """
55
+ require_field_types(self)
@@ -0,0 +1,161 @@
1
+ """
2
+ Replacement of each value of an Array by a new value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.mapping.unmatched import Unmatched
10
+ from numdaplot.arrays.mapping.value_change import ValueChange
11
+ from numdaplot.data_types.type import Type
12
+ from numdaplot.data_types.value_type import find_common_type, find_value_type
13
+ from numdaplot.errors.duplicate_value_error import DuplicateValueError
14
+ from numdaplot.errors.empty_list_error import EmptyListError
15
+ from numdaplot.rules.rule_values import ScalarValue
16
+ from numdaplot.settings.field_types import require_field_types
17
+
18
+ CHANGE_ITEM_NAME = "value change"
19
+ MAPPING_OPERATION = "ValueMapping"
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class ValueMapping:
24
+ """
25
+ The new value of each listed value of an Array, used by ``Array.apply``, such as codes replaced by labels.
26
+
27
+ A missing value stays missing. The new values share one type, which the result takes: integers and decimals
28
+ give decimals.
29
+
30
+ .. versionadded:: 0.1.0
31
+
32
+ Parameters
33
+ ----------
34
+ changes
35
+ The ``ValueChange`` of each replaced value, at least one, each old value once. The mapping keeps its own copy
36
+ of the list.
37
+ others
38
+ What happens to a value without ``ValueChange``, ``Unmatched.ERROR`` by default.
39
+
40
+ Raises
41
+ ------
42
+ InvalidTypeError
43
+ When a setting is not of the type its annotation names.
44
+ EmptyListError
45
+ When ``changes`` is an empty list.
46
+ IncompatibleTypesError
47
+ When the old values, or the new values, mix several families of types, such as numbers and texts.
48
+ DuplicateValueError
49
+ When an old value appears twice.
50
+
51
+ Examples
52
+ --------
53
+ >>> import numdaplot as ndp
54
+ >>> sexes = ndp.Array.from_list([2, 1, 2])
55
+ >>> sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]))
56
+ Array(['Femme', 'Homme', 'Femme'], dtype=TEXT)
57
+ """
58
+
59
+ changes: list[ValueChange]
60
+ others: Unmatched = Unmatched.ERROR
61
+
62
+ def __post_init__(self) -> None:
63
+ """
64
+ Check the changes: at least one, old and new values each of one type family, no old value twice.
65
+
66
+ .. versionadded:: 0.1.0
67
+
68
+ Raises
69
+ ------
70
+ InvalidTypeError
71
+ When a setting is not of the type its annotation names.
72
+ EmptyListError
73
+ When ``changes`` is an empty list.
74
+ IncompatibleTypesError
75
+ When the old values, or the new values, mix several families of types.
76
+ DuplicateValueError
77
+ When an old value appears twice.
78
+ """
79
+ require_field_types(self)
80
+
81
+ if self.changes == []:
82
+ raise EmptyListError(CHANGE_ITEM_NAME)
83
+
84
+ old_values = [change.old_value for change in self.changes]
85
+ old_types = [find_value_type(old_value) for old_value in old_values]
86
+ find_common_type(old_types, MAPPING_OPERATION)
87
+ require_unique_values(old_values)
88
+ find_new_type(self.changes)
89
+ changes_copy = list(self.changes)
90
+ object.__setattr__(self, "changes", changes_copy)
91
+
92
+
93
+ def require_unique_values(values: list[ScalarValue]) -> None:
94
+ """
95
+ Check that no value appears twice, ``2`` and ``2.0`` being the same value.
96
+
97
+ .. versionadded:: 0.1.0
98
+
99
+ Parameters
100
+ ----------
101
+ values
102
+ Values of one family of types.
103
+
104
+ Raises
105
+ ------
106
+ DuplicateValueError
107
+ At the first value seen before.
108
+
109
+ Examples
110
+ --------
111
+ >>> import numdaplot as ndp
112
+ >>> from numdaplot.arrays.mapping.value_mapping import require_unique_values
113
+ >>> try:
114
+ ... require_unique_values([1, 2, 2.0])
115
+ ... except ndp.DuplicateValueError as error:
116
+ ... print(error)
117
+ The value 2.0 appears more than once.
118
+ """
119
+ seen_values = set[ScalarValue]()
120
+ for value in values:
121
+ if value in seen_values:
122
+ raise DuplicateValueError(value)
123
+
124
+ seen_values.add(value)
125
+
126
+
127
+ def find_new_type(changes: list[ValueChange]) -> Type | None:
128
+ """
129
+ Return the type shared by the new values of a mapping.
130
+
131
+ .. versionadded:: 0.1.0
132
+
133
+ Parameters
134
+ ----------
135
+ changes
136
+ The changes of a mapping.
137
+
138
+ Returns
139
+ -------
140
+ Type or None
141
+ The common type of the new values that are not None, or None when every new value is None.
142
+
143
+ Raises
144
+ ------
145
+ IncompatibleTypesError
146
+ When the new values mix several families of types.
147
+
148
+ Examples
149
+ --------
150
+ >>> import numdaplot as ndp
151
+ >>> from numdaplot.arrays.mapping.value_mapping import find_new_type
152
+ >>> find_new_type([ndp.ValueChange(1, 10), ndp.ValueChange(2, 2.5), ndp.ValueChange(-1, None)])
153
+ <Type.FLOAT64: 10>
154
+ """
155
+ new_types = [find_value_type(change.new_value) for change in changes if change.new_value is not None]
156
+ if new_types == []:
157
+ return None
158
+
159
+ new_type = find_common_type(new_types, MAPPING_OPERATION)
160
+
161
+ return new_type
@@ -0,0 +1,5 @@
1
+ """
2
+ Math functions applied to each value of an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,27 @@
1
+ """
2
+ Absolute value math function.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.math_functions.math_function import MathFunction
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class Absolute(MathFunction):
14
+ """
15
+ Absolute value of each value, its distance to 0: -3 and 3 both give 3.
16
+
17
+ Missing values stay missing.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Examples
22
+ --------
23
+ >>> import numdaplot as ndp
24
+ >>> gaps = ndp.Array.from_list([-3, 0, 2])
25
+ >>> gaps.apply(ndp.Absolute())
26
+ Array([3, 0, 2], dtype=INT64)
27
+ """
@@ -0,0 +1,28 @@
1
+ """
2
+ Cosine math function.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.math_functions.math_function import MathFunction
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class Cosine(MathFunction):
14
+ """
15
+ Cosine of each value, read as an angle in radians.
16
+
17
+ Missing values stay missing.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Examples
22
+ --------
23
+ >>> import numdaplot as ndp
24
+ >>> import math
25
+ >>> angles = ndp.Array.from_list([0.0, math.pi])
26
+ >>> angles.apply(ndp.Cosine())
27
+ Array([ 1., -1.], dtype=FLOAT64)
28
+ """
@@ -0,0 +1,27 @@
1
+ """
2
+ Exponential math function.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.math_functions.math_function import MathFunction
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class Exponential(MathFunction):
14
+ """
15
+ Exponential of each value, ``e`` raised to the value: 0 gives 1, 1 gives about 2.718.
16
+
17
+ Missing values stay missing.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Examples
22
+ --------
23
+ >>> import numdaplot as ndp
24
+ >>> rates = ndp.Array.from_list([0.0, 1.0])
25
+ >>> rates.apply(ndp.Exponential())
26
+ Array([1. , 2.71828183], dtype=FLOAT64)
27
+ """