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,257 @@
1
+ """
2
+ Removal of the rows or the columns of a Table holding missing values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ import pandas
9
+ from numpy.typing import NDArray
10
+
11
+ from numdaplot.positions.axis import Axis
12
+ from numdaplot.tables.columns.column_names import require_known_columns
13
+ from numdaplot.tables.missing.missing_counts import (
14
+ COLUMN_SUM_AXIS,
15
+ ROW_SUM_AXIS,
16
+ divide_counts,
17
+ find_frame_missing,
18
+ )
19
+ from numdaplot.tables.missing.missing_drop import MissingDrop
20
+ from numdaplot.tables.missing.missing_mode import MissingMode
21
+ from numdaplot.tables.missing.missing_ratio import MissingRatio
22
+ from numdaplot.tables.missing.ratio_comparison import RatioComparison
23
+
24
+
25
+ def drop_frame_missing(frame: pandas.DataFrame, missing_drop: MissingDrop, axis: Axis) -> pandas.DataFrame:
26
+ """
27
+ Return a Table without its rows or its columns holding too many missing values.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ frame
34
+ The columns of a Table.
35
+ missing_drop
36
+ The columns looked at and the rule deciding what is removed.
37
+ axis
38
+ ``EACH_ROW`` to remove rows, ``EACH_COLUMN`` to remove columns.
39
+
40
+ Returns
41
+ -------
42
+ pandas.DataFrame
43
+ The remaining rows, in their order and numbered from 0, or the remaining columns, in their order.
44
+
45
+ Raises
46
+ ------
47
+ ColumnNotFoundError
48
+ When a looked at column does not exist.
49
+
50
+ Examples
51
+ --------
52
+ >>> import pandas
53
+ >>> import numdaplot as ndp
54
+ >>> from numdaplot.tables.missing.missing_removal import drop_frame_missing
55
+ >>> frame = pandas.DataFrame({"price": [1.5, None, 3.0]})
56
+ >>> drop_frame_missing(frame, ndp.MissingDrop(), ndp.Axis.EACH_ROW)
57
+ price
58
+ 0 1.5
59
+ 1 3.0
60
+ """
61
+ looked_names = [str(column_name) for column_name in frame.columns]
62
+ if missing_drop.columns is not None:
63
+ require_known_columns(missing_drop.columns, looked_names)
64
+ looked_names = missing_drop.columns
65
+
66
+ looked_frame = frame[looked_names]
67
+ if axis == Axis.EACH_COLUMN:
68
+ remaining_columns = drop_missing_columns(frame, looked_frame, missing_drop.rule)
69
+ return remaining_columns
70
+
71
+ remaining_rows = drop_missing_rows(frame, looked_frame, missing_drop.rule)
72
+
73
+ return remaining_rows
74
+
75
+
76
+ def drop_missing_rows(
77
+ frame: pandas.DataFrame,
78
+ looked_frame: pandas.DataFrame,
79
+ rule: MissingMode | MissingRatio,
80
+ ) -> pandas.DataFrame:
81
+ """
82
+ Return a Table without the rows holding too many missing values in some of its columns.
83
+
84
+ .. versionadded:: 0.1.0
85
+
86
+ Parameters
87
+ ----------
88
+ frame
89
+ The columns of a Table.
90
+ looked_frame
91
+ The columns whose missing values are counted on each row.
92
+ rule
93
+ How many missing values make a row removed.
94
+
95
+ Returns
96
+ -------
97
+ pandas.DataFrame
98
+ The remaining rows, in their order, numbered from 0.
99
+
100
+ Examples
101
+ --------
102
+ >>> import pandas
103
+ >>> import numdaplot as ndp
104
+ >>> from numdaplot.tables.missing.missing_removal import drop_missing_rows
105
+ >>> frame = pandas.DataFrame({"price": [1.5, None], "stock": [None, None]}, dtype="float64")
106
+ >>> drop_missing_rows(frame, frame, ndp.MissingMode.ALL)
107
+ price stock
108
+ 0 1.5 NaN
109
+ """
110
+ missing_grid = find_frame_missing(looked_frame)
111
+ row_counts = missing_grid.sum(axis=ROW_SUM_AXIS, dtype=numpy.int64)
112
+ looked_column_count = len(looked_frame.columns)
113
+ dropped = find_dropped(row_counts, looked_column_count, rule)
114
+ kept = ~dropped
115
+ kept_frame = frame[kept]
116
+ numbered_frame = kept_frame.reset_index(drop=True)
117
+
118
+ return numbered_frame
119
+
120
+
121
+ def drop_missing_columns(
122
+ frame: pandas.DataFrame,
123
+ looked_frame: pandas.DataFrame,
124
+ rule: MissingMode | MissingRatio,
125
+ ) -> pandas.DataFrame:
126
+ """
127
+ Return a Table without the columns holding too many missing values, among some of its columns.
128
+
129
+ .. versionadded:: 0.1.0
130
+
131
+ Parameters
132
+ ----------
133
+ frame
134
+ The columns of a Table.
135
+ looked_frame
136
+ The columns that may be removed.
137
+ rule
138
+ How many missing values make a column removed.
139
+
140
+ Returns
141
+ -------
142
+ pandas.DataFrame
143
+ The remaining columns, in their order.
144
+
145
+ Examples
146
+ --------
147
+ >>> import pandas
148
+ >>> import numdaplot as ndp
149
+ >>> from numdaplot.tables.missing.missing_removal import drop_missing_columns
150
+ >>> frame = pandas.DataFrame({"price": [1.5, None], "stock": [None, None]}, dtype="float64")
151
+ >>> drop_missing_columns(frame, frame, ndp.MissingMode.ALL)
152
+ price
153
+ 0 1.5
154
+ 1 NaN
155
+ """
156
+ missing_grid = find_frame_missing(looked_frame)
157
+ column_counts = missing_grid.sum(axis=COLUMN_SUM_AXIS, dtype=numpy.int64)
158
+ row_count = len(looked_frame)
159
+ dropped = find_dropped(column_counts, row_count, rule)
160
+ looked_names = [str(column_name) for column_name in looked_frame.columns]
161
+ dropped_names = [name for name, is_dropped in zip(looked_names, dropped, strict=True) if is_dropped]
162
+ remaining_frame = frame.drop(columns=dropped_names)
163
+
164
+ return remaining_frame
165
+
166
+
167
+ def find_dropped(
168
+ counts: NDArray[numpy.int64],
169
+ value_count: int,
170
+ rule: MissingMode | MissingRatio,
171
+ ) -> NDArray[numpy.bool_]:
172
+ """
173
+ Return which rows or columns hold too many missing values.
174
+
175
+ .. versionadded:: 0.1.0
176
+
177
+ Parameters
178
+ ----------
179
+ counts
180
+ The number of missing values of each row or column.
181
+ value_count
182
+ The number of values of each row or column.
183
+ rule
184
+ How many missing values make a row or a column removed.
185
+
186
+ Returns
187
+ -------
188
+ NDArray[numpy.bool_]
189
+ True at each row or column to remove, never True when there is no value.
190
+
191
+ Examples
192
+ --------
193
+ >>> import numpy
194
+ >>> import numdaplot as ndp
195
+ >>> from numdaplot.tables.missing.missing_removal import find_dropped
196
+ >>> find_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingMode.ALL)
197
+ array([False, False, True])
198
+ >>> find_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE))
199
+ array([False, False, True])
200
+ """
201
+ if value_count == 0:
202
+ nothing_dropped = numpy.zeros(counts.shape, dtype=numpy.bool_)
203
+ return nothing_dropped
204
+
205
+ if isinstance(rule, MissingRatio):
206
+ ratio_dropped = find_ratio_dropped(counts, value_count, rule)
207
+ return ratio_dropped
208
+
209
+ if rule == MissingMode.ALL:
210
+ all_missing = counts == value_count
211
+ return all_missing
212
+
213
+ any_missing = counts > 0
214
+
215
+ return any_missing
216
+
217
+
218
+ def find_ratio_dropped(
219
+ counts: NDArray[numpy.int64],
220
+ value_count: int,
221
+ missing_ratio: MissingRatio,
222
+ ) -> NDArray[numpy.bool_]:
223
+ """
224
+ Return which rows or columns reach a ratio of missing values.
225
+
226
+ .. versionadded:: 0.1.0
227
+
228
+ Parameters
229
+ ----------
230
+ counts
231
+ The number of missing values of each row or column.
232
+ value_count
233
+ The number of values of each row or column, at least 1.
234
+ missing_ratio
235
+ The threshold and how a ratio is compared with it.
236
+
237
+ Returns
238
+ -------
239
+ NDArray[numpy.bool_]
240
+ True at each row or column whose ratio reaches the threshold.
241
+
242
+ Examples
243
+ --------
244
+ >>> import numpy
245
+ >>> import numdaplot as ndp
246
+ >>> from numdaplot.tables.missing.missing_removal import find_ratio_dropped
247
+ >>> find_ratio_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingRatio(0.5))
248
+ array([False, True, True])
249
+ """
250
+ ratios = divide_counts(counts, value_count)
251
+ if missing_ratio.comparison == RatioComparison.ABOVE:
252
+ above_ratio = ratios > missing_ratio.ratio
253
+ return above_ratio
254
+
255
+ at_least_ratio = ratios >= missing_ratio.ratio
256
+
257
+ return at_least_ratio
@@ -0,0 +1,174 @@
1
+ """
2
+ Summary of the missing values of each column of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ import pandas
9
+
10
+ from numdaplot.tables.frames.column_values import find_column_type
11
+ from numdaplot.tables.frames.time_zones import name_column_type
12
+ from numdaplot.tables.missing.missing_counts import COLUMN_SUM_AXIS, divide_counts, find_frame_missing
13
+
14
+ COLUMN_NAMES_COLUMN = "column"
15
+ TYPE_NAMES_COLUMN = "type"
16
+ COUNTS_COLUMN = "missing_count"
17
+ RATIOS_COLUMN = "missing_ratio"
18
+ TOTAL_LABEL = "(all columns)"
19
+ TOTAL_TYPE_NAME = ""
20
+ SUMMARY_TEXT_DTYPE = "string"
21
+ PERCENT_FORMAT = "{percent:.1f} %"
22
+ PERCENT_FACTOR = 100
23
+
24
+
25
+ def summarize_missing(frame: pandas.DataFrame) -> pandas.DataFrame:
26
+ """
27
+ Return the number and the percentage of missing values of each column of a Table, then of the whole Table.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ frame
34
+ The columns of a Table.
35
+
36
+ Returns
37
+ -------
38
+ pandas.DataFrame
39
+ One row per column, in order, then an ``(all columns)`` row, with the columns ``column``, ``type``,
40
+ ``missing_count`` and ``missing_ratio``. The ratios are texts such as ``"12.5 %"``,
41
+ missing when there is no value.
42
+
43
+ Examples
44
+ --------
45
+ >>> import pandas
46
+ >>> from numdaplot.tables.missing.missing_summary import summarize_missing
47
+ >>> summarize_missing(pandas.DataFrame({"price": [1.5, None, 3.0], "stock": [2.0, 4.0, 1.0]}))
48
+ column type missing_count missing_ratio
49
+ 0 price FLOAT64 1 33.3 %
50
+ 1 stock FLOAT64 0 0.0 %
51
+ 2 (all columns) 1 16.7 %
52
+ """
53
+ missing_grid = find_frame_missing(frame)
54
+ row_count = len(frame)
55
+ column_counts = missing_grid.sum(axis=COLUMN_SUM_AXIS, dtype=numpy.int64)
56
+ column_ratios = divide_counts(column_counts, row_count)
57
+ missing_total = column_counts.sum(dtype=numpy.int64)
58
+ total_counts = numpy.array([missing_total], dtype=numpy.int64)
59
+ total_ratios = divide_counts(total_counts, missing_grid.size)
60
+ counts = numpy.concatenate([column_counts, total_counts])
61
+ ratios = numpy.concatenate([column_ratios, total_ratios])
62
+ ratio_texts = [format_ratio(ratio) for ratio in ratios]
63
+ summary_names = list_summary_names(frame)
64
+ type_names = list_summary_types(frame)
65
+ summary_columns = {
66
+ COLUMN_NAMES_COLUMN: summary_names,
67
+ TYPE_NAMES_COLUMN: type_names,
68
+ COUNTS_COLUMN: counts,
69
+ RATIOS_COLUMN: ratio_texts,
70
+ }
71
+ raw_summary = pandas.DataFrame(summary_columns)
72
+ summary_dtypes = dict.fromkeys([COLUMN_NAMES_COLUMN, TYPE_NAMES_COLUMN, RATIOS_COLUMN], SUMMARY_TEXT_DTYPE)
73
+ summary = raw_summary.astype(summary_dtypes)
74
+
75
+ return summary
76
+
77
+
78
+ def list_summary_names(frame: pandas.DataFrame) -> list[str]:
79
+ """
80
+ Return the labels of the rows of a summary: the names of the columns, then ``(all columns)``.
81
+
82
+ .. versionadded:: 0.1.0
83
+
84
+ Parameters
85
+ ----------
86
+ frame
87
+ The columns of a Table.
88
+
89
+ Returns
90
+ -------
91
+ list[str]
92
+ One label per column, in order, then the label of the total row.
93
+
94
+ Examples
95
+ --------
96
+ >>> import pandas
97
+ >>> from numdaplot.tables.missing.missing_summary import list_summary_names
98
+ >>> list_summary_names(pandas.DataFrame({"price": [1.5]}))
99
+ ['price', '(all columns)']
100
+ """
101
+ column_names = [str(column_name) for column_name in frame.columns]
102
+ summary_names = [*column_names, TOTAL_LABEL]
103
+
104
+ return summary_names
105
+
106
+
107
+ def list_summary_types(frame: pandas.DataFrame) -> list[str]:
108
+ """
109
+ Return the type names of the rows of a summary: the type of each column, then an empty text.
110
+
111
+ .. versionadded:: 0.1.0
112
+
113
+ Parameters
114
+ ----------
115
+ frame
116
+ The columns of a Table.
117
+
118
+ Returns
119
+ -------
120
+ list[str]
121
+ The ``ndp.Type`` name of each column, with its time zone when it has one, in order, then an empty
122
+ text for the total row.
123
+
124
+ Examples
125
+ --------
126
+ >>> import pandas
127
+ >>> from numdaplot.tables.missing.missing_summary import list_summary_types
128
+ >>> list_summary_types(pandas.DataFrame({"price": [1.5]}))
129
+ ['FLOAT64', '']
130
+ """
131
+ type_names = list[str]()
132
+
133
+ for column_name in frame.columns:
134
+ column = frame[column_name]
135
+ column_type = find_column_type(column)
136
+ type_name = name_column_type(column, column_type)
137
+ type_names.append(type_name)
138
+
139
+ type_names.append(TOTAL_TYPE_NAME)
140
+
141
+ return type_names
142
+
143
+
144
+ def format_ratio(ratio: numpy.float64) -> str | None:
145
+ """
146
+ Return a fraction written as a percentage with one decimal.
147
+
148
+ .. versionadded:: 0.1.0
149
+
150
+ Parameters
151
+ ----------
152
+ ratio
153
+ A fraction between 0 and 1, or NaN when there is no value.
154
+
155
+ Returns
156
+ -------
157
+ str or None
158
+ The percentage, such as ``"12.5 %"``, or ``None`` for NaN.
159
+
160
+ Examples
161
+ --------
162
+ >>> import numpy
163
+ >>> from numdaplot.tables.missing.missing_summary import format_ratio
164
+ >>> format_ratio(numpy.float64(0.125))
165
+ '12.5 %'
166
+ """
167
+ is_missing = bool(numpy.isnan(ratio))
168
+ if is_missing:
169
+ return None
170
+
171
+ percent = ratio * PERCENT_FACTOR
172
+ ratio_text = PERCENT_FORMAT.format(percent=percent)
173
+
174
+ return ratio_text
@@ -0,0 +1,70 @@
1
+ """
2
+ How a ratio of missing values is compared with its threshold.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class RatioComparison(Enum):
11
+ """
12
+ How a ratio of missing values is compared with its threshold, used by ``MissingRatio``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
20
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
21
+ >>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
22
+ >>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE)
23
+ >>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
24
+ price stock
25
+ FLOAT64 FLOAT64
26
+ 0 120.0 3.0
27
+ 1 NaN 5.0
28
+ 2 80.0 NaN
29
+ 3 NaN 2.0
30
+ """
31
+
32
+ AT_LEAST = auto()
33
+ """
34
+ The ratio reaches the threshold or goes beyond it. Default value.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
40
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
41
+ >>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
42
+ >>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.AT_LEAST)
43
+ >>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
44
+ stock
45
+ FLOAT64
46
+ 0 3.0
47
+ 1 5.0
48
+ 2 NaN
49
+ 3 2.0
50
+ """
51
+
52
+ ABOVE = auto()
53
+ """
54
+ The ratio goes beyond the threshold.
55
+
56
+ Examples
57
+ --------
58
+ >>> import numdaplot as ndp
59
+ >>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
60
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
61
+ >>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
62
+ >>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE)
63
+ >>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
64
+ price stock
65
+ FLOAT64 FLOAT64
66
+ 0 120.0 3.0
67
+ 1 NaN 5.0
68
+ 2 80.0 NaN
69
+ 3 NaN 2.0
70
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Pivot tables: one column per value of a column of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,104 @@
1
+ """
2
+ Settings of a pivot table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.empty_list_error import EmptyListError
10
+ from numdaplot.errors.refused_setting_error import RefusedSettingError
11
+ from numdaplot.settings.field_types import require_field_types
12
+ from numdaplot.tables.aggregation.calculation import Calculation
13
+ from numdaplot.tables.columns.column_names import require_column_name, require_column_names, require_unique_names
14
+
15
+ ROW_COLUMN_ITEM_NAME = "row column"
16
+ RESULT_NAME_SETTING = "the result_name of its calculation"
17
+ PIVOT_TABLE_NAME = "PivotTable"
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class PivotTable:
22
+ """
23
+ One row per group of rows and one column per value of a column, used by ``Table.pivot_table``.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ rows
30
+ The names of the columns whose values form the rows of the result: one row per combination of values, sorted,
31
+ with missing values as a group of their own, last. The pivot table keeps its own copy of the list.
32
+ columns
33
+ The name of the column whose values become the columns of the result, sorted. It cannot hold missing values.
34
+ The values are written as texts: ``"Paris"``, ``"8"`` for 8 and 8.0, ``"2.5"``, ``"2026-12-31"``.
35
+ calculation
36
+ The statistic of each cell. A combination without any row gives what the statistic gives without value: 0
37
+ for ``Count`` and ``Sum``, a missing value for ``Mean`` or ``Max``. Its ``result_name`` is refused, since each
38
+ result column is named after a value.
39
+
40
+ Raises
41
+ ------
42
+ InvalidTypeError
43
+ When a setting is not of the type its annotation names.
44
+ EmptyListError
45
+ When ``rows`` is an empty list.
46
+ InvalidColumnNameError
47
+ When ``columns`` or a name in ``rows`` is an empty text.
48
+ DuplicateColumnError
49
+ When a name appears twice among ``rows`` and ``columns``.
50
+ RefusedSettingError
51
+ When the calculation has a ``result_name``.
52
+
53
+ Examples
54
+ --------
55
+ >>> import numdaplot as ndp
56
+ >>> hours = ndp.Array.from_list([8, 8, 9])
57
+ >>> weekdays = ndp.Array.from_list(["Mon", "Tue", "Mon"])
58
+ >>> fares = ndp.Array.from_list([7.0, 9.0, 5.0])
59
+ >>> trips = ndp.Table.from_arrays({"hour": hours, "weekday": weekdays, "fare": fares})
60
+ >>> total_fare = ndp.Calculation(column="fare", function=ndp.Sum())
61
+ >>> trips.pivot_table(ndp.PivotTable(rows=["hour"], columns="weekday", calculation=total_fare))
62
+ hour Mon Tue
63
+ INT64 FLOAT64 FLOAT64
64
+ 0 8 7.0 9.0
65
+ 1 9 5.0 0.0
66
+ """
67
+
68
+ rows: list[str]
69
+ columns: str
70
+ calculation: Calculation
71
+
72
+ def __post_init__(self) -> None:
73
+ """
74
+ Check the names and the calculation, and replace ``rows`` with a copy that only the pivot table holds.
75
+
76
+ .. versionadded:: 0.1.0
77
+
78
+ Raises
79
+ ------
80
+ InvalidTypeError
81
+ When a setting is not of the type its annotation names.
82
+ EmptyListError
83
+ When ``rows`` is an empty list.
84
+ InvalidColumnNameError
85
+ When ``columns`` or a name in ``rows`` is an empty text.
86
+ DuplicateColumnError
87
+ When a name appears twice among ``rows`` and ``columns``.
88
+ RefusedSettingError
89
+ When the calculation has a ``result_name``.
90
+ """
91
+ require_field_types(self)
92
+
93
+ if self.rows == []:
94
+ raise EmptyListError(ROW_COLUMN_ITEM_NAME)
95
+
96
+ if self.calculation.result_name is not None:
97
+ raise RefusedSettingError(RESULT_NAME_SETTING, PIVOT_TABLE_NAME)
98
+
99
+ require_column_names(self.rows)
100
+ require_column_name(self.columns)
101
+ rows_copy = list(self.rows)
102
+ object.__setattr__(self, "rows", rows_copy)
103
+ grouping_names = [*rows_copy, self.columns]
104
+ require_unique_names(grouping_names)