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,244 @@
1
+ """
2
+ Pivot table of the rows of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any, cast
8
+
9
+ import numpy
10
+ import pandas
11
+ from numpy.typing import NDArray
12
+
13
+ from numdaplot.data_types.type import Type
14
+ from numdaplot.errors.refused_operation_error import RefusedOperationError
15
+ from numdaplot.tables.aggregation.aggregated_frame import compute_group_results, take_group_keys
16
+ from numdaplot.tables.aggregation.row_groups import find_row_groups, split_positions
17
+ from numdaplot.tables.columns.column_names import require_known_columns, require_unique_names
18
+ from numdaplot.tables.columns.conversion import Conversion
19
+ from numdaplot.tables.columns.converted_column import convert_column
20
+ from numdaplot.tables.frames.column import Column
21
+ from numdaplot.tables.frames.column_values import find_column_missing, find_column_type
22
+ from numdaplot.tables.pivot.pivot_table import PivotTable
23
+
24
+ MISSING_PIVOT_OPERATION = "Pivoting the column {column_name!r} while it holds missing values"
25
+ MISSING_PIVOT_ALTERNATIVE = "drop_missing with ndp.MissingDrop(columns=[{column_name!r}])"
26
+ DECIMAL_TYPES = frozenset({Type.FLOAT32, Type.FLOAT64})
27
+ FIRST_ROW = 0
28
+ ROW_POSITION_DTYPE = numpy.int64
29
+
30
+
31
+ def pivot_frame(frame: pandas.DataFrame, pivot: PivotTable) -> pandas.DataFrame:
32
+ """
33
+ Return one row per group of rows and one column per value of a column.
34
+
35
+ .. versionadded:: 0.1.0
36
+
37
+ Parameters
38
+ ----------
39
+ frame
40
+ The columns of a Table.
41
+ pivot
42
+ The columns forming the rows and the columns of the result, and the statistic of each cell.
43
+
44
+ Returns
45
+ -------
46
+ pandas.DataFrame
47
+ The columns of ``rows``, then one column per value of ``columns``, both sorted.
48
+
49
+ Raises
50
+ ------
51
+ ColumnNotFoundError
52
+ When a setting names a column the Table does not have.
53
+ RefusedOperationError
54
+ When the column of ``columns`` holds missing values.
55
+ DuplicateColumnError
56
+ When a value written as a text is also the name of a column of ``rows``.
57
+ IncompatibleTypesError
58
+ When the statistic does not apply to the type of its column.
59
+
60
+ Examples
61
+ --------
62
+ >>> import pandas
63
+ >>> import numdaplot as ndp
64
+ >>> from numdaplot.tables.pivot.pivoted_frame import pivot_frame
65
+ >>> days = pandas.Series(["Mon", "Tue", "Mon"], dtype="string")
66
+ >>> frame = pandas.DataFrame({"hour": [8, 8, 9], "day": days, "fare": [7.0, 9.0, 5.0]})
67
+ >>> total = ndp.Calculation(column="fare", function=ndp.Sum())
68
+ >>> pivot_frame(frame, ndp.PivotTable(rows=["hour"], columns="day", calculation=total))
69
+ hour Mon Tue
70
+ 0 8 7.0 9.0
71
+ 1 9 5.0 0.0
72
+ """
73
+ column_names = [str(column_name) for column_name in frame.columns]
74
+ calculation = pivot.calculation
75
+ requested_names = [*pivot.rows, pivot.columns, calculation.column]
76
+ require_known_columns(requested_names, column_names)
77
+ pivot_column = frame[pivot.columns]
78
+ require_present_pivot_values(pivot_column, pivot.columns)
79
+ row_groups = find_row_groups(frame, pivot.rows)
80
+ column_groups = find_row_groups(frame, [pivot.columns])
81
+ value_names = name_value_columns(pivot_column, column_groups, pivot.columns)
82
+ output_names = [*pivot.rows, *value_names]
83
+ require_unique_names(output_names)
84
+ row_count = len(frame)
85
+ group_numbers = number_row_groups(row_groups, row_count)
86
+ group_count = len(row_groups)
87
+ result_columns = take_group_keys(frame, pivot.rows, row_groups)
88
+ value_column = frame[calculation.column]
89
+
90
+ for value_name, column_rows in zip(value_names, column_groups, strict=True):
91
+ column_group_numbers = group_numbers[column_rows]
92
+ cell_rows = split_positions(column_rows, column_group_numbers, group_count)
93
+ result_columns[value_name] = compute_group_results(value_column, calculation.function, cell_rows)
94
+
95
+ result_numbers = pandas.RangeIndex(group_count)
96
+ pivoted_frame = pandas.DataFrame(result_columns, index=result_numbers)
97
+
98
+ return pivoted_frame
99
+
100
+
101
+ def require_present_pivot_values(pivot_column: Column, column_name: str) -> None:
102
+ """
103
+ Check that the column giving its values to the result columns holds no missing value.
104
+
105
+ .. versionadded:: 0.1.0
106
+
107
+ Parameters
108
+ ----------
109
+ pivot_column
110
+ The column.
111
+ column_name
112
+ Its name.
113
+
114
+ Raises
115
+ ------
116
+ RefusedOperationError
117
+ When the column holds a missing value, which could not name a result column.
118
+
119
+ Examples
120
+ --------
121
+ >>> import pandas
122
+ >>> import numdaplot as ndp
123
+ >>> from numdaplot.tables.pivot.pivoted_frame import require_present_pivot_values
124
+ >>> try:
125
+ ... require_present_pivot_values(pandas.Series(["Mon", None], dtype="string"), "day")
126
+ ... except ndp.RefusedOperationError as error:
127
+ ... print(error)
128
+ Pivoting the column 'day' while it holds missing values is not available,
129
+ use drop_missing with ndp.MissingDrop(columns=['day']) instead.
130
+ """
131
+ missing = find_column_missing(pivot_column)
132
+ has_missing = bool(missing.any())
133
+ if has_missing:
134
+ operation = MISSING_PIVOT_OPERATION.format(column_name=column_name)
135
+ alternative = MISSING_PIVOT_ALTERNATIVE.format(column_name=column_name)
136
+ raise RefusedOperationError(operation, alternative)
137
+
138
+
139
+ def name_value_columns(pivot_column: Column, column_groups: list[NDArray[Any]], column_name: str) -> list[str]:
140
+ """
141
+ Return the name of the result column of each value, the value written as a text.
142
+
143
+ .. versionadded:: 0.1.0
144
+
145
+ Parameters
146
+ ----------
147
+ pivot_column
148
+ The column giving its values to the result columns.
149
+ column_groups
150
+ The rows of each value.
151
+ column_name
152
+ The name of the column.
153
+
154
+ Returns
155
+ -------
156
+ list[str]
157
+ One name per group. A whole decimal is written without decimal part.
158
+
159
+ Examples
160
+ --------
161
+ >>> import numpy
162
+ >>> import pandas
163
+ >>> from numdaplot.tables.pivot.pivoted_frame import name_value_columns
164
+ >>> name_value_columns(pandas.Series([1.0, 2.5]), [numpy.array([0]), numpy.array([1])], "hour")
165
+ ['1', '2.5']
166
+ """
167
+ first_row_list = [column_group[FIRST_ROW] for column_group in column_groups]
168
+ first_rows = numpy.array(first_row_list, dtype=ROW_POSITION_DTYPE)
169
+ first_values = pivot_column.iloc[first_rows]
170
+ source_type = find_column_type(pivot_column)
171
+ if source_type in DECIMAL_TYPES:
172
+ decimals = cast(list[float], first_values.tolist())
173
+ decimal_names = [write_decimal(decimal) for decimal in decimals]
174
+ return decimal_names
175
+
176
+ text_conversion = Conversion(column=column_name, dtype=Type.TEXT)
177
+ value_texts = convert_column(first_values, text_conversion)
178
+ value_names = cast(list[str], value_texts.tolist())
179
+
180
+ return value_names
181
+
182
+
183
+ def write_decimal(decimal: float) -> str:
184
+ """
185
+ Return a decimal written as a text, without decimal part when it is whole.
186
+
187
+ .. versionadded:: 0.1.0
188
+
189
+ Parameters
190
+ ----------
191
+ decimal
192
+ The decimal.
193
+
194
+ Returns
195
+ -------
196
+ str
197
+ The text.
198
+
199
+ Examples
200
+ --------
201
+ >>> from numdaplot.tables.pivot.pivoted_frame import write_decimal
202
+ >>> write_decimal(8.0)
203
+ '8'
204
+ >>> write_decimal(2.5)
205
+ '2.5'
206
+ """
207
+ if decimal.is_integer():
208
+ whole_number = int(decimal)
209
+ return str(whole_number)
210
+
211
+ return str(decimal)
212
+
213
+
214
+ def number_row_groups(row_groups: list[NDArray[Any]], row_count: int) -> NDArray[Any]:
215
+ """
216
+ Return the number of the group of each row.
217
+
218
+ .. versionadded:: 0.1.0
219
+
220
+ Parameters
221
+ ----------
222
+ row_groups
223
+ The rows of each group, every row being in one group.
224
+ row_count
225
+ The number of rows.
226
+
227
+ Returns
228
+ -------
229
+ NDArray
230
+ One group number per row.
231
+
232
+ Examples
233
+ --------
234
+ >>> import numpy
235
+ >>> from numdaplot.tables.pivot.pivoted_frame import number_row_groups
236
+ >>> number_row_groups([numpy.array([1]), numpy.array([0, 2])], 3)
237
+ array([1, 0, 1])
238
+ """
239
+ group_numbers = numpy.zeros(row_count, dtype=ROW_POSITION_DTYPE)
240
+
241
+ for group_number, row_group in enumerate(row_groups):
242
+ group_numbers[row_group] = group_number
243
+
244
+ return group_numbers
@@ -0,0 +1,5 @@
1
+ """
2
+ Display of a few rows of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,238 @@
1
+ """
2
+ Display of a Table in a terminal or in a Jupyter notebook.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from importlib import import_module
8
+ from importlib.util import find_spec
9
+
10
+ import pandas
11
+
12
+ from numdaplot.tables.frames.table_text import build_typed_frame, format_table, write_empty_table_note
13
+ from numdaplot.tables.preview.shown_columns import ShownColumns
14
+
15
+ IPYTHON_PACKAGE = "IPython"
16
+ IPYTHON_DISPLAY_MODULE = "IPython.display"
17
+ NOTEBOOK_KERNEL = "IPKernelApp"
18
+ COMPACT_NOTEBOOK_COLUMN_COUNT = 10
19
+ NOTE_HTML = "<p>{note}</p>"
20
+ MAX_ROWS_OPTION = "display.max_rows"
21
+ MIN_ROWS_OPTION = "display.min_rows"
22
+
23
+
24
+ def show_frame(frame: pandas.DataFrame, shown_columns: ShownColumns) -> None:
25
+ """
26
+ Show the columns of a Table: as an HTML table in a Jupyter notebook, as text anywhere else.
27
+
28
+ The type of each column is shown under its name.
29
+
30
+ .. versionadded:: 0.1.0
31
+
32
+ Parameters
33
+ ----------
34
+ frame
35
+ The rows to show.
36
+ shown_columns
37
+ Whether every column is shown. A compact HTML table shows 10 columns.
38
+
39
+ Examples
40
+ --------
41
+ >>> import pandas
42
+ >>> import numdaplot as ndp
43
+ >>> from numdaplot.tables.preview.notebook_display import show_frame
44
+ >>> show_frame(pandas.DataFrame({"price": [1.5]}), ndp.ShownColumns.ALL)
45
+ price
46
+ FLOAT64
47
+ 0 1.5
48
+ """
49
+ runs_in_notebook = is_notebook()
50
+ if not runs_in_notebook:
51
+ table_text = format_table(frame, shown_columns)
52
+ print(table_text)
53
+ return
54
+
55
+ table_html = format_table_html(frame, shown_columns)
56
+ display_html(table_html)
57
+
58
+
59
+ def format_table_html(frame: pandas.DataFrame, shown_columns: ShownColumns) -> str:
60
+ """
61
+ Return the HTML table of the columns of a Table, with the type of each column under its name.
62
+
63
+ A long Table only shows its first and last rows, following the pandas display settings, as its text does.
64
+
65
+ .. versionadded:: 0.1.0
66
+
67
+ Parameters
68
+ ----------
69
+ frame
70
+ The columns of a Table.
71
+ shown_columns
72
+ Whether every column is shown. A compact HTML table shows 10 columns.
73
+
74
+ Returns
75
+ -------
76
+ str
77
+ The HTML table, followed by a note for a Table without rows, or only the note for a Table without columns.
78
+
79
+ Examples
80
+ --------
81
+ >>> import pandas
82
+ >>> import numdaplot as ndp
83
+ >>> from numdaplot.tables.preview.notebook_display import format_table_html
84
+ >>> table_html = format_table_html(pandas.DataFrame({"price": [1.5]}), ndp.ShownColumns.ALL)
85
+ >>> "FLOAT64" in table_html
86
+ True
87
+ """
88
+ note = write_empty_table_note(frame)
89
+ column_count = len(frame.columns)
90
+ if column_count == 0:
91
+ note_html = NOTE_HTML.format(note=note)
92
+ return note_html
93
+
94
+ typed_frame = build_typed_frame(frame)
95
+ column_limit = None
96
+ are_columns_left_out = False
97
+ if shown_columns == ShownColumns.COMPACT:
98
+ column_limit = COMPACT_NOTEBOOK_COLUMN_COUNT
99
+ are_columns_left_out = column_count > column_limit
100
+
101
+ row_count = len(frame.index)
102
+ row_limit = find_shown_row_count(row_count)
103
+ are_rows_left_out = row_limit is not None
104
+ # pandas writes the size of the Table under it, as in its text, only when rows or columns are left out.
105
+ shows_size = are_rows_left_out or are_columns_left_out
106
+ table_html = typed_frame.to_html(max_rows=row_limit, max_cols=column_limit, show_dimensions=shows_size)
107
+ if note is not None:
108
+ note_html = NOTE_HTML.format(note=note)
109
+ table_html += note_html
110
+
111
+ return table_html
112
+
113
+
114
+ def find_shown_row_count(row_count: int) -> int | None:
115
+ """
116
+ Return how many rows pandas shows for a Table of this length.
117
+
118
+ pandas shows every row up to ``display.max_rows``, and only ``display.min_rows`` of them, the first and last
119
+ ones, beyond it. A missing ``display.min_rows`` or one above ``display.max_rows`` shows ``display.max_rows`` rows.
120
+
121
+ .. versionadded:: 0.1.0
122
+
123
+ Parameters
124
+ ----------
125
+ row_count
126
+ The number of rows of the Table.
127
+
128
+ Returns
129
+ -------
130
+ int or None
131
+ The number of rows shown, or None to show every row.
132
+
133
+ Examples
134
+ --------
135
+ >>> from numdaplot.tables.preview.notebook_display import find_shown_row_count
136
+ >>> find_shown_row_count(5) is None
137
+ True
138
+ >>> find_shown_row_count(1000)
139
+ 10
140
+ """
141
+ max_rows = pandas.get_option(MAX_ROWS_OPTION)
142
+ if max_rows is None:
143
+ return None
144
+
145
+ if row_count <= max_rows:
146
+ return None
147
+
148
+ min_rows = pandas.get_option(MIN_ROWS_OPTION)
149
+ if min_rows is None:
150
+ return max_rows
151
+
152
+ shown_row_count = min(min_rows, max_rows)
153
+
154
+ return shown_row_count
155
+
156
+
157
+ def show_pandas_frame(frame: pandas.DataFrame) -> None:
158
+ """
159
+ Show a pandas DataFrame as it is: as an HTML table in a Jupyter notebook, as text anywhere else.
160
+
161
+ .. versionadded:: 0.1.0
162
+
163
+ Parameters
164
+ ----------
165
+ frame
166
+ The rows to show, with their header.
167
+
168
+ Examples
169
+ --------
170
+ >>> import pandas
171
+ >>> from numdaplot.tables.preview.notebook_display import show_pandas_frame
172
+ >>> show_pandas_frame(pandas.DataFrame({"price": [1.5]}))
173
+ price
174
+ 0 1.5
175
+ """
176
+ runs_in_notebook = is_notebook()
177
+ if not runs_in_notebook:
178
+ frame_text = repr(frame)
179
+ print(frame_text)
180
+ return
181
+
182
+ frame_html = frame.to_html()
183
+ display_html(frame_html)
184
+
185
+
186
+ def display_html(frame_html: str) -> None:
187
+ """
188
+ Show an HTML table in a Jupyter notebook.
189
+
190
+ .. versionadded:: 0.1.0
191
+
192
+ Parameters
193
+ ----------
194
+ frame_html
195
+ The HTML table.
196
+
197
+ Examples
198
+ --------
199
+ >>> from numdaplot.tables.preview.notebook_display import display_html, is_notebook
200
+ >>> if is_notebook():
201
+ ... display_html("<table></table>")
202
+ """
203
+ display_module = import_module(IPYTHON_DISPLAY_MODULE)
204
+ html_object = display_module.HTML(frame_html)
205
+ display_module.display(html_object)
206
+
207
+
208
+ def is_notebook() -> bool:
209
+ """
210
+ Return whether the code runs in a Jupyter notebook.
211
+
212
+ IPython is optional: without it, the code never runs in a notebook.
213
+
214
+ .. versionadded:: 0.1.0
215
+
216
+ Returns
217
+ -------
218
+ bool
219
+ True inside a Jupyter kernel, False in a terminal or a script.
220
+
221
+ Examples
222
+ --------
223
+ >>> from numdaplot.tables.preview.notebook_display import is_notebook
224
+ >>> is_notebook()
225
+ False
226
+ """
227
+ ipython_spec = find_spec(IPYTHON_PACKAGE)
228
+ if ipython_spec is None:
229
+ return False
230
+
231
+ ipython_module = import_module(IPYTHON_PACKAGE)
232
+ shell = ipython_module.get_ipython()
233
+ if shell is None:
234
+ return False
235
+
236
+ runs_in_kernel = NOTEBOOK_KERNEL in shell.config
237
+
238
+ return runs_in_kernel
@@ -0,0 +1,100 @@
1
+ """
2
+ Settings of the preview of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.arrays.creation.random_values import require_valid_seed
10
+ from numdaplot.errors.invalid_count_error import InvalidCountError
11
+ from numdaplot.errors.refused_setting_error import RefusedSettingError
12
+ from numdaplot.settings.field_types import require_field_types
13
+ from numdaplot.tables.preview.shown_columns import ShownColumns
14
+ from numdaplot.tables.preview.side import Side
15
+
16
+ DEFAULT_PREVIEW_COUNT = 5
17
+ MINIMUM_PREVIEW_COUNT = 1
18
+ SEED_SETTING = "seed"
19
+ SIDE_OWNER = "Side.{side_name}"
20
+
21
+
22
+ @dataclass(frozen=True)
23
+ class Preview:
24
+ """
25
+ How many rows of a Table to show, which ones, and how its columns are shown, used by ``Table.preview``.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ count
32
+ The number of rows, 5 by default. A shorter Table shows all its rows.
33
+ side
34
+ The first rows, ``Side.START`` by default, the last rows, ``Side.END``, or rows drawn at random,
35
+ ``Side.RANDOM``.
36
+ seed
37
+ The seed of the random draw, to show the same rows each time, other rows at each call when omitted. Only
38
+ ``Side.RANDOM`` accepts it.
39
+ columns
40
+ ``ShownColumns.ALL`` by default to show every column, going on after a line break when they do not fit, or
41
+ ``ShownColumns.COMPACT`` to replace those that do not fit by ``...``.
42
+
43
+ Raises
44
+ ------
45
+ InvalidTypeError
46
+ When a setting is not of the type its annotation names.
47
+ InvalidCountError
48
+ When ``count`` is lower than 1.
49
+ InvalidSeedError
50
+ When ``seed`` is negative.
51
+ RefusedSettingError
52
+ When ``seed`` is given with ``Side.START`` or ``Side.END``, which draw nothing.
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))
61
+ city price
62
+ TEXT FLOAT64
63
+ 0 Paris 120.0
64
+ 1 Lyon 80.0
65
+ """
66
+
67
+ count: int = DEFAULT_PREVIEW_COUNT
68
+ side: Side = Side.START
69
+ seed: int | None = None
70
+ columns: ShownColumns = ShownColumns.ALL
71
+
72
+ def __post_init__(self) -> None:
73
+ """
74
+ Check the side, the count and the seed, which only a random draw uses.
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
+ InvalidCountError
83
+ When ``count`` is lower than 1.
84
+ InvalidSeedError
85
+ When ``seed`` is negative.
86
+ RefusedSettingError
87
+ When ``seed`` is given with ``Side.START`` or ``Side.END``.
88
+ """
89
+ require_field_types(self)
90
+
91
+ if self.count < MINIMUM_PREVIEW_COUNT:
92
+ raise InvalidCountError(self.count, MINIMUM_PREVIEW_COUNT)
93
+
94
+ if self.seed is None:
95
+ return
96
+
97
+ require_valid_seed(self.seed)
98
+ if self.side != Side.RANDOM:
99
+ side_owner = SIDE_OWNER.format(side_name=self.side.name)
100
+ raise RefusedSettingError(SEED_SETTING, side_owner)
@@ -0,0 +1,55 @@
1
+ """
2
+ Rows of a Table shown by a preview.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ import pandas
9
+
10
+ from numdaplot.tables.preview.preview import Preview
11
+ from numdaplot.tables.preview.side import Side
12
+
13
+
14
+ def choose_preview_rows(frame: pandas.DataFrame, preview: Preview) -> pandas.DataFrame:
15
+ """
16
+ Return the rows of a Table that a preview shows, with their row numbers.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ frame
23
+ The columns of a Table.
24
+ preview
25
+ How many rows, and which ones.
26
+
27
+ Returns
28
+ -------
29
+ pandas.DataFrame
30
+ The chosen rows, in the order of the Table, keeping their numbers in the Table.
31
+
32
+ Examples
33
+ --------
34
+ >>> import pandas
35
+ >>> import numdaplot as ndp
36
+ >>> from numdaplot.tables.preview.preview_rows import choose_preview_rows
37
+ >>> frame = pandas.DataFrame({"price": [1.0, 2.0, 3.0]})
38
+ >>> choose_preview_rows(frame, ndp.Preview(count=2, side=ndp.Side.END))
39
+ price
40
+ 1 2.0
41
+ 2 3.0
42
+ """
43
+ match preview.side:
44
+ case Side.START:
45
+ chosen_rows = frame.head(preview.count)
46
+ case Side.END:
47
+ chosen_rows = frame.tail(preview.count)
48
+ case Side.RANDOM:
49
+ row_count = len(frame)
50
+ drawn_count = min(preview.count, row_count)
51
+ generator = numpy.random.default_rng(preview.seed)
52
+ drawn_rows = frame.sample(n=drawn_count, random_state=generator)
53
+ chosen_rows = drawn_rows.sort_index()
54
+
55
+ return chosen_rows
@@ -0,0 +1,62 @@
1
+ """
2
+ Which columns of a Table a preview shows.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class ShownColumns(Enum):
11
+ """
12
+ Which columns of a Table ``Preview`` shows when they do not fit in the width of the terminal.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
20
+ >>> prices = ndp.Array.from_list([120.0, 80.0])
21
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
22
+ >>> sales.preview(ndp.Preview(columns=ndp.ShownColumns.ALL))
23
+ city price
24
+ TEXT FLOAT64
25
+ 0 Paris 120.0
26
+ 1 Lyon 80.0
27
+ """
28
+
29
+ ALL = auto()
30
+ """
31
+ Every column, the columns going on after a line break, ended by a backslash, when they do not fit. Default value.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
37
+ >>> prices = ndp.Array.from_list([120.0, 80.0])
38
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
39
+ >>> sales.preview(ndp.Preview(columns=ndp.ShownColumns.ALL))
40
+ city price
41
+ TEXT FLOAT64
42
+ 0 Paris 120.0
43
+ 1 Lyon 80.0
44
+ """
45
+
46
+ COMPACT = auto()
47
+ """
48
+ Only the first and last columns that fit, the others replaced by ``...``.
49
+
50
+ Examples
51
+ --------
52
+ >>> import numdaplot as ndp
53
+ >>> long_name = "a_very_long_column_name_{number}"
54
+ >>> columns = {long_name.format(number=number): ndp.Array.from_list([number]) for number in range(6)}
55
+ >>> wide_table = ndp.Table.from_arrays(columns)
56
+ >>> wide_table.preview(ndp.Preview(columns=ndp.ShownColumns.COMPACT))
57
+ a_very_long_column_name_0 ... a_very_long_column_name_5
58
+ INT64 ... INT64
59
+ 0 0 ... 5
60
+ <BLANKLINE>
61
+ [1 rows x 6 columns]
62
+ """