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,82 @@
1
+ """
2
+ Which rows of a Table a preview shows.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Side(Enum):
11
+ """
12
+ Which rows of a Table a ``Preview`` shows.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
20
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
21
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
22
+ >>> sales.preview(ndp.Preview(count=1, side=ndp.Side.END))
23
+ city price
24
+ TEXT FLOAT64
25
+ 2 Paris 150.0
26
+ >>> sales.preview(ndp.Preview(count=2, side=ndp.Side.RANDOM, seed=42))
27
+ city price
28
+ TEXT FLOAT64
29
+ 0 Paris 120.0
30
+ 2 Paris 150.0
31
+ """
32
+
33
+ START = auto()
34
+ """
35
+ The first rows. Default value.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
41
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
42
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
43
+ >>> sales.preview(ndp.Preview(count=2, side=ndp.Side.START))
44
+ city price
45
+ TEXT FLOAT64
46
+ 0 Paris 120.0
47
+ 1 Lyon 80.0
48
+ """
49
+
50
+ END = auto()
51
+ """
52
+ The last rows.
53
+
54
+ Examples
55
+ --------
56
+ >>> import numdaplot as ndp
57
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
58
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
59
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
60
+ >>> sales.preview(ndp.Preview(count=2, side=ndp.Side.END))
61
+ city price
62
+ TEXT FLOAT64
63
+ 1 Lyon 80.0
64
+ 2 Paris 150.0
65
+ """
66
+
67
+ RANDOM = auto()
68
+ """
69
+ Rows drawn at random, shown in the order of the Table.
70
+
71
+ Examples
72
+ --------
73
+ >>> import numdaplot as ndp
74
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
75
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
76
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
77
+ >>> sales.preview(ndp.Preview(count=2, side=ndp.Side.RANDOM, seed=42))
78
+ city price
79
+ TEXT FLOAT64
80
+ 0 Paris 120.0
81
+ 2 Paris 150.0
82
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Sort of the rows of a Table by one or several columns.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,71 @@
1
+ """
2
+ A column the rows of a Table are sorted by.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.ordering.missing_position import MissingPosition
10
+ from numdaplot.ordering.order import Order
11
+ from numdaplot.settings.field_types import require_field_types
12
+ from numdaplot.tables.columns.column_names import require_column_name
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class SortKey:
17
+ """
18
+ A column the rows of a Table are sorted by, used by ``Sorting``.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ column
25
+ The name of the column.
26
+ order
27
+ Ascending by default.
28
+ missing
29
+ Place of the missing values, last by default whatever the order.
30
+
31
+ Raises
32
+ ------
33
+ InvalidTypeError
34
+ When a setting is not of the type its annotation names.
35
+ InvalidColumnNameError
36
+ When ``column`` is an empty text.
37
+
38
+ Examples
39
+ --------
40
+ >>> import numdaplot as ndp
41
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
42
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
43
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
44
+ >>> sales.sort(ndp.Sorting(keys=[ndp.SortKey(column="price", order=ndp.Order.DESCENDING)]))
45
+ city price
46
+ TEXT FLOAT64
47
+ 0 Paris 150.0
48
+ 1 Paris 120.0
49
+ 2 Lyon 80.0
50
+ """
51
+
52
+ column: str
53
+ order: Order = Order.ASCENDING
54
+ missing: MissingPosition = MissingPosition.LAST
55
+
56
+ def __post_init__(self) -> None:
57
+ """
58
+ Check that the column name is a non-empty text.
59
+
60
+ .. versionadded:: 0.1.0
61
+
62
+ Raises
63
+ ------
64
+ InvalidTypeError
65
+ When a setting is not of the type its annotation names.
66
+ InvalidColumnNameError
67
+ When ``column`` is an empty text.
68
+ """
69
+ require_field_types(self)
70
+
71
+ require_column_name(self.column)
@@ -0,0 +1,81 @@
1
+ """
2
+ Sort of the rows of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Literal
8
+
9
+ import pandas
10
+
11
+ from numdaplot.ordering.missing_position import MissingPosition
12
+ from numdaplot.ordering.order import Order
13
+ from numdaplot.tables.columns.column_names import require_known_columns
14
+ from numdaplot.tables.sorting.sorting import Sorting
15
+
16
+ STABLE_SORT = "stable"
17
+ MISSING_PLACES = dict[MissingPosition, Literal["first", "last"]](
18
+ {
19
+ MissingPosition.FIRST: "first",
20
+ MissingPosition.LAST: "last",
21
+ }
22
+ )
23
+
24
+
25
+ def sort_frame(frame: pandas.DataFrame, sorting: Sorting) -> pandas.DataFrame:
26
+ """
27
+ Return the rows of a Table sorted by several columns, each with its own order and place of missing values.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ frame
34
+ The columns of a Table.
35
+ sorting
36
+ The sort keys.
37
+
38
+ Returns
39
+ -------
40
+ pandas.DataFrame
41
+ The sorted rows, numbered from 0. Rows equal on every key keep their order.
42
+
43
+ Raises
44
+ ------
45
+ ColumnNotFoundError
46
+ When a key names a column the Table does not have.
47
+
48
+ Examples
49
+ --------
50
+ >>> import pandas
51
+ >>> import numdaplot as ndp
52
+ >>> from numdaplot.tables.sorting.sorted_frame import sort_frame
53
+ >>> frame = pandas.DataFrame({"city": ["Pau", "Lyon", "Pau"], "price": [1.0, 2.0, 3.0]})
54
+ >>> by_city = ndp.SortKey(column="city")
55
+ >>> by_price = ndp.SortKey(column="price", order=ndp.Order.DESCENDING)
56
+ >>> sort_frame(frame, ndp.Sorting(keys=[by_city, by_price]))
57
+ city price
58
+ 0 Lyon 2.0
59
+ 1 Pau 3.0
60
+ 2 Pau 1.0
61
+ """
62
+ column_names = [str(column_name) for column_name in frame.columns]
63
+ key_columns = [key.column for key in sorting.keys]
64
+ require_known_columns(key_columns, column_names)
65
+ sorted_frame = frame
66
+ reversed_keys = reversed(sorting.keys)
67
+
68
+ # A stable sort by the last key first leaves the rows sorted by every key in order.
69
+ for key in reversed_keys:
70
+ is_ascending = key.order == Order.ASCENDING
71
+ missing_place = MISSING_PLACES[key.missing]
72
+ sorted_frame = sorted_frame.sort_values(
73
+ by=key.column,
74
+ ascending=is_ascending,
75
+ na_position=missing_place,
76
+ kind=STABLE_SORT,
77
+ )
78
+
79
+ numbered_frame = sorted_frame.reset_index(drop=True)
80
+
81
+ return numbered_frame
@@ -0,0 +1,82 @@
1
+ """
2
+ Settings of the sort of the rows of a 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.settings.field_types import require_field_types
11
+ from numdaplot.tables.columns.column_names import require_unique_names
12
+ from numdaplot.tables.sorting.sort_key import SortKey
13
+
14
+ SORT_KEY_ITEM_NAME = "sort key"
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Sorting:
19
+ """
20
+ Columns the rows of a Table are sorted by, used by ``Table.sort``.
21
+
22
+ Rows are sorted by the first key, then rows with the same value by the second key, and so on.
23
+ Rows equal on every key keep their order.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ keys
30
+ The sort keys, at least one, each on a different column. The sorting keeps its own copy of the list.
31
+
32
+ Raises
33
+ ------
34
+ InvalidTypeError
35
+ When a setting is not of the type its annotation names.
36
+ EmptyListError
37
+ When ``keys`` is empty.
38
+ DuplicateColumnError
39
+ When two keys sort the same column.
40
+
41
+ Examples
42
+ --------
43
+ >>> import numdaplot as ndp
44
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
45
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
46
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
47
+ >>> by_city = ndp.SortKey(column="city")
48
+ >>> by_price = ndp.SortKey(column="price", order=ndp.Order.DESCENDING)
49
+ >>> sales.sort(ndp.Sorting(keys=[by_city, by_price]))
50
+ city price
51
+ TEXT FLOAT64
52
+ 0 Lyon 80.0
53
+ 1 Paris 150.0
54
+ 2 Paris 120.0
55
+ """
56
+
57
+ keys: list[SortKey]
58
+
59
+ def __post_init__(self) -> None:
60
+ """
61
+ Check the keys and replace them with a copy that only the sorting holds.
62
+
63
+ .. versionadded:: 0.1.0
64
+
65
+ Raises
66
+ ------
67
+ InvalidTypeError
68
+ When a setting is not of the type its annotation names.
69
+ EmptyListError
70
+ When ``keys`` is empty.
71
+ DuplicateColumnError
72
+ When two keys sort the same column.
73
+ """
74
+ require_field_types(self)
75
+
76
+ if self.keys == []:
77
+ raise EmptyListError(SORT_KEY_ITEM_NAME)
78
+
79
+ key_columns = [key.column for key in self.keys]
80
+ require_unique_names(key_columns)
81
+ keys_copy = list(self.keys)
82
+ object.__setattr__(self, "keys", keys_copy)
@@ -0,0 +1,71 @@
1
+ """
2
+ The ``ndp.Table`` class: named columns, each holding values of one type.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.tables.table_calculation import TableCalculation
8
+ from numdaplot.tables.table_columns import TableColumns
9
+ from numdaplot.tables.table_conversion import TableConversion
10
+ from numdaplot.tables.table_display import TableDisplay
11
+ from numdaplot.tables.table_joining import TableJoining
12
+ from numdaplot.tables.table_layout import TableLayout
13
+ from numdaplot.tables.table_missing import TableMissing
14
+ from numdaplot.tables.table_reading import TableReading
15
+ from numdaplot.tables.table_refusals import TableRefusals
16
+ from numdaplot.tables.table_selection import TableSelection
17
+ from numdaplot.tables.table_writing import TableWriting
18
+
19
+
20
+ class Table(
21
+ TableReading,
22
+ TableWriting,
23
+ TableConversion,
24
+ TableSelection,
25
+ TableColumns,
26
+ TableCalculation,
27
+ TableLayout,
28
+ TableJoining,
29
+ TableMissing,
30
+ TableDisplay,
31
+ TableRefusals,
32
+ ):
33
+ """
34
+ Named columns, each holding values of one type, wrapping a pandas DataFrame.
35
+
36
+ A Table never changes: every operation returns a new Table. Its rows are numbered from 0, and renumbered
37
+ after a filter or a sort. Integer, boolean and text columns accept missing values.
38
+
39
+ - Create it with ``from_csv``, ``from_json``, ``from_excel``, ``from_parquet``, ``from_stata``, ``from_sas``,
40
+ ``from_xpt``, ``from_pandas`` or ``from_arrays``.
41
+ - Write it with ``to_csv``, ``to_json``, ``to_excel``, ``to_parquet`` or ``to_stata``.
42
+ - Select rows with ``filter`` and ``take``, check values with ``check``, read a column with ``column``.
43
+ - Change columns with ``choose_columns``, ``rename``, ``convert`` and ``add_column``.
44
+ - Compute with ``aggregate``, ``pivot_table`` and ``describe``.
45
+ - Rearrange rows with ``sort`` and ``drop_duplicates``, and combine two Tables with ``join``.
46
+ - Handle missing values with ``count_missing``, ``preview_missing`` and ``drop_missing``.
47
+ - Read it with ``row_count``, ``column_names``, ``column_types``, ``to_value``, ``to_pandas`` and ``is_equal``,
48
+ and show it with ``preview`` or ``print``.
49
+
50
+ Calling ``ndp.Table(...)``, comparisons, brackets, ``for``, ``in``, ``len`` and ``bool`` are refused
51
+ with ``RefusedOperationError``, which names the method to use instead.
52
+
53
+ .. versionadded:: 0.1.0
54
+
55
+ Examples
56
+ --------
57
+ >>> import numdaplot as ndp
58
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
59
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
60
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
61
+ >>> sales
62
+ city price
63
+ TEXT FLOAT64
64
+ 0 Paris 120.0
65
+ 1 Lyon 80.0
66
+ 2 Paris 150.0
67
+ >>> sales.row_count
68
+ 3
69
+ >>> sales.column_names
70
+ ['city', 'price']
71
+ """
@@ -0,0 +1,172 @@
1
+ """
2
+ Statistics of a Table: aggregation, pivot table and description.
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.aggregation.aggregated_frame import aggregate_frame
11
+ from numdaplot.tables.aggregation.aggregation import Aggregation
12
+ from numdaplot.tables.description.described_frame import describe_frame
13
+ from numdaplot.tables.description.description import Description
14
+ from numdaplot.tables.pivot.pivot_table import PivotTable
15
+ from numdaplot.tables.pivot.pivoted_frame import pivot_frame
16
+ from numdaplot.tables.table_data import TableData
17
+
18
+
19
+ class TableCalculation(TableData):
20
+ """
21
+ Statistics of a Table with ``aggregate``, ``pivot_table`` and ``describe``. Missing values are ignored.
22
+
23
+ .. versionadded:: 0.1.0
24
+ """
25
+
26
+ @checked_arguments
27
+ def aggregate(self, aggregation: Aggregation) -> Self:
28
+ """
29
+ Return statistics of the whole Table, or of each group of rows.
30
+
31
+ .. versionadded:: 0.1.0
32
+
33
+ Parameters
34
+ ----------
35
+ aggregation
36
+ The calculations, and the columns forming the groups.
37
+
38
+ Returns
39
+ -------
40
+ Self
41
+ A new Table: the group columns, then one column per calculation; one row per group, sorted by
42
+ group values with missing values as a group of their own, last. Without groups, a single row.
43
+ A statistic needing a value gives a missing value for a group without present value.
44
+
45
+ Raises
46
+ ------
47
+ InvalidTypeError
48
+ When an argument is not of the type its annotation names.
49
+ ColumnNotFoundError
50
+ When a calculation or a group names a column the Table does not have.
51
+ IncompatibleTypesError
52
+ When a statistic does not apply to the type of its column.
53
+
54
+ Examples
55
+ --------
56
+ >>> import numdaplot as ndp
57
+ >>> cities = ndp.Array.from_list(["Pau", "Lyon", "Pau"])
58
+ >>> prices = ndp.Array.from_list([10.0, 30.0, 20.0])
59
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
60
+ >>> average_price = ndp.Calculation(column="price", function=ndp.Mean())
61
+ >>> table.aggregate(ndp.Aggregation(calculations=[average_price], group_by=["city"]))
62
+ city price_mean
63
+ TEXT FLOAT64
64
+ 0 Lyon 30.0
65
+ 1 Pau 15.0
66
+ """
67
+ aggregated_frame = aggregate_frame(self._frame, aggregation)
68
+ aggregated_table = self._wrap(aggregated_frame)
69
+
70
+ return aggregated_table
71
+
72
+ @checked_arguments
73
+ def pivot_table(self, pivot: PivotTable) -> Self:
74
+ """
75
+ Return one statistic for each combination of groups of rows and values of a column, as a wide Table.
76
+
77
+ ``aggregate`` gives one row per combination: ``pivot_table`` gives one column per value of a column, as
78
+ ``Plot.heatmap`` draws them.
79
+
80
+ .. versionadded:: 0.1.0
81
+
82
+ Parameters
83
+ ----------
84
+ pivot
85
+ The columns forming the rows and the columns of the result, and the statistic of each cell.
86
+
87
+ Returns
88
+ -------
89
+ Self
90
+ A new Table: the columns of ``rows``, then one column per value of ``columns``, named after the value;
91
+ one row per group, sorted, with missing values as a group of their own, last.
92
+
93
+ Raises
94
+ ------
95
+ InvalidTypeError
96
+ When an argument is not of the type its annotation names.
97
+ ColumnNotFoundError
98
+ When a setting names a column the Table does not have.
99
+ RefusedOperationError
100
+ When the column of ``columns`` holds missing values: remove them with ``drop_missing``.
101
+ DuplicateColumnError
102
+ When a value written as a text is also the name of a column of ``rows``.
103
+ InvalidColumnNameError
104
+ When a value written as a text is empty.
105
+ IncompatibleTypesError
106
+ When the statistic does not apply to the type of its column.
107
+
108
+ Examples
109
+ --------
110
+ >>> import numdaplot as ndp
111
+ >>> hours = ndp.Array.from_list([8, 8, 9])
112
+ >>> weekdays = ndp.Array.from_list(["Mon", "Tue", "Mon"])
113
+ >>> fares = ndp.Array.from_list([7.0, 9.0, 5.0])
114
+ >>> trips = ndp.Table.from_arrays({"hour": hours, "weekday": weekdays, "fare": fares})
115
+ >>> trip_count = ndp.Calculation(column="fare", function=ndp.Count(missing=ndp.CountedMissing.INCLUDED))
116
+ >>> trips.pivot_table(ndp.PivotTable(rows=["hour"], columns="weekday", calculation=trip_count))
117
+ hour Mon Tue
118
+ INT64 INT64 INT64
119
+ 0 8 1 1
120
+ 1 9 1 0
121
+ """
122
+ pivoted_frame = pivot_frame(self._frame, pivot)
123
+ pivoted_table = self._wrap(pivoted_frame)
124
+
125
+ return pivoted_table
126
+
127
+ @checked_arguments
128
+ def describe(self, description: Description | None = None) -> Self:
129
+ """
130
+ Return statistics describing columns, one row per statistic and one column per described column.
131
+
132
+ .. versionadded:: 0.1.0
133
+
134
+ Parameters
135
+ ----------
136
+ description
137
+ The statistics and the columns. When omitted, every number column is described with the
138
+ statistics of pandas.
139
+
140
+ Returns
141
+ -------
142
+ Self
143
+ A new Table whose first column, ``statistic``, names each statistic, such as ``quantile_25``.
144
+ A cell is missing when the statistic does not apply to the column or finds no value.
145
+
146
+ Raises
147
+ ------
148
+ InvalidTypeError
149
+ When an argument is not of the type its annotation names.
150
+ ColumnNotFoundError
151
+ When a described column does not exist.
152
+ DuplicateColumnError
153
+ When a described column is named ``statistic``.
154
+
155
+ Examples
156
+ --------
157
+ >>> import numdaplot as ndp
158
+ >>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([10.0, 30.0])})
159
+ >>> table.describe(ndp.Description(functions=[ndp.Count(), ndp.Mean(), ndp.Max()]))
160
+ statistic price
161
+ TEXT FLOAT64
162
+ 0 count_excluded 2.0
163
+ 1 mean 20.0
164
+ 2 max 30.0
165
+ """
166
+ if description is None:
167
+ description = Description()
168
+
169
+ described_frame = describe_frame(self._frame, description)
170
+ described_table = self._wrap(described_frame)
171
+
172
+ return described_table