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,371 @@
1
+ """
2
+ Ways to create an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from typing import Any, Self
9
+
10
+ import numpy.typing
11
+
12
+ from numdaplot.arrays.array_data import ArrayData
13
+ from numdaplot.arrays.creation.date_parts import DateParts
14
+ from numdaplot.arrays.creation.date_parts_values import build_dates
15
+ from numdaplot.arrays.creation.filled_values import build_filled_values
16
+ from numdaplot.arrays.creation.list_conversion import convert_list
17
+ from numdaplot.arrays.creation.normal import Normal
18
+ from numdaplot.arrays.creation.numpy_conversion import copy_numpy_values
19
+ from numdaplot.arrays.creation.random_integers import RandomIntegers
20
+ from numdaplot.arrays.creation.random_values import draw_random_values
21
+ from numdaplot.arrays.creation.range_values import compute_range_values
22
+ from numdaplot.arrays.creation.spacing import Spacing
23
+ from numdaplot.arrays.creation.spacing_values import compute_spacing_values
24
+ from numdaplot.arrays.creation.uniform import Uniform
25
+ from numdaplot.arrays.shape import Shape
26
+ from numdaplot.data_types.type import Type
27
+ from numdaplot.positions.range import Range
28
+ from numdaplot.rules.rule_values import ScalarValue
29
+ from numdaplot.settings.argument_types import checked_arguments
30
+
31
+ type ListValue = ScalarValue | None
32
+ """
33
+ A single value of a list given to ``Array.from_list``: a ``ScalarValue``, or ``None`` for a missing value.
34
+
35
+ It is a name used by the documentation and the annotations, not an object to create: pass the value itself,
36
+ such as ``10``, ``"Paris"`` or ``None``.
37
+
38
+ .. versionadded:: 0.1.0
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> ndp.Array.from_list([1.5, None])
44
+ Array([1.5, nan], dtype=FLOAT64)
45
+ """
46
+
47
+ type NestedValues = Sequence[ListValue] | Sequence[NestedValues]
48
+ """
49
+ A list of ``ListValue``, or a list of lists nested to any depth, as ``Array.from_list`` reads it.
50
+
51
+ It is a name used by the documentation and the annotations, not an object to create: pass the value itself,
52
+ such as ``[1, 2, 3]``, ``["Paris", "Lyon"]`` or ``[[1, 2], [3, 4]]``.
53
+
54
+ .. versionadded:: 0.1.0
55
+
56
+ Examples
57
+ --------
58
+ >>> import numdaplot as ndp
59
+ >>> ndp.Array.from_list([[1, 2], [3, 4]]).shape
60
+ Shape(dimensions=[2, 2])
61
+ """
62
+
63
+
64
+ class ArrayCreation(ArrayData):
65
+ """
66
+ Ways to create an Array.
67
+
68
+ From a list, from numpy, filled with one value, from a range, from a spacing, or drawn at random.
69
+
70
+ .. versionadded:: 0.1.0
71
+ """
72
+
73
+ @classmethod
74
+ @checked_arguments
75
+ def from_list(cls, values: NestedValues, dtype: Type | None = None) -> Self:
76
+ """
77
+ Create an Array from a Python list, or from nested lists for several dimensions.
78
+
79
+ The type is guessed when omitted: integers give ``INT64``, decimals or a mix of integers and
80
+ decimals give ``FLOAT64``, then ``BOOL``, ``TEXT``, ``DATE``, ``DATETIME`` and ``DURATION``.
81
+ ``None`` is a missing value, only accepted for decimals, texts, dates, datetimes and durations.
82
+
83
+ .. versionadded:: 0.1.0
84
+
85
+ Parameters
86
+ ----------
87
+ values
88
+ The values, a ``NestedValues`` such as ``[1, 2, 3]``, ``["Paris", None]`` or ``[[1, 2], [3, 4]]``.
89
+ Nested lists must form a regular block.
90
+ dtype
91
+ The type to store the values as, guessed from the values when omitted. Required when no value is present.
92
+
93
+ Returns
94
+ -------
95
+ Self
96
+ A new Array.
97
+
98
+ Raises
99
+ ------
100
+ InvalidTypeError
101
+ When an argument is not of the type its annotation names.
102
+ IrregularListError
103
+ When nested lists do not form a regular block.
104
+ IncompatibleTypesError
105
+ When the values mix several kinds of types, such as numbers and texts.
106
+ MissingTypeError
107
+ When ``dtype`` is omitted and no value is present.
108
+ UnsupportedMissingError
109
+ When a value is missing and the type cannot hold missing values.
110
+ ValueConversionError
111
+ When the values cannot be stored as ``dtype`` without losing information.
112
+ TimeOverflowError
113
+ When a datetime is outside 1677 to 2262, or a duration beyond about 292 years.
114
+ UnsupportedTypeError
115
+ When a value has no numdaplot type, or ``dtype`` is ``CATEGORY``.
116
+
117
+ Examples
118
+ --------
119
+ >>> import numdaplot as ndp
120
+ >>> ndp.Array.from_list([[1, 2], [3, None]], dtype=ndp.Type.FLOAT64)
121
+ Array([[ 1., 2.],
122
+ [ 3., nan]], dtype=FLOAT64)
123
+ """
124
+ value_list = list[object](values)
125
+ converted_values = convert_list(value_list, dtype)
126
+ created_array = cls._create(converted_values)
127
+
128
+ return created_array
129
+
130
+ @classmethod
131
+ @checked_arguments
132
+ def from_numpy(cls, values: numpy.typing.NDArray[Any]) -> Self:
133
+ """
134
+ Create an Array from a copy of a numpy array; changing the numpy array never changes the Array.
135
+
136
+ .. versionadded:: 0.1.0
137
+
138
+ Parameters
139
+ ----------
140
+ values
141
+ The numpy array. Texts may mark their missing values with any marker of ``StringDType``. Durations of any
142
+ unit give ``DURATION``, and an object array of ``datetime.time`` and None gives ``TIME``.
143
+
144
+ Returns
145
+ -------
146
+ Self
147
+ A new Array.
148
+
149
+ Raises
150
+ ------
151
+ InvalidTypeError
152
+ When an argument is not of the type its annotation names.
153
+ UnsupportedTypeError
154
+ When numdaplot has no equivalent type, for example complex numbers or other Python objects.
155
+ TimeOverflowError
156
+ When a duration in microseconds is beyond about 292 years, which ``DURATION`` cannot hold.
157
+
158
+ Examples
159
+ --------
160
+ >>> import numpy
161
+ >>> import numdaplot as ndp
162
+ >>> ndp.Array.from_numpy(numpy.array([1.5, 2.5]))
163
+ Array([1.5, 2.5], dtype=FLOAT64)
164
+ """
165
+ copied_values = copy_numpy_values(values)
166
+ created_array = cls._create(copied_values)
167
+
168
+ return created_array
169
+
170
+ @classmethod
171
+ @checked_arguments
172
+ def filled(cls, shape: Shape, value: ScalarValue, dtype: Type | None = None) -> Self:
173
+ """
174
+ Create an Array of a shape, with the same value everywhere.
175
+
176
+ .. versionadded:: 0.1.0
177
+
178
+ Parameters
179
+ ----------
180
+ shape
181
+ The shape of the Array.
182
+ value
183
+ The repeated value, a ``ScalarValue`` such as ``0``, ``"Paris"`` or ``True``.
184
+ dtype
185
+ The type to store the value as, guessed from the value when omitted.
186
+
187
+ Returns
188
+ -------
189
+ Self
190
+ A new Array.
191
+
192
+ Raises
193
+ ------
194
+ InvalidTypeError
195
+ When an argument is not of the type its annotation names.
196
+ ValueConversionError
197
+ When the value cannot be stored as ``dtype`` without losing information.
198
+ TimeOverflowError
199
+ When a datetime is outside 1677 to 2262, or a duration beyond about 292 years.
200
+
201
+ Examples
202
+ --------
203
+ >>> import numdaplot as ndp
204
+ >>> ndp.Array.filled(shape=ndp.Shape([2, 3]), value=0)
205
+ Array([[0, 0, 0],
206
+ [0, 0, 0]], dtype=INT64)
207
+ """
208
+ filled_values = build_filled_values(shape, value, dtype)
209
+ created_array = cls._create(filled_values)
210
+
211
+ return created_array
212
+
213
+ @classmethod
214
+ @checked_arguments
215
+ def from_range(cls, sequence: Range) -> Self:
216
+ """
217
+ Create a one-dimensional Array of the numbers of a regular sequence.
218
+
219
+ Unlike the Python ``range``, the stop is included by default.
220
+
221
+ .. versionadded:: 0.1.0
222
+
223
+ Parameters
224
+ ----------
225
+ sequence
226
+ The start, the stop, the step and the bounds kept. ``LOW_ONLY`` keeps the start and drops
227
+ the stop, ``HIGH_ONLY`` the opposite.
228
+
229
+ Returns
230
+ -------
231
+ Self
232
+ A new Array of integers when the start and the step are integers, of decimals otherwise.
233
+
234
+ Raises
235
+ ------
236
+ InvalidTypeError
237
+ When an argument is not of the type its annotation names.
238
+
239
+ Examples
240
+ --------
241
+ >>> import numdaplot as ndp
242
+ >>> ndp.Array.from_range(ndp.Range(start=0, stop=1, step=0.25))
243
+ Array([0. , 0.25, 0.5 , 0.75, 1. ], dtype=FLOAT64)
244
+ """
245
+ range_values = compute_range_values(sequence)
246
+ created_array = cls._create(range_values)
247
+
248
+ return created_array
249
+
250
+ @classmethod
251
+ @checked_arguments
252
+ def from_date_parts(cls, parts: DateParts) -> Self:
253
+ """
254
+ Create an Array of dates from their year, their month and their day, such as three columns of a file.
255
+
256
+ .. versionadded:: 0.1.0
257
+
258
+ Parameters
259
+ ----------
260
+ parts
261
+ The year, the month and the day of each date, Arrays of whole numbers of the same shape.
262
+
263
+ Returns
264
+ -------
265
+ Self
266
+ A new ``DATE`` Array of the shape of the parts. A date is missing where one of its parts is missing.
267
+
268
+ Raises
269
+ ------
270
+ InvalidTypeError
271
+ When an argument is not of the type its annotation names.
272
+ ValueConversionError
273
+ At the first part that is not a whole number, such as the day 3.5, then at the first year, month and day
274
+ that form no date, such as the 31st of February, a month 13 or a year outside 1 to 9999.
275
+
276
+ Examples
277
+ --------
278
+ >>> import numdaplot as ndp
279
+ >>> accidents = ndp.Table.from_arrays(
280
+ ... {
281
+ ... "jour": ndp.Array.from_list([14, 25]),
282
+ ... "mois": ndp.Array.from_list([7, 12]),
283
+ ... "an": ndp.Array.from_list([2025, 2025]),
284
+ ... }
285
+ ... )
286
+ >>> years = accidents.column("an")
287
+ >>> parts = ndp.DateParts(year=years, month=accidents.column("mois"), day=accidents.column("jour"))
288
+ >>> ndp.Array.from_date_parts(parts)
289
+ Array(['2025-07-14', '2025-12-25'], dtype=DATE)
290
+ """
291
+ dates = build_dates(parts)
292
+ created_array = cls._create(dates)
293
+
294
+ return created_array
295
+
296
+ @classmethod
297
+ @checked_arguments
298
+ def from_spacing(cls, spacing: Spacing) -> Self:
299
+ """
300
+ Create a one-dimensional Array of evenly spaced decimals.
301
+
302
+ .. versionadded:: 0.1.0
303
+
304
+ Parameters
305
+ ----------
306
+ spacing
307
+ The bounds, the count of values and whether each bound is among them.
308
+
309
+ Returns
310
+ -------
311
+ Self
312
+ A new ``FLOAT64`` Array of ``count`` values.
313
+
314
+
315
+ Raises
316
+ ------
317
+ InvalidTypeError
318
+ When an argument is not of the type its annotation names.
319
+
320
+ Examples
321
+ --------
322
+ >>> import numdaplot as ndp
323
+ >>> ndp.Array.from_spacing(ndp.Spacing(start=0, stop=1, count=5))
324
+ Array([0. , 0.25, 0.5 , 0.75, 1. ], dtype=FLOAT64)
325
+ """
326
+ spacing_values = compute_spacing_values(spacing)
327
+ created_array = cls._create(spacing_values)
328
+
329
+ return created_array
330
+
331
+ @classmethod
332
+ @checked_arguments
333
+ def random(cls, distribution: Uniform | Normal | RandomIntegers, shape: Shape, seed: int | None = None) -> Self:
334
+ """
335
+ Create an Array of values drawn at random from a distribution.
336
+
337
+ .. versionadded:: 0.1.0
338
+
339
+ Parameters
340
+ ----------
341
+ distribution
342
+ The ``Distribution`` followed by the values, such as ``ndp.Uniform(low=0, high=10)``:
343
+ see ``Distribution`` for every distribution.
344
+ shape
345
+ The shape of the Array.
346
+ seed
347
+ A number, at least 0, giving the same values at each call. Different values at each call when omitted.
348
+
349
+ Returns
350
+ -------
351
+ Self
352
+ A new ``FLOAT64`` Array for ``Uniform`` and ``Normal``, ``INT64`` for ``RandomIntegers``.
353
+
354
+ Raises
355
+ ------
356
+ InvalidTypeError
357
+ When an argument is not of the type its annotation names.
358
+ InvalidSeedError
359
+ When ``seed`` is lower than 0.
360
+
361
+ Examples
362
+ --------
363
+ >>> import numdaplot as ndp
364
+ >>> dice = ndp.RandomIntegers(low=1, high=6)
365
+ >>> ndp.Array.random(dice, shape=ndp.Shape([5]), seed=0)
366
+ Array([6, 4, 4, 2, 2], dtype=INT64)
367
+ """
368
+ random_values = draw_random_values(distribution, shape, seed)
369
+ created_array = cls._create(random_values)
370
+
371
+ return created_array
@@ -0,0 +1,281 @@
1
+ """
2
+ Values stored by an Array, shared by every group of Array methods.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any, Never, Self, cast
8
+
9
+ import numpy
10
+ import numpy.typing
11
+
12
+ from numdaplot.arrays.operations.combination import combine_values
13
+ from numdaplot.arrays.operations.operand import Operand
14
+ from numdaplot.arrays.shape import Shape
15
+ from numdaplot.data_types.numpy_mapping import from_numpy_dtype
16
+ from numdaplot.data_types.time_of_day import read_time_objects
17
+ from numdaplot.data_types.type import Type
18
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
19
+ from numdaplot.rules.rule_values import ScalarValue
20
+
21
+ CONSTRUCTOR_OPERATION = "Creating an Array with ndp.Array(...)"
22
+ CONSTRUCTOR_ALTERNATIVE = "ndp.Array.from_list, from_numpy, filled, from_range, from_spacing or random"
23
+
24
+
25
+ class ArrayData:
26
+ """
27
+ Values stored by an Array, shared by every group of Array methods.
28
+
29
+ Use ``ndp.Array`` and its ``from_*`` methods; this base class only holds the values.
30
+
31
+ .. versionadded:: 0.1.0
32
+ """
33
+
34
+ # numpy then hands every operation between an ndarray and an Array to the Array, which refuses it.
35
+ __array_ufunc__ = None
36
+ _values: numpy.typing.NDArray[Any]
37
+
38
+ def __init__(self, *arguments: Never, **keyword_arguments: Never) -> None:
39
+ """
40
+ Refuse the creation of an Array by its constructor: the ``from_*`` methods create Arrays.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ arguments
47
+ Any value, refused.
48
+ keyword_arguments
49
+ Any named value, refused.
50
+
51
+ Raises
52
+ ------
53
+ RefusedOperationError
54
+ Always, naming the ``from_*`` methods.
55
+ """
56
+ raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
57
+
58
+ @classmethod
59
+ def _create(cls, values: numpy.typing.NDArray[Any]) -> Self:
60
+ """
61
+ Return a new Array storing numpy values without copy, made read-only.
62
+
63
+ .. versionadded:: 0.1.0
64
+
65
+ Parameters
66
+ ----------
67
+ values
68
+ The numpy values, of a type numdaplot supports.
69
+
70
+ Returns
71
+ -------
72
+ Self
73
+ The new Array.
74
+ """
75
+ created_array = cls.__new__(cls)
76
+ values.flags.writeable = False
77
+ created_array._values = values
78
+
79
+ return created_array
80
+
81
+ @property
82
+ def shape(self) -> Shape:
83
+ """
84
+ Number of values along each dimension.
85
+
86
+ .. versionadded:: 0.1.0
87
+
88
+ Examples
89
+ --------
90
+ >>> import numdaplot as ndp
91
+ >>> ndp.Array.from_list([[1, 2, 3], [4, 5, 6]]).shape
92
+ Shape(dimensions=[2, 3])
93
+ """
94
+ dimensions = list(self._values.shape)
95
+ array_shape = Shape(dimensions)
96
+
97
+ return array_shape
98
+
99
+ @property
100
+ def dtype(self) -> Type:
101
+ """
102
+ Type of the values.
103
+
104
+ .. versionadded:: 0.1.0
105
+
106
+ Examples
107
+ --------
108
+ >>> import numdaplot as ndp
109
+ >>> ndp.Array.from_list([1.5, 2.0]).dtype
110
+ <Type.FLOAT64: 10>
111
+ """
112
+ array_type = from_numpy_dtype(self._values.dtype)
113
+
114
+ return array_type
115
+
116
+ def to_numpy(self) -> numpy.typing.NDArray[Any]:
117
+ """
118
+ Return a numpy copy of the values; changing it never changes the Array.
119
+
120
+ .. versionadded:: 0.1.0
121
+
122
+ Returns
123
+ -------
124
+ numpy.typing.NDArray
125
+ A writable copy of the values. Texts use ``StringDType`` with NaN as missing value. Times of day are
126
+ Python ``datetime.time`` objects, None where missing, as numpy has no type for them.
127
+
128
+ Examples
129
+ --------
130
+ >>> import numdaplot as ndp
131
+ >>> values = ndp.Array.from_list([1, 2]).to_numpy()
132
+ >>> values[0] = 99
133
+ >>> values
134
+ array([99, 2])
135
+ """
136
+ array_type = from_numpy_dtype(self._values.dtype)
137
+ if array_type == Type.TIME:
138
+ time_objects = read_time_objects(self._values)
139
+ return time_objects
140
+
141
+ copied_values = self._values.copy()
142
+
143
+ return copied_values
144
+
145
+ def _wrap(self, values: numpy.typing.NDArray[Any]) -> Self:
146
+ """
147
+ Return a new Array of the same class holding other values.
148
+
149
+ .. versionadded:: 0.1.0
150
+
151
+ Parameters
152
+ ----------
153
+ values
154
+ The numpy values of the new Array, stored without copy.
155
+
156
+ Returns
157
+ -------
158
+ Self
159
+ The new Array.
160
+ """
161
+ array_class = type(self)
162
+ wrapped_array = array_class._create(values)
163
+
164
+ return wrapped_array
165
+
166
+ def _read_operand(self, other: object) -> Operand:
167
+ """
168
+ Return the values of an Array, or check that a value is a single value.
169
+
170
+ .. versionadded:: 0.1.0
171
+
172
+ Parameters
173
+ ----------
174
+ other
175
+ An Array or a single value.
176
+
177
+ Returns
178
+ -------
179
+ Operand
180
+ The numpy values of the Array, or the single value itself.
181
+ """
182
+ if isinstance(other, ArrayData):
183
+ return other._values
184
+
185
+ single_value = cast(ScalarValue, other)
186
+
187
+ return single_value
188
+
189
+ def _combine(self, other: object, function: numpy.ufunc, symbol: str) -> Self:
190
+ """
191
+ Return a new Array combining this Array, on the left, with another operand.
192
+
193
+ .. versionadded:: 0.1.0
194
+
195
+ Parameters
196
+ ----------
197
+ other
198
+ An Array or a single value, on the right.
199
+ function
200
+ The numpy function, such as ``numpy.add``.
201
+ symbol
202
+ The operator shown in error messages, such as ``"+"``.
203
+
204
+ Returns
205
+ -------
206
+ Self
207
+ The combined Array.
208
+
209
+ Raises
210
+ ------
211
+ ShapeMismatchError, IncompatibleTypesError
212
+ When the operand is not accepted, as in ``combine_values``.
213
+ """
214
+ right_values = self._read_operand(other)
215
+ combined_values = combine_values(self._values, right_values, function, symbol)
216
+ combined_array = self._wrap(combined_values)
217
+
218
+ return combined_array
219
+
220
+ def _combine_reflected(self, other: object, function: numpy.ufunc, symbol: str) -> Self:
221
+ """
222
+ Return a new Array combining another operand, on the left, with this Array.
223
+
224
+ .. versionadded:: 0.1.0
225
+
226
+ Parameters
227
+ ----------
228
+ other
229
+ A single value, on the left.
230
+ function
231
+ The numpy function, such as ``numpy.subtract``.
232
+ symbol
233
+ The operator shown in error messages, such as ``"-"``.
234
+
235
+ Returns
236
+ -------
237
+ Self
238
+ The combined Array.
239
+
240
+ Raises
241
+ ------
242
+ IncompatibleTypesError
243
+ When the operand is not accepted, as in ``combine_values``.
244
+ """
245
+ left_values = self._read_operand(other)
246
+ combined_values = combine_values(left_values, self._values, function, symbol)
247
+ combined_array = self._wrap(combined_values)
248
+
249
+ return combined_array
250
+
251
+
252
+ def read_stored_values(array: ArrayData) -> numpy.typing.NDArray[Any]:
253
+ """
254
+ Return the values an Array stores, without copy, for the code of numdaplot that builds other objects from them.
255
+
256
+ Unlike ``Array.to_numpy``, times of day stay stored as the time since midnight.
257
+
258
+ .. versionadded:: 0.1.0
259
+
260
+ Parameters
261
+ ----------
262
+ array
263
+ An Array.
264
+
265
+ Returns
266
+ -------
267
+ numpy.typing.NDArray
268
+ The stored values, which must not be changed.
269
+
270
+ Examples
271
+ --------
272
+ >>> from datetime import time
273
+ >>> import numdaplot as ndp
274
+ >>> from numdaplot.arrays.array_data import read_stored_values
275
+ >>> read_stored_values(ndp.Array.from_list([time(0, 1)]))
276
+ array([60000000], dtype='timedelta64[us]')
277
+ """
278
+ # The function lives next to the class to read its stored values on behalf of the rest of numdaplot.
279
+ stored_values = array._values # pyright: ignore[reportPrivateUsage]
280
+
281
+ return stored_values