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,67 @@
1
+ """
2
+ A new name for one column of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.settings.field_types import require_field_types
10
+ from numdaplot.tables.columns.column_names import require_column_name
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class NameChange:
15
+ """
16
+ A new name for one column of a Table, used by ``Renaming``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ old_name
23
+ The current name of the column.
24
+ new_name
25
+ Its new name, a non-empty text.
26
+
27
+ Raises
28
+ ------
29
+ InvalidTypeError
30
+ When a setting is not of the type its annotation names.
31
+ InvalidColumnNameError
32
+ When ``old_name`` or ``new_name`` is an empty text.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
38
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
39
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
40
+ >>> sales.rename(ndp.Renaming(changes=[ndp.NameChange(old_name="city", new_name="town")]))
41
+ town price
42
+ TEXT FLOAT64
43
+ 0 Paris 120.0
44
+ 1 Lyon 80.0
45
+ 2 Paris 150.0
46
+ """
47
+
48
+ old_name: str
49
+ new_name: str
50
+
51
+ def __post_init__(self) -> None:
52
+ """
53
+ Check that both names are non-empty texts.
54
+
55
+ .. versionadded:: 0.1.0
56
+
57
+ Raises
58
+ ------
59
+ InvalidTypeError
60
+ When a setting is not of the type its annotation names.
61
+ InvalidColumnNameError
62
+ When ``old_name`` or ``new_name`` is an empty text.
63
+ """
64
+ require_field_types(self)
65
+
66
+ require_column_name(self.old_name)
67
+ require_column_name(self.new_name)
@@ -0,0 +1,79 @@
1
+ """
2
+ A column to add to a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from dataclasses import dataclass
10
+ from typing import TYPE_CHECKING
11
+
12
+ from numdaplot.settings.field_types import require_field_types
13
+ from numdaplot.tables.columns.column_names import require_column_name
14
+ from numdaplot.tables.conflict import Conflict
15
+
16
+ if TYPE_CHECKING:
17
+ from numdaplot.arrays.array import Array
18
+
19
+
20
+ # eq=False because comparing two new columns would compare their Arrays with ==, which Array refuses.
21
+ @dataclass(frozen=True, eq=False)
22
+ class NewColumn:
23
+ """
24
+ A column to add to a Table, used by ``Table.add_column``.
25
+
26
+ .. versionadded:: 0.1.0
27
+
28
+ Parameters
29
+ ----------
30
+ name
31
+ The name of the column, a non-empty text.
32
+ values
33
+ A one-dimensional Array with one value per row of the Table.
34
+ on_conflict
35
+ ``ERROR`` by default, refusing a name that already exists, or ``REPLACE`` to replace the existing column, at its
36
+ place.
37
+
38
+ Raises
39
+ ------
40
+ InvalidTypeError
41
+ When a setting is not of the type its annotation names.
42
+ InvalidColumnNameError
43
+ When ``name`` is empty.
44
+
45
+ Examples
46
+ --------
47
+ >>> import numdaplot as ndp
48
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
49
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
50
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
51
+ >>> taxed_prices = sales.column("price") * 1.2
52
+ >>> sales.add_column(ndp.NewColumn(name="taxed_price", values=taxed_prices))
53
+ city price taxed_price
54
+ TEXT FLOAT64 FLOAT64
55
+ 0 Paris 120.0 144.0
56
+ 1 Lyon 80.0 96.0
57
+ 2 Paris 150.0 180.0
58
+ """
59
+
60
+ name: str
61
+ values: Array
62
+ on_conflict: Conflict = Conflict.ERROR
63
+
64
+ def __post_init__(self) -> None:
65
+ """
66
+ Check that the name is a non-empty text.
67
+
68
+ .. versionadded:: 0.1.0
69
+
70
+ Raises
71
+ ------
72
+ InvalidTypeError
73
+ When a setting is not of the type its annotation names.
74
+ InvalidColumnNameError
75
+ When ``name`` is empty.
76
+ """
77
+ require_field_types(self)
78
+
79
+ require_column_name(self.name)
@@ -0,0 +1,281 @@
1
+ """
2
+ Conversion of Table columns to number types.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any, cast
8
+
9
+ import numpy
10
+ import pandas
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.data_types.numpy_mapping import to_numpy_dtype
14
+ from numdaplot.data_types.type import Type
15
+ from numdaplot.errors.value_conversion_error import ValueConversionError
16
+ from numdaplot.tables.frames.column import Column
17
+ from numdaplot.tables.frames.column_values import (
18
+ build_column_with_missing,
19
+ find_column_missing,
20
+ find_column_type,
21
+ read_present_values,
22
+ )
23
+ from numdaplot.tables.frames.pandas_decimals import restore_exact_decimals
24
+
25
+ DECIMAL_KIND = "f"
26
+ FAILED_PARSE = "coerce"
27
+ PYTHON_OBJECT_DTYPE = numpy.dtype(object)
28
+ IGNORED_FLOAT_ERROR = "ignore"
29
+
30
+
31
+ def convert_numbers(column: Column, target_type: Type) -> Column:
32
+ """
33
+ Return a number column converted to another number type.
34
+
35
+ .. versionadded:: 0.1.0
36
+
37
+ Parameters
38
+ ----------
39
+ column
40
+ A number column.
41
+ target_type
42
+ The new number type.
43
+
44
+ Returns
45
+ -------
46
+ Column
47
+ The converted column. Decimals may be rounded to the precision of a smaller decimal type.
48
+
49
+ Raises
50
+ ------
51
+ ValueConversionError
52
+ When a value does not fit: a decimal with a fractional part converted to an integer,
53
+ or a number out of the range of the new type.
54
+
55
+ Examples
56
+ --------
57
+ >>> import pandas
58
+ >>> import numdaplot as ndp
59
+ >>> from numdaplot.tables.columns.number_conversion import convert_numbers
60
+ >>> convert_numbers(pandas.Series([2.0, None]), ndp.Type.INT64).tolist()
61
+ [2, <NA>]
62
+ """
63
+ source_type = find_column_type(column)
64
+ missing = find_column_missing(column)
65
+ present_values = read_present_values(column)
66
+ converted_values = store_numbers(present_values, target_type)
67
+ require_no_lost_value(present_values, converted_values, source_type, target_type)
68
+ converted_column = build_column_with_missing(converted_values, missing)
69
+
70
+ return converted_column
71
+
72
+
73
+ def parse_numbers(column: Column, target_type: Type) -> Column:
74
+ """
75
+ Return a text or category column read as numbers.
76
+
77
+ .. versionadded:: 0.1.0
78
+
79
+ Parameters
80
+ ----------
81
+ column
82
+ A text or category column.
83
+ target_type
84
+ The number type to read the texts as.
85
+
86
+ Returns
87
+ -------
88
+ Column
89
+ The numbers, missing values staying missing.
90
+
91
+ Raises
92
+ ------
93
+ ValueConversionError
94
+ At the first text that is not a number, or whose number does not fit the type.
95
+
96
+ Examples
97
+ --------
98
+ >>> import pandas
99
+ >>> import numdaplot as ndp
100
+ >>> from numdaplot.tables.columns.number_conversion import parse_numbers
101
+ >>> parse_numbers(pandas.Series(["2.5", "1e3"], dtype="string"), ndp.Type.FLOAT64).tolist()
102
+ [2.5, 1000.0]
103
+ """
104
+ source_type = find_column_type(column)
105
+ missing = find_column_missing(column)
106
+ texts = read_present_values(column)
107
+ object_texts = texts.astype(PYTHON_OBJECT_DTYPE)
108
+ parsed_values = pandas.to_numeric(object_texts, errors=FAILED_PARSE)
109
+ read_numbers = numpy.asarray(parsed_values)
110
+ failed = numpy.zeros(texts.shape, dtype=numpy.bool_)
111
+ if read_numbers.dtype.kind == DECIMAL_KIND:
112
+ failed = numpy.isnan(read_numbers)
113
+
114
+ require_no_failed_value(texts, failed, source_type, target_type)
115
+ numbers = restore_exact_decimals(object_texts, read_numbers)
116
+ converted_values = store_numbers(numbers, target_type)
117
+ lost = find_lost_values(numbers, converted_values)
118
+ require_no_failed_value(texts, lost, source_type, target_type)
119
+ parsed_column = build_column_with_missing(converted_values, missing)
120
+
121
+ return parsed_column
122
+
123
+
124
+ def store_numbers(values: NDArray[Any], target_type: Type) -> NDArray[Any]:
125
+ """
126
+ Return numbers stored in a number type, even when some do not fit.
127
+
128
+ .. versionadded:: 0.1.0
129
+
130
+ Parameters
131
+ ----------
132
+ values
133
+ Numbers in a numpy dtype.
134
+ target_type
135
+ The number type to store them as.
136
+
137
+ Returns
138
+ -------
139
+ NDArray
140
+ The stored numbers; check them with ``find_lost_values``.
141
+
142
+ Examples
143
+ --------
144
+ >>> import numpy
145
+ >>> import numdaplot as ndp
146
+ >>> from numdaplot.tables.columns.number_conversion import store_numbers
147
+ >>> store_numbers(numpy.array([2.0]), ndp.Type.INT8)
148
+ array([2], dtype=int8)
149
+ """
150
+ target_dtype = to_numpy_dtype(target_type)
151
+ with numpy.errstate(invalid=IGNORED_FLOAT_ERROR, over=IGNORED_FLOAT_ERROR):
152
+ stored_values = values.astype(target_dtype)
153
+
154
+ return stored_values
155
+
156
+
157
+ def find_lost_values(values: NDArray[Any], stored_values: NDArray[Any]) -> NDArray[numpy.bool_]:
158
+ """
159
+ Return which numbers changed when stored in another number type, beyond the rounding of decimals.
160
+
161
+ .. versionadded:: 0.1.0
162
+
163
+ Parameters
164
+ ----------
165
+ values
166
+ The original numbers.
167
+ stored_values
168
+ The same numbers stored in another type.
169
+
170
+ Returns
171
+ -------
172
+ NDArray[numpy.bool_]
173
+ For a decimal type, True where a finite number became infinite. For an integer type,
174
+ True where the stored number differs from the original one.
175
+
176
+ Examples
177
+ --------
178
+ >>> import numpy
179
+ >>> from numdaplot.tables.columns.number_conversion import find_lost_values
180
+ >>> find_lost_values(numpy.array([2.0, 2.5]), numpy.array([2, 2]))
181
+ array([False, True])
182
+ """
183
+ if stored_values.dtype.kind == DECIMAL_KIND:
184
+ finite = numpy.isfinite(values)
185
+ infinite = numpy.isinf(stored_values)
186
+ overflowed = finite & infinite
187
+ return overflowed
188
+
189
+ with numpy.errstate(invalid=IGNORED_FLOAT_ERROR, over=IGNORED_FLOAT_ERROR):
190
+ restored_values = stored_values.astype(values.dtype)
191
+
192
+ changed = restored_values != values
193
+
194
+ return changed
195
+
196
+
197
+ def require_no_lost_value(
198
+ values: NDArray[Any], stored_values: NDArray[Any], source_type: Type, target_type: Type
199
+ ) -> None:
200
+ """
201
+ Check that numbers kept their value when stored in another number type.
202
+
203
+ .. versionadded:: 0.1.0
204
+
205
+ Parameters
206
+ ----------
207
+ values
208
+ The original numbers.
209
+ stored_values
210
+ The same numbers stored in the new type.
211
+ source_type
212
+ The type of the original numbers.
213
+ target_type
214
+ The new type.
215
+
216
+ Raises
217
+ ------
218
+ ValueConversionError
219
+ At the first number that changed.
220
+
221
+ Examples
222
+ --------
223
+ >>> import numpy
224
+ >>> import numdaplot as ndp
225
+ >>> from numdaplot.tables.columns.number_conversion import require_no_lost_value
226
+ >>> try:
227
+ ... require_no_lost_value(numpy.array([2.0, 2.5]), numpy.array([2, 2]), ndp.Type.FLOAT64, ndp.Type.INT64)
228
+ ... except ndp.ValueConversionError as error:
229
+ ... print(error)
230
+ Cannot store the FLOAT64 value 2.5 as INT64 without losing information.
231
+ """
232
+ lost = find_lost_values(values, stored_values)
233
+ require_no_failed_value(values, lost, source_type, target_type)
234
+
235
+
236
+ def require_no_failed_value(
237
+ values: NDArray[Any], failed: NDArray[numpy.bool_], source_type: Type, target_type: Type
238
+ ) -> None:
239
+ """
240
+ Check that no value failed its conversion.
241
+
242
+ .. versionadded:: 0.1.0
243
+
244
+ Parameters
245
+ ----------
246
+ values
247
+ The original values, texts or numbers.
248
+ failed
249
+ True at each value that failed.
250
+ source_type
251
+ The type of the original values.
252
+ target_type
253
+ The new type.
254
+
255
+ Raises
256
+ ------
257
+ ValueConversionError
258
+ At the first failed value, which the message shows.
259
+
260
+ Examples
261
+ --------
262
+ >>> import numpy
263
+ >>> import numdaplot as ndp
264
+ >>> from numdaplot.tables.columns.number_conversion import require_no_failed_value
265
+ >>> texts = numpy.array(["12", "abc"])
266
+ >>> failed = numpy.array([False, True])
267
+ >>> try:
268
+ ... require_no_failed_value(texts, failed, ndp.Type.TEXT, ndp.Type.INT64)
269
+ ... except ndp.ValueConversionError as error:
270
+ ... print(error)
271
+ Cannot store the TEXT value 'abc' as INT64 without losing information.
272
+ """
273
+ has_failure = bool(failed.any())
274
+ if not has_failure:
275
+ return
276
+
277
+ failed_values = values[failed]
278
+ raw_values = failed_values.tolist()
279
+ python_values = cast(list[Any], raw_values)
280
+ rejected_value = python_values[0]
281
+ raise ValueConversionError(source_type.name, target_type.name, rejected_value)
@@ -0,0 +1,60 @@
1
+ """
2
+ Renaming of the columns of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import pandas
8
+
9
+ from numdaplot.tables.columns.column_names import require_known_columns, require_unique_names
10
+ from numdaplot.tables.columns.renaming import Renaming
11
+
12
+
13
+ def rename_frame_columns(frame: pandas.DataFrame, renaming: Renaming) -> pandas.DataFrame:
14
+ """
15
+ Return the columns of a Table with new names, every change applied at once.
16
+
17
+ Two columns can swap their names in a single renaming.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ frame
24
+ The columns of a Table.
25
+ renaming
26
+ The new names.
27
+
28
+ Returns
29
+ -------
30
+ pandas.DataFrame
31
+ The same columns, in the same order, renamed.
32
+
33
+ Raises
34
+ ------
35
+ ColumnNotFoundError
36
+ When a renamed column does not exist.
37
+ DuplicateColumnError
38
+ When a new name is the name of a column kept as it is.
39
+
40
+ Examples
41
+ --------
42
+ >>> import pandas
43
+ >>> import numdaplot as ndp
44
+ >>> from numdaplot.tables.columns.renamed_columns import rename_frame_columns
45
+ >>> frame = pandas.DataFrame({"low": [1.0], "high": [9.0]})
46
+ >>> swap = [ndp.NameChange(old_name="low", new_name="high"), ndp.NameChange(old_name="high", new_name="low")]
47
+ >>> rename_frame_columns(frame, ndp.Renaming(changes=swap))
48
+ high low
49
+ 0 1.0 9.0
50
+ """
51
+ column_names = [str(column_name) for column_name in frame.columns]
52
+ old_names = [change.old_name for change in renaming.changes]
53
+ require_known_columns(old_names, column_names)
54
+ new_names_by_old_name = {change.old_name: change.new_name for change in renaming.changes}
55
+ final_names = [new_names_by_old_name.get(column_name, column_name) for column_name in column_names]
56
+ require_unique_names(final_names)
57
+ renamed_frame = frame.copy(deep=False)
58
+ renamed_frame.columns = pandas.Index(final_names)
59
+
60
+ return renamed_frame
@@ -0,0 +1,81 @@
1
+ """
2
+ The new names of columns of a Table, applied at once.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.empty_list_error import EmptyListError
10
+ from numdaplot.settings.field_types import require_field_types
11
+ from numdaplot.tables.columns.column_names import require_unique_names
12
+ from numdaplot.tables.columns.name_change import NameChange
13
+
14
+ CHANGE_ITEM_NAME = "name change"
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Renaming:
19
+ """
20
+ The new names of columns of a Table, applied at once, used by ``Table.rename``.
21
+
22
+ Two columns can swap their names in a single renaming.
23
+
24
+ .. versionadded:: 0.1.0
25
+
26
+ Parameters
27
+ ----------
28
+ changes
29
+ The ``NameChange`` of each renamed column, at least one. The renaming keeps its own copy of the list.
30
+
31
+ Raises
32
+ ------
33
+ InvalidTypeError
34
+ When a setting is not of the type its annotation names.
35
+ EmptyListError
36
+ When ``changes`` is an empty list.
37
+ DuplicateColumnError
38
+ When a column is renamed twice, or two columns receive the same new name.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> low = ndp.Array.from_list([1.0, 2.0])
44
+ >>> high = ndp.Array.from_list([9.0, 8.0])
45
+ >>> bounds = ndp.Table.from_arrays({"low": low, "high": high})
46
+ >>> swap = [ndp.NameChange(old_name="low", new_name="high"), ndp.NameChange(old_name="high", new_name="low")]
47
+ >>> bounds.rename(ndp.Renaming(changes=swap))
48
+ high low
49
+ FLOAT64 FLOAT64
50
+ 0 1.0 9.0
51
+ 1 2.0 8.0
52
+ """
53
+
54
+ changes: list[NameChange]
55
+
56
+ def __post_init__(self) -> None:
57
+ """
58
+ Check the list of changes and replace it with a copy that only the renaming holds.
59
+
60
+ .. versionadded:: 0.1.0
61
+
62
+ Raises
63
+ ------
64
+ InvalidTypeError
65
+ When a setting is not of the type its annotation names.
66
+ EmptyListError
67
+ When ``changes`` is an empty list.
68
+ DuplicateColumnError
69
+ When a column is renamed twice, or two columns receive the same new name.
70
+ """
71
+ require_field_types(self)
72
+
73
+ if self.changes == []:
74
+ raise EmptyListError(CHANGE_ITEM_NAME)
75
+
76
+ old_names = [change.old_name for change in self.changes]
77
+ require_unique_names(old_names)
78
+ new_names = [change.new_name for change in self.changes]
79
+ require_unique_names(new_names)
80
+ changes_copy = list(self.changes)
81
+ object.__setattr__(self, "changes", changes_copy)
@@ -0,0 +1,70 @@
1
+ """
2
+ Conversion of text columns to booleans.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+
9
+ from numdaplot.data_types.type import Type
10
+ from numdaplot.errors.value_conversion_error import ValueConversionError
11
+ from numdaplot.tables.frames.column import Column
12
+ from numdaplot.tables.frames.column_values import (
13
+ build_column_with_missing,
14
+ find_column_missing,
15
+ find_column_type,
16
+ read_present_values,
17
+ )
18
+
19
+ TRUE_TEXT = "true"
20
+ FALSE_TEXT = "false"
21
+
22
+
23
+ def parse_booleans(column: Column) -> Column:
24
+ """
25
+ Return a text or category column read as booleans.
26
+
27
+ ``"true"`` and ``"false"`` are accepted whatever their case and the spaces around them.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ column
34
+ A text or category column.
35
+
36
+ Returns
37
+ -------
38
+ Column
39
+ A ``BOOL`` column, missing values staying missing.
40
+
41
+ Raises
42
+ ------
43
+ ValueConversionError
44
+ At the first text that is neither ``"true"`` nor ``"false"``.
45
+
46
+ Examples
47
+ --------
48
+ >>> import pandas
49
+ >>> from numdaplot.tables.columns.text_conversion import parse_booleans
50
+ >>> parse_booleans(pandas.Series(["True", " false ", None], dtype="string")).tolist()
51
+ [True, False, <NA>]
52
+ """
53
+ source_type = find_column_type(column)
54
+ missing = find_column_missing(column)
55
+ texts = read_present_values(column)
56
+ stripped_texts = numpy.strings.strip(texts)
57
+ lowered_texts = numpy.strings.lower(stripped_texts)
58
+ is_true = lowered_texts == TRUE_TEXT
59
+ is_false = lowered_texts == FALSE_TEXT
60
+ is_known = is_true | is_false
61
+ is_unknown = ~is_known
62
+ has_unknown = bool(is_unknown.any())
63
+ if has_unknown:
64
+ unknown_texts = texts[is_unknown]
65
+ first_unknown_text = unknown_texts[0]
66
+ raise ValueConversionError(source_type.name, Type.BOOL.name, first_unknown_text)
67
+
68
+ boolean_column = build_column_with_missing(is_true, missing)
69
+
70
+ return boolean_column