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,321 @@
1
+ """
2
+ Columns stored by a Table, shared by every group of Table methods.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Never, Self
8
+
9
+ import pandas
10
+
11
+ from numdaplot.data_types.type import Type
12
+ from numdaplot.dates.time_zone import TimeZone
13
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
14
+ from numdaplot.tables.columns.column_names import require_known_columns
15
+ from numdaplot.tables.files.column_names import ColumnNames
16
+ from numdaplot.tables.frames.cleaned_names import clean_frame_names
17
+ from numdaplot.tables.frames.column import Column
18
+ from numdaplot.tables.frames.column_values import find_column_type
19
+ from numdaplot.tables.frames.frame_normalization import normalize_frame
20
+ from numdaplot.tables.frames.time_columns import convert_outside_durations
21
+ from numdaplot.tables.frames.time_zones import find_column_time_zone
22
+
23
+ CONSTRUCTOR_OPERATION = "Creating a Table with ndp.Table(...)"
24
+ CONSTRUCTOR_ALTERNATIVE = "ndp.Table.from_arrays, from_pandas or a file method such as from_csv"
25
+
26
+
27
+ class TableData:
28
+ """
29
+ Columns stored by a Table, shared by every group of Table methods.
30
+
31
+ Use ``ndp.Table`` and its ``from_*`` methods; this base class only holds the columns.
32
+
33
+ .. versionadded:: 0.1.0
34
+ """
35
+
36
+ _frame: pandas.DataFrame
37
+
38
+ def __init__(self, *arguments: Never, **keyword_arguments: Never) -> None:
39
+ """
40
+ Refuse the creation of a Table by its constructor: the ``from_*`` methods create Tables.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ arguments
47
+ Any value, refused.
48
+ keyword_arguments
49
+ Any named value, refused.
50
+
51
+ Raises
52
+ ------
53
+ RefusedOperationError
54
+ Always, naming the ``from_*`` methods.
55
+ """
56
+ raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
57
+
58
+ @classmethod
59
+ def _create(cls, frame: pandas.DataFrame) -> Self:
60
+ """
61
+ Return a new Table storing normalized columns without copy.
62
+
63
+ .. versionadded:: 0.1.0
64
+
65
+ Parameters
66
+ ----------
67
+ frame
68
+ The columns, already stored with the dtypes given by ``to_pandas_dtype`` and numbered from 0,
69
+ never changed afterwards.
70
+
71
+ Returns
72
+ -------
73
+ Self
74
+ The new Table.
75
+ """
76
+ created_table = cls.__new__(cls)
77
+ created_table._frame = frame
78
+
79
+ return created_table
80
+
81
+ @property
82
+ def row_count(self) -> int:
83
+ """
84
+ Number of rows.
85
+
86
+ .. versionadded:: 0.1.0
87
+
88
+ Examples
89
+ --------
90
+ >>> import numdaplot as ndp
91
+ >>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5, 8.0])}).row_count
92
+ 2
93
+ """
94
+ row_count = len(self._frame)
95
+
96
+ return row_count
97
+
98
+ @property
99
+ def column_count(self) -> int:
100
+ """
101
+ Number of columns.
102
+
103
+ .. versionadded:: 0.1.0
104
+
105
+ Examples
106
+ --------
107
+ >>> import numdaplot as ndp
108
+ >>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5, 8.0])}).column_count
109
+ 1
110
+ """
111
+ column_count = len(self._frame.columns)
112
+
113
+ return column_count
114
+
115
+ @property
116
+ def column_names(self) -> list[str]:
117
+ """
118
+ Names of the columns, in order. Changing the returned list never changes the Table.
119
+
120
+ .. versionadded:: 0.1.0
121
+
122
+ Examples
123
+ --------
124
+ >>> import numdaplot as ndp
125
+ >>> cities = ndp.Array.from_list(["Paris"])
126
+ >>> prices = ndp.Array.from_list([1.5])
127
+ >>> ndp.Table.from_arrays({"city": cities, "price": prices}).column_names
128
+ ['city', 'price']
129
+ """
130
+ column_names = [str(column_name) for column_name in self._frame.columns]
131
+
132
+ return column_names
133
+
134
+ @property
135
+ def column_types(self) -> dict[str, Type]:
136
+ """
137
+ Type of each column, by column name, in the order of the columns.
138
+
139
+ .. versionadded:: 0.1.0
140
+
141
+ Examples
142
+ --------
143
+ >>> import numdaplot as ndp
144
+ >>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).column_types
145
+ {'price': <Type.FLOAT64: 10>}
146
+ """
147
+ column_types = dict[str, Type]()
148
+
149
+ for column_name in self.column_names:
150
+ column = self._frame[column_name]
151
+ column_type = find_column_type(column)
152
+ column_types[column_name] = column_type
153
+
154
+ return column_types
155
+
156
+ @property
157
+ def column_time_zones(self) -> dict[str, TimeZone | None]:
158
+ """
159
+ Time zone of each datetime column, by column name, ``None`` for a datetime column without zone.
160
+
161
+ Columns of other types are not listed.
162
+
163
+ .. versionadded:: 0.1.0
164
+
165
+ Examples
166
+ --------
167
+ >>> from datetime import datetime
168
+ >>> import numdaplot as ndp
169
+ >>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
170
+ >>> times.column_time_zones
171
+ {'time': None}
172
+ """
173
+ column_time_zones = dict[str, TimeZone | None]()
174
+
175
+ for column_name in self.column_names:
176
+ column = self._frame[column_name]
177
+ column_type = find_column_type(column)
178
+ if column_type == Type.DATETIME:
179
+ column_time_zones[column_name] = find_column_time_zone(column)
180
+
181
+ return column_time_zones
182
+
183
+ @classmethod
184
+ def _from_frame(cls, frame: pandas.DataFrame) -> Self:
185
+ """
186
+ Return a new Table holding the normalized copy of any pandas DataFrame.
187
+
188
+ .. versionadded:: 0.1.0
189
+
190
+ Parameters
191
+ ----------
192
+ frame
193
+ Any pandas DataFrame, which is not changed.
194
+
195
+ Returns
196
+ -------
197
+ Self
198
+ The new Table.
199
+
200
+ Raises
201
+ ------
202
+ InvalidColumnNameError, DuplicateColumnError, UnsupportedIndexError, UnsupportedTypeError
203
+ When the pandas DataFrame cannot become a Table, as in ``normalize_frame``.
204
+ """
205
+ normalized_frame = normalize_frame(frame)
206
+ table = cls._create(normalized_frame)
207
+
208
+ return table
209
+
210
+ @classmethod
211
+ def _from_read_frame(cls, frame: pandas.DataFrame, column_names: ColumnNames) -> Self:
212
+ """
213
+ Return a new Table holding a DataFrame read from a file or given by the user, its names cleaned when asked.
214
+
215
+ .. versionadded:: 0.1.0
216
+
217
+ Parameters
218
+ ----------
219
+ frame
220
+ A pandas DataFrame read from outside numdaplot, which is not changed.
221
+ column_names
222
+ Whether the spaces, tabs and line breaks at the start and the end of each name are removed.
223
+
224
+ Returns
225
+ -------
226
+ Self
227
+ The new Table.
228
+
229
+ Raises
230
+ ------
231
+ DuplicateColumnError
232
+ When two names become the same once cleaned, or a name appears twice.
233
+ InvalidColumnNameError, UnsupportedIndexError, UnsupportedTypeError
234
+ When the pandas DataFrame cannot become a Table, as in ``normalize_frame``.
235
+ """
236
+ cleaned_frame = clean_frame_names(frame, column_names)
237
+ duration_frame = convert_outside_durations(cleaned_frame)
238
+ table = cls._from_frame(duration_frame)
239
+
240
+ return table
241
+
242
+ def _wrap(self, frame: pandas.DataFrame) -> Self:
243
+ """
244
+ Return a new Table of the same class holding other normalized columns.
245
+
246
+ .. versionadded:: 0.1.0
247
+
248
+ Parameters
249
+ ----------
250
+ frame
251
+ The columns of the new Table, stored without copy.
252
+
253
+ Returns
254
+ -------
255
+ Self
256
+ The new Table.
257
+ """
258
+ table_class = type(self)
259
+ wrapped_table = table_class._create(frame)
260
+
261
+ return wrapped_table
262
+
263
+ def _read_column(self, column_name: str) -> Column:
264
+ """
265
+ Return a column of the Table.
266
+
267
+ .. versionadded:: 0.1.0
268
+
269
+ Parameters
270
+ ----------
271
+ column_name
272
+ The name of the column.
273
+
274
+ Returns
275
+ -------
276
+ Column
277
+ The stored column, which must not be changed.
278
+
279
+ Raises
280
+ ------
281
+ ColumnNotFoundError
282
+ When no column has this name.
283
+ """
284
+ requested_names = [column_name]
285
+ require_known_columns(requested_names, self.column_names)
286
+ column = self._frame[column_name]
287
+
288
+ return column
289
+
290
+
291
+ def read_stored_frame(table: TableData) -> pandas.DataFrame:
292
+ """
293
+ Return the columns a Table stores, without copy, for the code of numdaplot that reads them.
294
+
295
+ Unlike ``Table.to_pandas``, times of day stay stored as the time since midnight.
296
+
297
+ .. versionadded:: 0.1.0
298
+
299
+ Parameters
300
+ ----------
301
+ table
302
+ A Table.
303
+
304
+ Returns
305
+ -------
306
+ pandas.DataFrame
307
+ The stored columns, which must not be changed.
308
+
309
+ Examples
310
+ --------
311
+ >>> from datetime import time
312
+ >>> import numdaplot as ndp
313
+ >>> from numdaplot.tables.table_data import read_stored_frame
314
+ >>> hours = ndp.Table.from_arrays({"hour": ndp.Array.from_list([time(0, 1)])})
315
+ >>> read_stored_frame(hours).dtypes.tolist()
316
+ [dtype('<m8[us]')]
317
+ """
318
+ # The function lives next to the class to read its stored columns on behalf of the rest of numdaplot.
319
+ stored_frame = table._frame # pyright: ignore[reportPrivateUsage]
320
+
321
+ return stored_frame
@@ -0,0 +1,56 @@
1
+ """
2
+ Display of a few rows of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.settings.argument_types import checked_arguments
8
+ from numdaplot.tables.preview.notebook_display import show_frame
9
+ from numdaplot.tables.preview.preview import Preview
10
+ from numdaplot.tables.preview.preview_rows import choose_preview_rows
11
+ from numdaplot.tables.table_data import TableData
12
+
13
+
14
+ class TableDisplay(TableData):
15
+ """
16
+ Display of a few rows of a Table with ``preview``.
17
+
18
+ .. versionadded:: 0.1.0
19
+ """
20
+
21
+ @checked_arguments
22
+ def preview(self, preview: Preview | None = None) -> None:
23
+ """
24
+ Show a few rows, with their row numbers and the type of each column under its name.
25
+
26
+ In a Jupyter notebook the rows are shown as an HTML table, elsewhere as text. Every column is shown unless
27
+ the settings ask for a compact display. Nothing is returned.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ preview
34
+ How many rows, which ones, and how the columns are shown: the first 5, with every column, when omitted.
35
+
36
+
37
+ Raises
38
+ ------
39
+ InvalidTypeError
40
+ When an argument is not of the type its annotation names.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([10.0, 20.0, 30.0])})
46
+ >>> table.preview(ndp.Preview(count=2, side=ndp.Side.END))
47
+ price
48
+ FLOAT64
49
+ 1 20.0
50
+ 2 30.0
51
+ """
52
+ if preview is None:
53
+ preview = Preview()
54
+
55
+ preview_frame = choose_preview_rows(self._frame, preview)
56
+ show_frame(preview_frame, preview.columns)
@@ -0,0 +1,80 @@
1
+ """
2
+ Join of a Table with another Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Self
8
+
9
+ from numdaplot.settings.argument_types import checked_arguments
10
+ from numdaplot.tables.joining.join import Join
11
+ from numdaplot.tables.joining.joined_frame import join_frames
12
+ from numdaplot.tables.table_data import TableData
13
+
14
+
15
+ class TableJoining(TableData):
16
+ """
17
+ Join of a Table with another Table on the values of key columns, with ``join``.
18
+
19
+ .. versionadded:: 0.1.0
20
+ """
21
+
22
+ @checked_arguments
23
+ def join(self, join: Join) -> Self:
24
+ """
25
+ Return the rows of this Table and of another Table put side by side where their keys match.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ join
32
+ The other Table, the key columns, the rows kept, how the columns both Tables have are told apart, and
33
+ how many times each key may appear.
34
+
35
+ Returns
36
+ -------
37
+ Self
38
+ A new Table: the keys, then the other columns of this Table, then those of the other Table. The rows of
39
+ this Table come first, in their order, each once per match, then the unmatched rows of the other Table
40
+ kept by the mode. Missing values fill the columns of a Table that has no matching row, each column
41
+ keeping its type.
42
+
43
+ Raises
44
+ ------
45
+ InvalidTypeError
46
+ When an argument is not of the type its annotation names.
47
+ ColumnNotFoundError
48
+ When a key is missing from one of the Tables.
49
+ IncompatibleTypesError
50
+ When the two columns of a key are of different families, of different types with ``KeyTypes.SAME_TYPE``,
51
+ or a date and a datetime: convert one of them first.
52
+ TimeZoneMismatchError
53
+ When the two columns of a key hold datetimes of different time zones, or with and without one: change
54
+ them first with ``TimeZoneChange``.
55
+ JoinRelationError
56
+ When a key is repeated in a Table where the ``relation`` of the join expects it once.
57
+ DuplicateColumnError
58
+ When both Tables have a column besides the keys and the join has no ``suffixes``, or a suffixed name is
59
+ already the name of another column.
60
+
61
+ Examples
62
+ --------
63
+ >>> import numdaplot as ndp
64
+ >>> accidents = ndp.Table.from_arrays(
65
+ ... {"Num_Acc": ndp.Array.from_list([101, 102]), "dep": ndp.Array.from_list(["75", "69"])}
66
+ ... )
67
+ >>> users = ndp.Table.from_arrays(
68
+ ... {"Num_Acc": ndp.Array.from_list([101, 101, 103]), "grav": ndp.Array.from_list([1, 3, 2])}
69
+ ... )
70
+ >>> accidents.join(ndp.Join(other=users, keys=["Num_Acc"], mode=ndp.JoinMode.LEFT))
71
+ Num_Acc dep grav
72
+ INT64 TEXT INT64
73
+ 0 101 75 1
74
+ 1 101 75 3
75
+ 2 102 69 <NA>
76
+ """
77
+ joined_frame = join_frames(self._frame, join)
78
+ joined_table = self._wrap(joined_frame)
79
+
80
+ return joined_table
@@ -0,0 +1,105 @@
1
+ """
2
+ Order and uniqueness of the rows of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Self
8
+
9
+ from numdaplot.settings.argument_types import checked_arguments
10
+ from numdaplot.tables.duplicates.deduplicated_frame import drop_duplicate_rows
11
+ from numdaplot.tables.duplicates.deduplication import Deduplication
12
+ from numdaplot.tables.sorting.sorted_frame import sort_frame
13
+ from numdaplot.tables.sorting.sorting import Sorting
14
+ from numdaplot.tables.table_data import TableData
15
+
16
+
17
+ class TableLayout(TableData):
18
+ """
19
+ Order and uniqueness of the rows of a Table with ``sort`` and ``drop_duplicates``.
20
+
21
+ .. versionadded:: 0.1.0
22
+ """
23
+
24
+ @checked_arguments
25
+ def sort(self, sorting: Sorting) -> Self:
26
+ """
27
+ Return the rows sorted by one or several columns.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ sorting
34
+ The sort keys, each with its order and the place of its missing values.
35
+
36
+ Returns
37
+ -------
38
+ Self
39
+ A new Table, rows numbered from 0. Rows equal on every key keep their order.
40
+
41
+ Raises
42
+ ------
43
+ InvalidTypeError
44
+ When an argument is not of the type its annotation names.
45
+ ColumnNotFoundError
46
+ When a key names a column the Table does not have.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([20.0, 10.0, 30.0])})
52
+ >>> table.sort(ndp.Sorting(keys=[ndp.SortKey(column="price", order=ndp.Order.DESCENDING)]))
53
+ price
54
+ FLOAT64
55
+ 0 30.0
56
+ 1 20.0
57
+ 2 10.0
58
+ """
59
+ sorted_frame = sort_frame(self._frame, sorting)
60
+ sorted_table = self._wrap(sorted_frame)
61
+
62
+ return sorted_table
63
+
64
+ @checked_arguments
65
+ def drop_duplicates(self, deduplication: Deduplication | None = None) -> Self:
66
+ """
67
+ Return the Table without its duplicated rows.
68
+
69
+ .. versionadded:: 0.1.0
70
+
71
+ Parameters
72
+ ----------
73
+ deduplication
74
+ The compared columns, every column when omitted, and the row kept in each group.
75
+ Two missing values are equal.
76
+
77
+ Returns
78
+ -------
79
+ Self
80
+ A new Table, remaining rows in their order, numbered from 0.
81
+
82
+ Raises
83
+ ------
84
+ InvalidTypeError
85
+ When an argument is not of the type its annotation names.
86
+ ColumnNotFoundError
87
+ When a compared column does not exist.
88
+
89
+ Examples
90
+ --------
91
+ >>> import numdaplot as ndp
92
+ >>> table = ndp.Table.from_arrays({"city": ndp.Array.from_list(["Pau", "Lyon", "Pau"])})
93
+ >>> table.drop_duplicates()
94
+ city
95
+ TEXT
96
+ 0 Pau
97
+ 1 Lyon
98
+ """
99
+ if deduplication is None:
100
+ deduplication = Deduplication()
101
+
102
+ remaining_frame = drop_duplicate_rows(self._frame, deduplication)
103
+ remaining_table = self._wrap(remaining_frame)
104
+
105
+ return remaining_table
@@ -0,0 +1,146 @@
1
+ """
2
+ Missing values of a Table: count, summary and removal.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Self
8
+
9
+ from numdaplot.positions.axis import Axis
10
+ from numdaplot.settings.argument_types import checked_arguments
11
+ from numdaplot.tables.missing.missing_count import MissingCount
12
+ from numdaplot.tables.missing.missing_counts import count_frame_missing
13
+ from numdaplot.tables.missing.missing_drop import MissingDrop
14
+ from numdaplot.tables.missing.missing_removal import drop_frame_missing
15
+ from numdaplot.tables.missing.missing_summary import summarize_missing
16
+ from numdaplot.tables.preview.notebook_display import show_pandas_frame
17
+ from numdaplot.tables.table_data import TableData
18
+
19
+
20
+ class TableMissing(TableData):
21
+ """
22
+ Missing values of a Table with ``count_missing``, ``preview_missing`` and ``drop_missing``.
23
+
24
+ .. versionadded:: 0.1.0
25
+ """
26
+
27
+ @checked_arguments
28
+ def count_missing(self, missing_count: MissingCount | None = None, axis: Axis | None = None) -> Self:
29
+ """
30
+ Return the number or the ratio of missing values, for the whole Table, each row or each column.
31
+
32
+ .. versionadded:: 0.1.0
33
+
34
+ Parameters
35
+ ----------
36
+ missing_count
37
+ The measure, the number of missing values when omitted.
38
+ axis
39
+ One count per row with ``Axis.EACH_ROW``, one per column with ``Axis.EACH_COLUMN``, a single count for
40
+ the whole Table when omitted.
41
+
42
+ Returns
43
+ -------
44
+ Self
45
+ A new Table with a ``missing_count`` column, or ``missing_ratio`` for ``Measure.RATIO``:
46
+ one row for the whole Table, read with ``to_value``, one row per row, or one row per column after
47
+ a ``column`` column naming it. A ratio is missing when there is no value to count.
48
+
49
+
50
+ Raises
51
+ ------
52
+ InvalidTypeError
53
+ When an argument is not of the type its annotation names.
54
+
55
+ Examples
56
+ --------
57
+ >>> import numdaplot as ndp
58
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Nice"])
59
+ >>> prices = ndp.Array.from_list([120.0, None, None, 90.0])
60
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
61
+ >>> table.count_missing().to_value()
62
+ 2
63
+ >>> table.count_missing(ndp.MissingCount(measure=ndp.Measure.RATIO), axis=ndp.Axis.EACH_COLUMN)
64
+ column missing_ratio
65
+ TEXT FLOAT64
66
+ 0 city 0.0
67
+ 1 price 0.5
68
+ """
69
+ if missing_count is None:
70
+ missing_count = MissingCount()
71
+
72
+ count_frame = count_frame_missing(self._frame, missing_count, axis)
73
+ count_table = self._wrap(count_frame)
74
+
75
+ return count_table
76
+
77
+ def preview_missing(self) -> None:
78
+ """
79
+ Show the number and the percentage of missing values of each column, then of the whole Table.
80
+
81
+ In a Jupyter notebook the summary is shown as an HTML table, elsewhere as text. Nothing is returned:
82
+ use ``count_missing`` to compute with these numbers.
83
+
84
+ .. versionadded:: 0.1.0
85
+
86
+ Examples
87
+ --------
88
+ >>> import numdaplot as ndp
89
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
90
+ >>> prices = ndp.Array.from_list([120.0, None, 150.0])
91
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
92
+ >>> table.preview_missing()
93
+ column type missing_count missing_ratio
94
+ 0 city TEXT 0 0.0 %
95
+ 1 price FLOAT64 1 33.3 %
96
+ 2 (all columns) 1 16.7 %
97
+ """
98
+ summary = summarize_missing(self._frame)
99
+ show_pandas_frame(summary)
100
+
101
+ @checked_arguments
102
+ def drop_missing(self, missing_drop: MissingDrop | None = None, axis: Axis = Axis.EACH_ROW) -> Self:
103
+ """
104
+ Return the Table without its rows, or its columns, holding missing values.
105
+
106
+ .. versionadded:: 0.1.0
107
+
108
+ Parameters
109
+ ----------
110
+ missing_drop
111
+ The columns looked at and how many missing values are needed: a single one in any column when
112
+ omitted.
113
+ axis
114
+ ``Axis.EACH_ROW`` by default to remove rows, ``Axis.EACH_COLUMN`` to remove columns.
115
+
116
+ Returns
117
+ -------
118
+ Self
119
+ A new Table, remaining rows in their order and numbered from 0, or remaining columns in their order.
120
+
121
+ Raises
122
+ ------
123
+ InvalidTypeError
124
+ When an argument is not of the type its annotation names.
125
+ ColumnNotFoundError
126
+ When a looked at column does not exist.
127
+
128
+ Examples
129
+ --------
130
+ >>> import numdaplot as ndp
131
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
132
+ >>> prices = ndp.Array.from_list([120.0, None, 150.0])
133
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
134
+ >>> table.drop_missing()
135
+ city price
136
+ TEXT FLOAT64
137
+ 0 Paris 120.0
138
+ 1 Pau 150.0
139
+ """
140
+ if missing_drop is None:
141
+ missing_drop = MissingDrop()
142
+
143
+ remaining_frame = drop_frame_missing(self._frame, missing_drop, axis)
144
+ remaining_table = self._wrap(remaining_frame)
145
+
146
+ return remaining_table