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,72 @@
1
+ """
2
+ Logarithm 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
+ from numdaplot.errors.invalid_base_error import InvalidBaseError
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ LOWEST_EXCLUDED_BASE = 0
14
+ FORBIDDEN_BASE = 1
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Logarithm(MathFunction):
19
+ """
20
+ Logarithm of each value: with ``base=10``, 1000 gives 3.
21
+
22
+ Applying it to a value lower than or equal to 0 raises ``OutOfDomainError``.
23
+ Missing values stay missing.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ base
30
+ Base of the logarithm, greater than 0 and different from 1.
31
+ The natural logarithm, of base ``e``, when omitted.
32
+
33
+ Raises
34
+ ------
35
+ InvalidTypeError
36
+ When a setting is not of the type its annotation names.
37
+ InvalidBaseError
38
+ When ``base`` is lower than or equal to 0, or equal to 1.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> populations = ndp.Array.from_list([1, 100, 1000])
44
+ >>> populations.apply(ndp.Logarithm(base=10))
45
+ Array([0., 2., 3.], dtype=FLOAT64)
46
+ """
47
+
48
+ base: float | None = None
49
+
50
+ def __post_init__(self) -> None:
51
+ """
52
+ Check that the base can be used.
53
+
54
+ .. versionadded:: 0.1.0
55
+
56
+ Raises
57
+ ------
58
+ InvalidTypeError
59
+ When a setting is not of the type its annotation names.
60
+ InvalidBaseError
61
+ When ``base`` is lower than or equal to 0, or equal to 1.
62
+ """
63
+ require_field_types(self)
64
+
65
+ if self.base is None:
66
+ return
67
+
68
+ if self.base <= LOWEST_EXCLUDED_BASE:
69
+ raise InvalidBaseError(self.base)
70
+
71
+ if self.base == FORBIDDEN_BASE:
72
+ raise InvalidBaseError(self.base)
@@ -0,0 +1,58 @@
1
+ """
2
+ Base class of every math function.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
8
+
9
+ CONSTRUCTOR_OPERATION = "Creating a MathFunction with ndp.MathFunction()"
10
+ CONSTRUCTOR_ALTERNATIVE = "a math function such as ndp.SquareRoot"
11
+
12
+
13
+ class MathFunction:
14
+ """
15
+ Base class of every math function, applied to each value of a number Array by ``Array.apply``.
16
+
17
+ A math function is immutable and checks its settings when it is created.
18
+
19
+ Only its subclasses are created: calling ``ndp.MathFunction()`` raises ``RefusedOperationError``.
20
+
21
+ Every math function, passed to ``Array.apply``:
22
+
23
+ |Math function|What it gives for each value|Example|
24
+ |---|---|---|
25
+ |``Absolute``|Its distance to 0: -3 and 3 both give 3|``ndp.Absolute()``|
26
+ |``SquareRoot``|Its square root: 9 gives 3|``ndp.SquareRoot()``|
27
+ |``Exponential``|``e`` raised to the value: 0 gives 1|``ndp.Exponential()``|
28
+ |``Logarithm``|Its logarithm: with ``base=10``, 1000 gives 3|``ndp.Logarithm(base=10)``|
29
+ |``Round``|The value rounded to a number of decimals|``ndp.Round(decimals=2)``|
30
+ |``Sine``|Its sine, read as an angle in radians|``ndp.Sine()``|
31
+ |``Cosine``|Its cosine, read as an angle in radians|``ndp.Cosine()``|
32
+
33
+ .. versionadded:: 0.1.0
34
+
35
+ Examples
36
+ --------
37
+ >>> import numdaplot as ndp
38
+ >>> values = ndp.Array.from_list([1.0, 4.0])
39
+ >>> for function in [ndp.SquareRoot(), ndp.Logarithm(base=2)]:
40
+ ... print(values.apply(function))
41
+ Array([1., 2.], dtype=FLOAT64)
42
+ Array([0., 2.], dtype=FLOAT64)
43
+ """
44
+
45
+ def __init__(self) -> None:
46
+ """
47
+ Refuse the creation of the base class itself, and let a subclass be created.
48
+
49
+ .. versionadded:: 0.1.0
50
+
51
+ Raises
52
+ ------
53
+ RefusedOperationError
54
+ When the created object is a MathFunction and not one of its subclasses.
55
+ """
56
+ created_class = type(self)
57
+ if created_class is MathFunction:
58
+ raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
@@ -0,0 +1,58 @@
1
+ """
2
+ Rounding 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
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class Round(MathFunction):
15
+ """
16
+ Each value rounded to a number of decimals.
17
+
18
+ A value exactly halfway is rounded to the nearest even digit, as in numpy:
19
+ 2.5 gives 2 and 3.5 gives 4. Missing values stay missing.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ decimals
26
+ Number of decimals kept, 0 by default to round to whole numbers. A negative number rounds to
27
+ tens, hundreds...: -2 turns 1234 into 1200.
28
+
29
+
30
+ Raises
31
+ ------
32
+ InvalidTypeError
33
+ When a setting is not of the type its annotation names.
34
+
35
+ Examples
36
+ --------
37
+ >>> import numdaplot as ndp
38
+ >>> prices = ndp.Array.from_list([12.346, 2.5, 3.5])
39
+ >>> prices.apply(ndp.Round(decimals=2))
40
+ Array([12.35, 2.5 , 3.5 ], dtype=FLOAT64)
41
+ >>> prices.apply(ndp.Round())
42
+ Array([12., 2., 4.], dtype=FLOAT64)
43
+ """
44
+
45
+ decimals: int = 0
46
+
47
+ def __post_init__(self) -> None:
48
+ """
49
+ Check the type of every setting.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Raises
54
+ ------
55
+ InvalidTypeError
56
+ When a setting is not of the type its annotation names.
57
+ """
58
+ require_field_types(self)
@@ -0,0 +1,28 @@
1
+ """
2
+ Sine 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 Sine(MathFunction):
14
+ """
15
+ Sine 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 / 2])
26
+ >>> angles.apply(ndp.Sine())
27
+ Array([0., 1.], dtype=FLOAT64)
28
+ """
@@ -0,0 +1,27 @@
1
+ """
2
+ Square root 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 SquareRoot(MathFunction):
14
+ """
15
+ Square root of each value: 9 gives 3.
16
+
17
+ Applying it to a negative value raises ``OutOfDomainError``. Missing values stay missing.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Examples
22
+ --------
23
+ >>> import numdaplot as ndp
24
+ >>> areas = ndp.Array.from_list([4, 9, 16])
25
+ >>> areas.apply(ndp.SquareRoot())
26
+ Array([2., 3., 4.], dtype=FLOAT64)
27
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Arithmetic and boolean operations between Arrays and single values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,48 @@
1
+ """
2
+ Check that the operands of a boolean operator are booleans.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.arrays.operations.operand import Operand, find_operand_type, find_operand_type_names
8
+ from numdaplot.data_types.type import Type
9
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
10
+
11
+
12
+ def require_booleans(operands: list[Operand], symbol: str) -> None:
13
+ """
14
+ Check that every operand of a boolean operator holds booleans.
15
+
16
+ ``&``, ``|`` and ``~`` combine the masks returned by ``check``. On integers, numpy would
17
+ combine their bits instead, which is refused.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ operands
24
+ The values of Arrays, or single values.
25
+ symbol
26
+ The operator shown in error messages, such as ``"&"``.
27
+
28
+ Raises
29
+ ------
30
+ IncompatibleTypesError
31
+ When an operand is not a boolean.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numpy
36
+ >>> import numdaplot as ndp
37
+ >>> from numdaplot.arrays.operations.boolean_operands import require_booleans
38
+ >>> try:
39
+ ... require_booleans([numpy.array([True]), 2], "|")
40
+ ... except ndp.IncompatibleTypesError as error:
41
+ ... print(error)
42
+ Cannot apply | to BOOL and INT64.
43
+ """
44
+ for operand in operands:
45
+ operand_type = find_operand_type(operand)
46
+ if operand_type != Type.BOOL:
47
+ type_names = find_operand_type_names(operands)
48
+ raise IncompatibleTypesError(symbol, type_names)
@@ -0,0 +1,157 @@
1
+ """
2
+ Combination of two operands with an arithmetic or boolean function.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import warnings
8
+ from typing import Any
9
+
10
+ import numpy
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.arrays.operations.float_errors import FloatErrorWarnings, TimeErrorWarnings
14
+ from numdaplot.arrays.operations.integer_rules import require_combination_fits, require_defined_integers
15
+ from numdaplot.arrays.operations.operand import Operand, find_operand_type_names
16
+ from numdaplot.arrays.operations.time_arithmetic import combine_time_values, involves_time
17
+ from numdaplot.errors.broadcast_warning import BroadcastWarning
18
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
19
+ from numdaplot.errors.integer_overflow_error import IntegerOverflowError
20
+ from numdaplot.errors.shape_mismatch_error import ShapeMismatchError
21
+
22
+ PYTHON_OBJECT_KIND = "O"
23
+ BROADCAST_MESSAGE = "Shapes {left_dimensions} and {right_dimensions} differ, values are repeated to match."
24
+ # The warning points at the user line: check_shapes, combine_values, the Array helper, the operator, its check.
25
+ BROADCAST_STACK_LEVEL = 6
26
+
27
+
28
+ def combine_values(left: Operand, right: Operand, function: numpy.ufunc, symbol: str) -> NDArray[Any]:
29
+ """
30
+ Return the result of a numpy function applied to two operands, value by value.
31
+
32
+ .. versionadded:: 0.1.0
33
+
34
+ Parameters
35
+ ----------
36
+ left
37
+ The values of an Array, or a single value.
38
+ right
39
+ The values of an Array, or a single value. At least one side is the values of an Array.
40
+ function
41
+ The numpy function, such as ``numpy.add``.
42
+ symbol
43
+ The operator shown in error messages, such as ``"+"``.
44
+
45
+ Returns
46
+ -------
47
+ NDArray
48
+ The combined values, following the numpy type rules, and the rules of ``combine_time_values`` for
49
+ dates, datetimes and durations.
50
+
51
+ Warns
52
+ -----
53
+ BroadcastWarning
54
+ When both sides are Array values of different but compatible shapes.
55
+ CalculationWarning
56
+ When values of decimals become NaN or an infinite value, or durations become missing values.
57
+
58
+ Raises
59
+ ------
60
+ ShapeMismatchError
61
+ When both sides are Array values whose shapes cannot be combined.
62
+ IncompatibleTypesError
63
+ When the function does not apply to the types of the operands.
64
+ OutOfDomainError
65
+ When integers are divided by 0 with ``//`` or ``%``, or raised to a negative power.
66
+ IntegerOverflowError
67
+ When a result does not fit its integer type.
68
+ TimeOverflowError
69
+ When a date, a datetime or a duration is outside the range of nanoseconds.
70
+ RefusedOperationError, ValueConversionError
71
+ When a time operation is refused, as in ``combine_time_values``.
72
+
73
+ Examples
74
+ --------
75
+ >>> import numpy
76
+ >>> from numdaplot.arrays.operations.combination import combine_values
77
+ >>> combine_values(numpy.array([1, 2]), 10, numpy.multiply, "*")
78
+ array([10, 20])
79
+ """
80
+ check_shapes(left, right)
81
+ has_time = involves_time(left, right)
82
+ if has_time:
83
+ with TimeErrorWarnings(symbol):
84
+ time_values = combine_time_values(left, right, function, symbol)
85
+
86
+ return time_values
87
+
88
+ require_defined_integers(left, right, function)
89
+ operands = list[Operand]([left, right])
90
+ try:
91
+ with FloatErrorWarnings(symbol):
92
+ combined_values = function(left, right)
93
+ require_combination_fits(operands, function, combined_values, symbol)
94
+ except TypeError as error:
95
+ type_names = find_operand_type_names(operands)
96
+ raise IncompatibleTypesError(symbol, type_names) from error
97
+ except OverflowError as error:
98
+ type_names = find_operand_type_names(operands)
99
+ raise IntegerOverflowError(symbol, type_names[0]) from error
100
+
101
+ if combined_values.dtype.kind == PYTHON_OBJECT_KIND:
102
+ type_names = find_operand_type_names(operands)
103
+ raise IncompatibleTypesError(symbol, type_names)
104
+
105
+ return combined_values
106
+
107
+
108
+ def check_shapes(left: Operand, right: Operand) -> None:
109
+ """
110
+ Check that two operands can be combined, and warn when an Array is stretched to match the other.
111
+
112
+ .. versionadded:: 0.1.0
113
+
114
+ Parameters
115
+ ----------
116
+ left
117
+ The values of an Array, or a single value.
118
+ right
119
+ The values of an Array, or a single value.
120
+
121
+ Warns
122
+ -----
123
+ BroadcastWarning
124
+ When both sides are Array values of different but compatible shapes.
125
+
126
+ Raises
127
+ ------
128
+ ShapeMismatchError
129
+ When both sides are Array values whose shapes cannot be combined.
130
+
131
+ Examples
132
+ --------
133
+ >>> import numpy
134
+ >>> import numdaplot as ndp
135
+ >>> from numdaplot.arrays.operations.combination import check_shapes
136
+ >>> try:
137
+ ... check_shapes(numpy.array([1, 2]), numpy.array([1, 2, 3]))
138
+ ... except ndp.ShapeMismatchError as error:
139
+ ... print(error)
140
+ Expected matching shapes, got [2] and [3].
141
+ """
142
+ if not isinstance(left, numpy.ndarray):
143
+ return
144
+
145
+ if not isinstance(right, numpy.ndarray):
146
+ return
147
+
148
+ if left.shape == right.shape:
149
+ return
150
+
151
+ try:
152
+ numpy.broadcast_shapes(left.shape, right.shape)
153
+ except ValueError as error:
154
+ raise ShapeMismatchError(left.shape, right.shape) from error
155
+
156
+ message = BROADCAST_MESSAGE.format(left_dimensions=left.shape, right_dimensions=right.shape)
157
+ warnings.warn(message, BroadcastWarning, stacklevel=BROADCAST_STACK_LEVEL)
@@ -0,0 +1,170 @@
1
+ """
2
+ Warnings about the values of a calculation that become NaN or an infinite value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import os
8
+ import warnings
9
+ from pathlib import Path
10
+ from types import TracebackType
11
+
12
+ import numpy
13
+
14
+ from numdaplot.errors.calculation_warning import CalculationWarning
15
+
16
+ CALL_MODE = "call"
17
+ IGNORE_MODE = "ignore"
18
+ PACKAGE_LEVEL = 2
19
+ PACKAGE_DIRECTORY = str(Path(__file__).parents[PACKAGE_LEVEL]) + os.sep
20
+ INTERNAL_FILES = (PACKAGE_DIRECTORY,)
21
+ # The keys are the names numpy gives to its floating point errors.
22
+ FLOAT_ERROR_MESSAGES = {
23
+ "invalid value": "The operation {operation_name} has values without a defined result, such as 0 / 0: "
24
+ "they became NaN.",
25
+ "divide by zero": "The operation {operation_name} divides by zero: these values became inf.",
26
+ "overflow": "The operation {operation_name} has values too large for their type: they became inf.",
27
+ }
28
+ # A duration too large is refused before it is computed, so a calculation on times only meets these two errors.
29
+ TIME_ERROR_MESSAGES = {
30
+ "invalid value": "The operation {operation_name} has values without a defined result, such as 0 / 0: "
31
+ "they became missing.",
32
+ "divide by zero": "The operation {operation_name} divides by zero: these values became missing.",
33
+ }
34
+
35
+
36
+ class FloatErrorWarnings:
37
+ """
38
+ Context giving the numpy floating point errors of a block as ``CalculationWarning``, at the calling code.
39
+
40
+ Each kind of error gives one warning when the block ends, and none when the block raises an error.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ operation_name
47
+ The operator or the function shown in the message, such as ``/`` or ``Sum``.
48
+
49
+ Examples
50
+ --------
51
+ >>> import numpy
52
+ >>> import warnings
53
+ >>> from numdaplot.arrays.operations.float_errors import FloatErrorWarnings
54
+ >>> with warnings.catch_warnings(record=True) as caught_warnings:
55
+ ... warnings.simplefilter("always")
56
+ ... with FloatErrorWarnings("/"):
57
+ ... numpy.array([1.0]) / numpy.array([0.0])
58
+ array([inf])
59
+ >>> print(caught_warnings[0].message)
60
+ The operation / divides by zero: these values became inf.
61
+ """
62
+
63
+ messages = FLOAT_ERROR_MESSAGES
64
+
65
+ def __init__(self, operation_name: str) -> None:
66
+ """
67
+ Prepare the numpy settings recording the errors of the block.
68
+
69
+ .. versionadded:: 0.1.0
70
+
71
+ Parameters
72
+ ----------
73
+ operation_name
74
+ The operator or the function shown in the message, such as ``/`` or ``Sum``.
75
+ """
76
+ self.operation_name = operation_name
77
+ self.met_errors = set[str]()
78
+ self.numpy_settings = numpy.errstate(
79
+ divide=CALL_MODE,
80
+ invalid=CALL_MODE,
81
+ over=CALL_MODE,
82
+ under=IGNORE_MODE,
83
+ call=self.record_float_error,
84
+ )
85
+
86
+ def record_float_error(self, error_name: str, _error_flag: int) -> None:
87
+ """
88
+ Remember a floating point error, as numpy reports it during the block.
89
+
90
+ .. versionadded:: 0.1.0
91
+
92
+ Parameters
93
+ ----------
94
+ error_name
95
+ The name numpy gives to the error.
96
+ _error_flag
97
+ The numpy code of the error, not used.
98
+ """
99
+ self.met_errors.add(error_name)
100
+
101
+ def __enter__(self) -> None:
102
+ """
103
+ Start recording the errors.
104
+
105
+ .. versionadded:: 0.1.0
106
+ """
107
+ self.numpy_settings.__enter__()
108
+
109
+ def __exit__(
110
+ self,
111
+ error_type: type[BaseException] | None,
112
+ error: BaseException | None,
113
+ traceback: TracebackType | None,
114
+ ) -> None:
115
+ """
116
+ Stop recording the errors, and warn once per kind of error unless the block raised one.
117
+
118
+ .. versionadded:: 0.1.0
119
+
120
+ Parameters
121
+ ----------
122
+ error_type
123
+ The type of the error raised by the block, or None.
124
+ error
125
+ The error raised by the block, or None.
126
+ traceback
127
+ Its traceback, or None.
128
+
129
+ Warns
130
+ -----
131
+ CalculationWarning
132
+ Once per kind of error met in the block.
133
+ """
134
+ self.numpy_settings.__exit__(error_type, error, traceback)
135
+ if error_type is not None:
136
+ return
137
+
138
+ for error_name, message_format in self.messages.items():
139
+ if error_name in self.met_errors:
140
+ message = message_format.format(operation_name=self.operation_name)
141
+ warnings.warn(message, CalculationWarning, skip_file_prefixes=INTERNAL_FILES)
142
+
143
+
144
+ class TimeErrorWarnings(FloatErrorWarnings):
145
+ """
146
+ Context giving the numpy floating point errors of a calculation on times, whose values become missing.
147
+
148
+ .. versionadded:: 0.1.0
149
+
150
+ Parameters
151
+ ----------
152
+ operation_name
153
+ The operator shown in the message, such as ``/``.
154
+
155
+ Examples
156
+ --------
157
+ >>> import numpy
158
+ >>> import warnings
159
+ >>> from numdaplot.arrays.operations.float_errors import TimeErrorWarnings
160
+ >>> durations = numpy.array([1], dtype="timedelta64[ns]")
161
+ >>> with warnings.catch_warnings(record=True) as caught_warnings:
162
+ ... warnings.simplefilter("always")
163
+ ... with TimeErrorWarnings("/"):
164
+ ... durations / numpy.array([0.0])
165
+ array(['NaT'], dtype='timedelta64[ns]')
166
+ >>> print(caught_warnings[0].message)
167
+ The operation / divides by zero: these values became missing.
168
+ """
169
+
170
+ messages = TIME_ERROR_MESSAGES