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,123 @@
1
+ """
2
+ A statistic computed on a 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.statistics.statistic import Statistic
11
+ from numdaplot.tables.aggregation.statistic_name import name_statistic
12
+ from numdaplot.tables.columns.column_names import require_column_name
13
+
14
+ RESULT_NAME = "{column}_{function}"
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Calculation:
19
+ """
20
+ A statistic computed on a column of a Table, used by ``Aggregation``.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ column
27
+ The name of the column.
28
+ function
29
+ A ``Statistic``, such as ``ndp.Mean()`` or ``ndp.Quantile(0.9)``: see ``Statistic`` for every statistic.
30
+ Missing values are ignored, unless ``Count`` is set to include them.
31
+ result_name
32
+ The name of the result column. When omitted, it is ``<column>_<function>``, such as ``"price_mean"``
33
+ ``"price_quantile_90"`` or ``"price_count_excluded"``.
34
+
35
+ Raises
36
+ ------
37
+ InvalidTypeError
38
+ When a setting is not of the type its annotation names.
39
+ InvalidColumnNameError
40
+ When ``column`` is an empty text.
41
+ InvalidColumnNameError
42
+ When ``result_name`` is an empty text.
43
+ RefusedOperationError
44
+ When ``function`` is not a statistic of numdaplot.
45
+
46
+ Examples
47
+ --------
48
+ >>> import numdaplot as ndp
49
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
50
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
51
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
52
+ >>> total = ndp.Calculation(column="price", function=ndp.Sum())
53
+ >>> highest = ndp.Calculation(column="price", function=ndp.Max(), result_name="highest_price")
54
+ >>> sales.aggregate(ndp.Aggregation(calculations=[total, highest]))
55
+ price_sum highest_price
56
+ FLOAT64 FLOAT64
57
+ 0 350.0 150.0
58
+ """
59
+
60
+ column: str
61
+ function: Statistic
62
+ result_name: str | None = None
63
+
64
+ def __post_init__(self) -> None:
65
+ """
66
+ Check that the result name, given or automatic, is valid.
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 ``column`` is an empty text.
76
+ InvalidColumnNameError
77
+ When ``result_name`` is an empty text.
78
+ RefusedOperationError
79
+ When ``function`` is not a statistic of numdaplot.
80
+ """
81
+ require_field_types(self)
82
+
83
+ require_column_name(self.column)
84
+
85
+ result_name = find_result_name(self)
86
+ require_column_name(result_name)
87
+
88
+
89
+ def find_result_name(calculation: Calculation) -> str:
90
+ """
91
+ Return the name of the column holding the result of a calculation.
92
+
93
+ .. versionadded:: 0.1.0
94
+
95
+ Parameters
96
+ ----------
97
+ calculation
98
+ The calculation.
99
+
100
+ Returns
101
+ -------
102
+ str
103
+ The given result name, or ``<column>_<function>``.
104
+
105
+ Raises
106
+ ------
107
+ RefusedOperationError
108
+ When the statistic is not a statistic of numdaplot and no result name is given.
109
+
110
+ Examples
111
+ --------
112
+ >>> import numdaplot as ndp
113
+ >>> from numdaplot.tables.aggregation.calculation import find_result_name
114
+ >>> find_result_name(ndp.Calculation(column="price", function=ndp.Quantile(0.9)))
115
+ 'price_quantile_90'
116
+ """
117
+ if calculation.result_name is not None:
118
+ return calculation.result_name
119
+
120
+ function_name = name_statistic(calculation.function)
121
+ result_name = RESULT_NAME.format(column=calculation.column, function=function_name)
122
+
123
+ return result_name
@@ -0,0 +1,108 @@
1
+ """
2
+ Columns holding the results of statistics.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from numpy.typing import NDArray
11
+
12
+ from numdaplot.arrays.calculation.statistic_values import compute_statistic
13
+ from numdaplot.errors.empty_array_error import EmptyArrayError
14
+ from numdaplot.statistics.count import Count
15
+ from numdaplot.statistics.counted_missing import CountedMissing
16
+ from numdaplot.statistics.statistic import Statistic
17
+ from numdaplot.tables.frames.column import Column
18
+ from numdaplot.tables.frames.column_values import build_column, build_column_with_missing
19
+
20
+ MISSING_RESULT = numpy.nan
21
+
22
+
23
+ def compute_cell(present_values: NDArray[Any], statistic: Statistic, value_count: int) -> NDArray[Any] | None:
24
+ """
25
+ Return a statistic of present values, or nothing when it needs a value and there is none.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ present_values
32
+ One-dimensional values without missing value.
33
+ statistic
34
+ Any statistic of numdaplot.
35
+ value_count
36
+ The number of values before the missing ones were left out, the result of a ``Count`` including them.
37
+
38
+ Returns
39
+ -------
40
+ NDArray or None
41
+ The result as a one-value array, ``None`` when the statistic needs a value and there is none.
42
+
43
+ Raises
44
+ ------
45
+ IncompatibleTypesError
46
+ When the statistic does not apply to the type of the values.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numpy
51
+ >>> import numdaplot as ndp
52
+ >>> from numdaplot.tables.aggregation.result_column import compute_cell
53
+ >>> compute_cell(numpy.array([10.0, 30.0]), ndp.Mean(), 3)
54
+ array([20.])
55
+ >>> print(compute_cell(numpy.array([], dtype=float), ndp.Mean(), 1))
56
+ None
57
+ >>> compute_cell(numpy.array([10.0, 30.0]), ndp.Count(missing=ndp.CountedMissing.INCLUDED), 3)
58
+ array([3])
59
+ """
60
+ counts_every_value = isinstance(statistic, Count) and statistic.missing == CountedMissing.INCLUDED
61
+ if counts_every_value:
62
+ every_value_count = numpy.array([value_count])
63
+ return every_value_count
64
+
65
+ try:
66
+ result = compute_statistic(present_values, statistic, None)
67
+ except EmptyArrayError:
68
+ return None
69
+
70
+ return result
71
+
72
+
73
+ def build_result_column(results: list[NDArray[Any] | None]) -> Column:
74
+ """
75
+ Return a Table column holding one result per row, missing where there is no result.
76
+
77
+ .. versionadded:: 0.1.0
78
+
79
+ Parameters
80
+ ----------
81
+ results
82
+ One one-value array per row, or ``None`` for a missing result.
83
+
84
+ Returns
85
+ -------
86
+ Column
87
+ The column, ``FLOAT64`` when no row has a result.
88
+
89
+ Examples
90
+ --------
91
+ >>> import numpy
92
+ >>> from numdaplot.tables.aggregation.result_column import build_result_column
93
+ >>> build_result_column([numpy.array([2]), None]).tolist()
94
+ [2, <NA>]
95
+ """
96
+ missing_results = [result is None for result in results]
97
+ missing = numpy.array(missing_results, dtype=numpy.bool_)
98
+ present_results = [result for result in results if result is not None]
99
+ if present_results == []:
100
+ result_count = len(results)
101
+ missing_values = numpy.full(result_count, MISSING_RESULT)
102
+ missing_column = build_column(missing_values)
103
+ return missing_column
104
+
105
+ present_values = numpy.concatenate(present_results)
106
+ result_column = build_column_with_missing(present_values, missing)
107
+
108
+ return result_column
@@ -0,0 +1,96 @@
1
+ """
2
+ Groups of rows of a Table sharing the same values in some columns.
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
+ STABLE_SORT = "stable"
14
+
15
+
16
+ def find_row_groups(frame: pandas.DataFrame, group_by: list[str] | None) -> list[NDArray[Any]]:
17
+ """
18
+ Return the rows of each group, groups sorted by their values, the group of missing values last.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ frame
25
+ The columns of a Table.
26
+ group_by
27
+ The names of the columns forming the groups, or ``None`` for a single group of every row.
28
+
29
+ Returns
30
+ -------
31
+ list[NDArray]
32
+ The positions of the rows of each group, in the order of the Table.
33
+
34
+ Examples
35
+ --------
36
+ >>> import pandas
37
+ >>> from numdaplot.tables.aggregation.row_groups import find_row_groups
38
+ >>> find_row_groups(pandas.DataFrame({"city": ["Pau", "Lyon", "Pau"]}), ["city"])
39
+ [array([1]), array([0, 2])]
40
+ """
41
+ row_count = len(frame)
42
+ if group_by is None:
43
+ every_row = numpy.arange(row_count)
44
+ return [every_row]
45
+
46
+ # Some versions of the pandas stubs leave the parameter types of groupby unknown.
47
+ grouped_frame = cast(Any, frame)
48
+ grouped_rows = grouped_frame.groupby(group_by, sort=True, dropna=False, observed=True)
49
+ group_count = cast(int, grouped_rows.ngroups)
50
+ if group_count == 0:
51
+ return []
52
+
53
+ raw_group_numbers = grouped_rows.ngroup()
54
+ group_number_column = cast("pandas.Series[int]", raw_group_numbers)
55
+ group_numbers = group_number_column.to_numpy()
56
+ every_row = numpy.arange(row_count)
57
+ row_groups = split_positions(every_row, group_numbers, group_count)
58
+
59
+ return row_groups
60
+
61
+
62
+ def split_positions(positions: NDArray[Any], group_numbers: NDArray[Any], group_count: int) -> list[NDArray[Any]]:
63
+ """
64
+ Return the positions of each group, in their order, a group without position being empty.
65
+
66
+ .. versionadded:: 0.1.0
67
+
68
+ Parameters
69
+ ----------
70
+ positions
71
+ The positions of rows.
72
+ group_numbers
73
+ The number of the group of each position, from 0.
74
+ group_count
75
+ The number of groups.
76
+
77
+ Returns
78
+ -------
79
+ list[NDArray]
80
+ One array per group, ``group_count`` in all.
81
+
82
+ Examples
83
+ --------
84
+ >>> import numpy
85
+ >>> from numdaplot.tables.aggregation.row_groups import split_positions
86
+ >>> split_positions(numpy.array([4, 7, 9]), numpy.array([2, 0, 2]), 3)
87
+ [array([7]), array([], dtype=int64), array([4, 9])]
88
+ """
89
+ order = numpy.argsort(group_numbers, kind=STABLE_SORT)
90
+ sorted_positions = positions[order]
91
+ group_sizes = numpy.bincount(group_numbers, minlength=group_count)
92
+ group_ends = numpy.cumsum(group_sizes)
93
+ group_starts = group_ends[:-1]
94
+ position_groups = numpy.split(sorted_positions, group_starts)
95
+
96
+ return position_groups
@@ -0,0 +1,122 @@
1
+ """
2
+ Names of the statistics in the column names of an aggregation and in a description.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.arrays.calculation.statistic_values import UNKNOWN_STATISTIC_ALTERNATIVE, UNKNOWN_STATISTIC_OPERATION
8
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
9
+ from numdaplot.statistics.count import Count
10
+ from numdaplot.statistics.count_distinct import CountDistinct
11
+ from numdaplot.statistics.counted_missing import CountedMissing
12
+ from numdaplot.statistics.maximum import Max
13
+ from numdaplot.statistics.mean import Mean
14
+ from numdaplot.statistics.median import Median
15
+ from numdaplot.statistics.minimum import Min
16
+ from numdaplot.statistics.most_frequent import MostFrequent
17
+ from numdaplot.statistics.most_frequent_count import MostFrequentCount
18
+ from numdaplot.statistics.quantile import Quantile
19
+ from numdaplot.statistics.standard_deviation import StandardDeviation
20
+ from numdaplot.statistics.statistic import Statistic
21
+ from numdaplot.statistics.sum import Sum
22
+
23
+ STATISTIC_NAMES = {
24
+ Sum: "sum",
25
+ Mean: "mean",
26
+ Median: "median",
27
+ Min: "min",
28
+ Max: "max",
29
+ CountDistinct: "count_distinct",
30
+ StandardDeviation: "standard_deviation",
31
+ MostFrequent: "most_frequent",
32
+ MostFrequentCount: "most_frequent_count",
33
+ }
34
+ COUNT_NAMES = {
35
+ CountedMissing.EXCLUDED: "count_excluded",
36
+ CountedMissing.INCLUDED: "count_included",
37
+ }
38
+ QUANTILE_NAME = "quantile_{percent}"
39
+ PERCENT_FACTOR = 100
40
+ PERCENT_DIGITS = 10
41
+ GENERAL_NUMBER_FORMAT = "g"
42
+ DECIMAL_POINT = "."
43
+ NAME_SEPARATOR = "_"
44
+
45
+
46
+ def name_statistic(statistic: Statistic) -> str:
47
+ """
48
+ Return the name of a statistic, in lowercase words joined by underscores.
49
+
50
+ .. versionadded:: 0.1.0
51
+
52
+ Parameters
53
+ ----------
54
+ statistic
55
+ Any statistic of numdaplot.
56
+
57
+ Returns
58
+ -------
59
+ str
60
+ The name, such as ``standard_deviation``, ``quantile_90`` for ``Quantile(0.9)``, or ``count_excluded`` for
61
+ ``Count()``.
62
+
63
+ Raises
64
+ ------
65
+ RefusedOperationError
66
+ When the statistic is not a statistic of numdaplot.
67
+
68
+ Examples
69
+ --------
70
+ >>> import numdaplot as ndp
71
+ >>> from numdaplot.tables.aggregation.statistic_name import name_statistic
72
+ >>> name_statistic(ndp.CountDistinct())
73
+ 'count_distinct'
74
+ """
75
+ if isinstance(statistic, Quantile):
76
+ quantile_name = name_quantile(statistic)
77
+ return quantile_name
78
+
79
+ if isinstance(statistic, Count):
80
+ count_name = COUNT_NAMES[statistic.missing]
81
+ return count_name
82
+
83
+ statistic_class = type(statistic)
84
+ if statistic_class not in STATISTIC_NAMES:
85
+ operation = UNKNOWN_STATISTIC_OPERATION.format(statistic_name=statistic_class.__name__)
86
+ raise RefusedOperationError(operation, UNKNOWN_STATISTIC_ALTERNATIVE)
87
+
88
+ statistic_name = STATISTIC_NAMES[statistic_class]
89
+
90
+ return statistic_name
91
+
92
+
93
+ def name_quantile(quantile: Quantile) -> str:
94
+ """
95
+ Return the name of a quantile, holding its fraction as a percentage.
96
+
97
+ .. versionadded:: 0.1.0
98
+
99
+ Parameters
100
+ ----------
101
+ quantile
102
+ The quantile.
103
+
104
+ Returns
105
+ -------
106
+ str
107
+ ``quantile_90`` for 0.9, and ``quantile_97_5`` for 0.975: an underscore replaces the decimal point.
108
+
109
+ Examples
110
+ --------
111
+ >>> import numdaplot as ndp
112
+ >>> from numdaplot.tables.aggregation.statistic_name import name_quantile
113
+ >>> name_quantile(ndp.Quantile(0.975))
114
+ 'quantile_97_5'
115
+ """
116
+ percent = quantile.fraction * PERCENT_FACTOR
117
+ rounded_percent = round(percent, PERCENT_DIGITS)
118
+ percent_text = format(rounded_percent, GENERAL_NUMBER_FORMAT)
119
+ percent_name = percent_text.replace(DECIMAL_POINT, NAME_SEPARATOR)
120
+ quantile_name = QUANTILE_NAME.format(percent=percent_name)
121
+
122
+ return quantile_name
@@ -0,0 +1,5 @@
1
+ """
2
+ Column operations of a Table: names, choice, renaming, conversion and new columns.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,89 @@
1
+ """
2
+ Addition of a column to a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import pandas
8
+
9
+ from numdaplot.errors.dimension_error import DimensionError
10
+ from numdaplot.errors.duplicate_column_error import DuplicateColumnError
11
+ from numdaplot.errors.shape_mismatch_error import ShapeMismatchError
12
+ from numdaplot.tables.columns.new_column import NewColumn
13
+ from numdaplot.tables.conflict import Conflict
14
+ from numdaplot.tables.frames.column_values import build_column
15
+ from numdaplot.tables.frames.time_range_errors import TimeRangeErrors
16
+
17
+ ADD_COLUMN_OPERATION = "add_column"
18
+ ONE_DIMENSION = 1
19
+
20
+
21
+ def add_frame_column(frame: pandas.DataFrame, new_column: NewColumn) -> pandas.DataFrame:
22
+ """
23
+ Return the columns of a Table with one more column, or with a column replaced.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ frame
30
+ The columns of a Table, which are not changed.
31
+ new_column
32
+ The name, the values and what to do when the name exists.
33
+
34
+ Returns
35
+ -------
36
+ pandas.DataFrame
37
+ A new column is placed last; a replaced column keeps its place. A Table without column
38
+ takes as many rows as the new column has values.
39
+
40
+ Raises
41
+ ------
42
+ DimensionError
43
+ When the Array of values does not have one dimension.
44
+ ShapeMismatchError
45
+ When the Array does not have one value per row of the Table.
46
+ DuplicateColumnError
47
+ When the name exists and ``on_conflict`` is ``ERROR``.
48
+ TimeOverflowError
49
+ When the Array holds a datetime or a duration that nanoseconds cannot hold.
50
+
51
+ Examples
52
+ --------
53
+ >>> import pandas
54
+ >>> import numdaplot as ndp
55
+ >>> from numdaplot.tables.columns.added_column import add_frame_column
56
+ >>> frame = pandas.DataFrame({"price": [1.5, 8.0]})
57
+ >>> add_frame_column(frame, ndp.NewColumn(name="count", values=ndp.Array.from_list([2, 1])))
58
+ price count
59
+ 0 1.5 2
60
+ 1 8.0 1
61
+ """
62
+ values = new_column.values.to_numpy()
63
+ if values.ndim != ONE_DIMENSION:
64
+ raise DimensionError(ADD_COLUMN_OPERATION, values.ndim)
65
+
66
+ column_names = [str(column_name) for column_name in frame.columns]
67
+ value_count = values.size
68
+ row_count = len(frame)
69
+ has_columns = column_names != []
70
+ has_wrong_length = has_columns and value_count != row_count
71
+ if has_wrong_length:
72
+ raise ShapeMismatchError((value_count,), (row_count,))
73
+
74
+ name_exists = new_column.name in column_names
75
+ refuses_existing_name = name_exists and new_column.on_conflict == Conflict.ERROR
76
+ if refuses_existing_name:
77
+ raise DuplicateColumnError(new_column.name)
78
+
79
+ with TimeRangeErrors(ADD_COLUMN_OPERATION, new_column.name):
80
+ column = build_column(values)
81
+
82
+ extended_frame = frame.copy(deep=False)
83
+ if not has_columns:
84
+ row_numbers = pandas.RangeIndex(value_count)
85
+ extended_frame = pandas.DataFrame(index=row_numbers)
86
+
87
+ extended_frame[new_column.name] = column
88
+
89
+ return extended_frame
@@ -0,0 +1,144 @@
1
+ """
2
+ Conversion of Table columns between booleans and numbers.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any, cast
8
+
9
+ import numpy
10
+
11
+ from numdaplot.data_types.type import Type
12
+ from numdaplot.errors.value_conversion_error import ValueConversionError
13
+ from numdaplot.tables.columns.boolean_rule import BooleanRule
14
+ from numdaplot.tables.frames.column import Column
15
+ from numdaplot.tables.frames.column_values import (
16
+ build_column_with_missing,
17
+ find_column_missing,
18
+ find_column_type,
19
+ read_present_values,
20
+ )
21
+ from numdaplot.tables.frames.frame_normalization import convert_to_type
22
+
23
+ FALSE_NUMBER = 0
24
+ TRUE_NUMBER = 1
25
+
26
+
27
+ def convert_booleans_to_numbers(column: Column, target_type: Type) -> Column:
28
+ """
29
+ Return a boolean column as numbers: 1 for ``True`` and 0 for ``False``.
30
+
31
+ .. versionadded:: 0.1.0
32
+
33
+ Parameters
34
+ ----------
35
+ column
36
+ A ``BOOL`` column.
37
+ target_type
38
+ A number type.
39
+
40
+ Returns
41
+ -------
42
+ Column
43
+ The column of numbers, missing values staying missing.
44
+
45
+ Examples
46
+ --------
47
+ >>> import pandas
48
+ >>> import numdaplot as ndp
49
+ >>> from numdaplot.tables.columns.boolean_conversion import convert_booleans_to_numbers
50
+ >>> flags = pandas.Series([True, None, False], dtype="boolean")
51
+ >>> convert_booleans_to_numbers(flags, ndp.Type.FLOAT64).tolist()
52
+ [1.0, nan, 0.0]
53
+ """
54
+ number_column = convert_to_type(column, target_type)
55
+
56
+ return number_column
57
+
58
+
59
+ def convert_numbers_to_booleans(column: Column, rule: BooleanRule) -> Column:
60
+ """
61
+ Return a number column as booleans, each number read by a rule.
62
+
63
+ .. versionadded:: 0.1.0
64
+
65
+ Parameters
66
+ ----------
67
+ column
68
+ A number column.
69
+ rule
70
+ ``ZERO_ONE`` to accept only 0 and 1, ``NONZERO_TRUE`` to read every number but 0 as ``True``.
71
+
72
+ Returns
73
+ -------
74
+ Column
75
+ A ``BOOL`` column, missing values staying missing.
76
+
77
+ Raises
78
+ ------
79
+ ValueConversionError
80
+ With ``ZERO_ONE``, at the first number that is neither 0 nor 1.
81
+
82
+ Examples
83
+ --------
84
+ >>> import pandas
85
+ >>> import numdaplot as ndp
86
+ >>> from numdaplot.tables.columns.boolean_conversion import convert_numbers_to_booleans
87
+ >>> numbers = pandas.Series([1, None, 0], dtype="Int64")
88
+ >>> convert_numbers_to_booleans(numbers, ndp.BooleanRule.ZERO_ONE).tolist()
89
+ [True, <NA>, False]
90
+ """
91
+ missing = find_column_missing(column)
92
+ numbers = read_present_values(column)
93
+ if rule == BooleanRule.ZERO_ONE:
94
+ source_type = find_column_type(column)
95
+ require_zero_or_one(numbers, source_type)
96
+
97
+ is_true = numbers != FALSE_NUMBER
98
+ boolean_column = build_column_with_missing(is_true, missing)
99
+
100
+ return boolean_column
101
+
102
+
103
+ def require_zero_or_one(numbers: numpy.typing.NDArray[numpy.number], source_type: Type) -> None:
104
+ """
105
+ Check that every number is 0 or 1.
106
+
107
+ .. versionadded:: 0.1.0
108
+
109
+ Parameters
110
+ ----------
111
+ numbers
112
+ The present numbers of a column.
113
+ source_type
114
+ The type of the column, named in the error.
115
+
116
+ Raises
117
+ ------
118
+ ValueConversionError
119
+ At the first number that is neither 0 nor 1.
120
+
121
+ Examples
122
+ --------
123
+ >>> import numpy
124
+ >>> import numdaplot as ndp
125
+ >>> from numdaplot.tables.columns.boolean_conversion import require_zero_or_one
126
+ >>> try:
127
+ ... require_zero_or_one(numpy.array([1, 2, 0]), ndp.Type.INT64)
128
+ ... except ndp.ValueConversionError as error:
129
+ ... print(error)
130
+ Cannot store the INT64 value 2 as BOOL without losing information.
131
+ """
132
+ is_false = numbers == FALSE_NUMBER
133
+ is_true = numbers == TRUE_NUMBER
134
+ is_boolean = is_false | is_true
135
+ is_other = ~is_boolean
136
+ has_other = bool(is_other.any())
137
+ if not has_other:
138
+ return
139
+
140
+ other_numbers = numbers[is_other]
141
+ raw_numbers = other_numbers.tolist()
142
+ python_numbers = cast(list[Any], raw_numbers)
143
+ first_other_number = python_numbers[0]
144
+ raise ValueConversionError(source_type.name, Type.BOOL.name, first_other_number)