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,59 @@
1
+ """
2
+ Settings of the count of the missing values of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.ratios.measure import Measure
10
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class MissingCount:
15
+ """
16
+ How the missing values of a Table are counted, used by ``Table.count_missing``.
17
+
18
+ The axis, for each row or each column, is given to ``Table.count_missing`` itself.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ measure
25
+ A number of missing values by default, or with ``Measure.RATIO`` their fraction of the values counted.
26
+
27
+
28
+ Raises
29
+ ------
30
+ InvalidTypeError
31
+ When a setting is not of the type its annotation names.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
37
+ >>> prices = ndp.Array.from_list([120.0, None, None])
38
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
39
+ >>> table.count_missing(ndp.MissingCount(measure=ndp.Measure.RATIO), axis=ndp.Axis.EACH_COLUMN)
40
+ column missing_ratio
41
+ TEXT FLOAT64
42
+ 0 city 0.000000
43
+ 1 price 0.666667
44
+ """
45
+
46
+ measure: Measure = Measure.COUNT
47
+
48
+ def __post_init__(self) -> None:
49
+ """
50
+ Check the type of every setting.
51
+
52
+ .. versionadded:: 0.1.0
53
+
54
+ Raises
55
+ ------
56
+ InvalidTypeError
57
+ When a setting is not of the type its annotation names.
58
+ """
59
+ require_field_types(self)
@@ -0,0 +1,214 @@
1
+ """
2
+ Count of the missing values of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ import pandas
9
+ from numpy.typing import NDArray
10
+
11
+ from numdaplot.data_types.numpy_mapping import to_numpy_dtype
12
+ from numdaplot.data_types.type import Type
13
+ from numdaplot.positions.axis import Axis
14
+ from numdaplot.ratios.measure import Measure
15
+ from numdaplot.tables.frames.column import Column
16
+ from numdaplot.tables.frames.column_values import build_column
17
+ from numdaplot.tables.missing.missing_count import MissingCount
18
+
19
+ COLUMN_NAMES_COLUMN = "column"
20
+ MEASURE_COLUMN_NAMES = {
21
+ Measure.COUNT: "missing_count",
22
+ Measure.RATIO: "missing_ratio",
23
+ }
24
+ # A numpy sum along axis 0 gives one result per column, along axis 1 one result per row.
25
+ COLUMN_SUM_AXIS = 0
26
+ ROW_SUM_AXIS = 1
27
+
28
+
29
+ def count_frame_missing(frame: pandas.DataFrame, missing_count: MissingCount, axis: Axis | None) -> pandas.DataFrame:
30
+ """
31
+ Return the count of the missing values of a Table, for the whole Table, each row or each column.
32
+
33
+ .. versionadded:: 0.1.0
34
+
35
+ Parameters
36
+ ----------
37
+ frame
38
+ The columns of a Table.
39
+ missing_count
40
+ The measure of the count.
41
+ axis
42
+ ``EACH_ROW`` for one count per row, ``EACH_COLUMN`` for one per column, or None for the whole Table.
43
+
44
+ Returns
45
+ -------
46
+ pandas.DataFrame
47
+ A ``missing_count`` or ``missing_ratio`` column: one row for the whole Table, one row per row,
48
+ or one row per column after a ``column`` column naming it. A ratio without any value is missing.
49
+
50
+ Examples
51
+ --------
52
+ >>> import pandas
53
+ >>> import numdaplot as ndp
54
+ >>> from numdaplot.tables.missing.missing_counts import count_frame_missing
55
+ >>> frame = pandas.DataFrame({"price": [1.5, None], "stock": [None, None]})
56
+ >>> count_frame_missing(frame, ndp.MissingCount(measure=ndp.Measure.RATIO), ndp.Axis.EACH_ROW)
57
+ missing_ratio
58
+ 0 0.5
59
+ 1 1.0
60
+ """
61
+ missing_grid = find_frame_missing(frame)
62
+ counts, value_count = count_axis_missing(missing_grid, axis)
63
+ measures = counts
64
+ if missing_count.measure == Measure.RATIO:
65
+ measures = divide_counts(counts, value_count)
66
+
67
+ measure_name = MEASURE_COLUMN_NAMES[missing_count.measure]
68
+ measure_column = build_column(measures)
69
+ count_columns = dict[str, Column]()
70
+ if axis == Axis.EACH_COLUMN:
71
+ count_columns[COLUMN_NAMES_COLUMN] = build_name_column(frame)
72
+
73
+ count_columns[measure_name] = measure_column
74
+ count_frame = pandas.DataFrame(count_columns)
75
+
76
+ return count_frame
77
+
78
+
79
+ def find_frame_missing(frame: pandas.DataFrame) -> NDArray[numpy.bool_]:
80
+ """
81
+ Return which values of a Table are missing.
82
+
83
+ .. versionadded:: 0.1.0
84
+
85
+ Parameters
86
+ ----------
87
+ frame
88
+ The columns of a Table.
89
+
90
+ Returns
91
+ -------
92
+ NDArray[numpy.bool_]
93
+ One row per row and one column per column, True at each missing value.
94
+
95
+ Examples
96
+ --------
97
+ >>> import pandas
98
+ >>> from numdaplot.tables.missing.missing_counts import find_frame_missing
99
+ >>> find_frame_missing(pandas.DataFrame({"price": [1.5, None]}))
100
+ array([[False],
101
+ [ True]])
102
+ """
103
+ missing_frame = frame.isna()
104
+ missing_grid = missing_frame.to_numpy(dtype=numpy.bool_)
105
+
106
+ return missing_grid
107
+
108
+
109
+ def count_axis_missing(missing_grid: NDArray[numpy.bool_], axis: Axis | None) -> tuple[NDArray[numpy.int64], int]:
110
+ """
111
+ Return the number of missing values along an axis, and how many values each number is counted on.
112
+
113
+ .. versionadded:: 0.1.0
114
+
115
+ Parameters
116
+ ----------
117
+ missing_grid
118
+ True at each missing value of a Table, one row per row.
119
+ axis
120
+ One count per row, per column, or a single count for the whole Table when ``None``.
121
+
122
+ Returns
123
+ -------
124
+ tuple[NDArray[numpy.int64], int]
125
+ The counts, then the number of values behind each count.
126
+
127
+ Examples
128
+ --------
129
+ >>> import numpy
130
+ >>> import numdaplot as ndp
131
+ >>> from numdaplot.tables.missing.missing_counts import count_axis_missing
132
+ >>> count_axis_missing(numpy.array([[True, False], [True, True]]), ndp.Axis.EACH_COLUMN)
133
+ (array([2, 1]), 2)
134
+ """
135
+ row_count, column_count = missing_grid.shape
136
+ if axis == Axis.EACH_ROW:
137
+ row_counts = missing_grid.sum(axis=ROW_SUM_AXIS, dtype=numpy.int64)
138
+ return row_counts, column_count
139
+
140
+ if axis == Axis.EACH_COLUMN:
141
+ column_counts = missing_grid.sum(axis=COLUMN_SUM_AXIS, dtype=numpy.int64)
142
+ return column_counts, row_count
143
+
144
+ missing_total = missing_grid.sum(dtype=numpy.int64)
145
+ total_counts = numpy.array([missing_total], dtype=numpy.int64)
146
+
147
+ return total_counts, missing_grid.size
148
+
149
+
150
+ def divide_counts(counts: NDArray[numpy.int64], value_count: int) -> NDArray[numpy.float64]:
151
+ """
152
+ Return the fraction of the values each count represents.
153
+
154
+ .. versionadded:: 0.1.0
155
+
156
+ Parameters
157
+ ----------
158
+ counts
159
+ Numbers of missing values.
160
+ value_count
161
+ The number of values behind each count.
162
+
163
+ Returns
164
+ -------
165
+ NDArray[numpy.float64]
166
+ Each count divided by the number of values, NaN everywhere when there is no value.
167
+
168
+ Examples
169
+ --------
170
+ >>> import numpy
171
+ >>> from numdaplot.tables.missing.missing_counts import divide_counts
172
+ >>> divide_counts(numpy.array([1, 2]), 4)
173
+ array([0.25, 0.5 ])
174
+ >>> divide_counts(numpy.array([0]), 0)
175
+ array([nan])
176
+ """
177
+ if value_count == 0:
178
+ no_ratios = numpy.full(counts.shape, numpy.nan, dtype=numpy.float64)
179
+ return no_ratios
180
+
181
+ ratios = numpy.divide(counts, value_count, dtype=numpy.float64)
182
+
183
+ return ratios
184
+
185
+
186
+ def build_name_column(frame: pandas.DataFrame) -> Column:
187
+ """
188
+ Return a text column holding the names of the columns of a Table.
189
+
190
+ .. versionadded:: 0.1.0
191
+
192
+ Parameters
193
+ ----------
194
+ frame
195
+ The columns of a Table.
196
+
197
+ Returns
198
+ -------
199
+ Column
200
+ One name per row, in the order of the Table.
201
+
202
+ Examples
203
+ --------
204
+ >>> import pandas
205
+ >>> from numdaplot.tables.missing.missing_counts import build_name_column
206
+ >>> build_name_column(pandas.DataFrame({"city": ["Pau"], "price": [1.5]})).tolist()
207
+ ['city', 'price']
208
+ """
209
+ column_names = [str(column_name) for column_name in frame.columns]
210
+ text_dtype = to_numpy_dtype(Type.TEXT)
211
+ name_values = numpy.array(column_names, dtype=text_dtype)
212
+ name_column = build_column(name_values)
213
+
214
+ return name_column
@@ -0,0 +1,98 @@
1
+ """
2
+ Settings of the removal of the rows or the columns of a Table holding missing values.
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_column_names
12
+ from numdaplot.tables.missing.missing_mode import MissingMode
13
+ from numdaplot.tables.missing.missing_ratio import MissingRatio
14
+
15
+ COLUMN_ITEM_NAME = "column"
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class MissingDrop:
20
+ """
21
+ Which rows or columns holding missing values are removed, used by ``Table.drop_missing``.
22
+
23
+ The axis, rows or columns, is given to ``Table.drop_missing`` itself.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ columns
30
+ The names of the columns looked at, every column when omitted. Rows are removed according to
31
+ their values in these columns; columns are only removed among them, the others are always kept.
32
+ The settings keep their own copy of the list.
33
+ rule
34
+ How many missing values make a row or a column removed: a single one by default, all of them with
35
+ ``MissingMode.ALL``, or a share of them with ``MissingRatio``. In a Table without rows, no column
36
+ is removed.
37
+
38
+ Raises
39
+ ------
40
+ InvalidTypeError
41
+ When a setting is not of the type its annotation names.
42
+ EmptyListError
43
+ When ``columns`` is an empty list.
44
+ InvalidColumnNameError
45
+ When a column name is an empty text.
46
+ DuplicateColumnError
47
+ When a column name appears twice.
48
+
49
+ Examples
50
+ --------
51
+ >>> import numdaplot as ndp
52
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
53
+ >>> prices = ndp.Array.from_list([120.0, None, 150.0])
54
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
55
+ >>> table.drop_missing()
56
+ city price
57
+ TEXT FLOAT64
58
+ 0 Paris 120.0
59
+ 1 Pau 150.0
60
+ >>> table.drop_missing(ndp.MissingDrop(columns=["price"]), axis=ndp.Axis.EACH_COLUMN)
61
+ city
62
+ TEXT
63
+ 0 Paris
64
+ 1 Lyon
65
+ 2 Pau
66
+ """
67
+
68
+ columns: list[str] | None = None
69
+ rule: MissingMode | MissingRatio = MissingMode.ANY
70
+
71
+ def __post_init__(self) -> None:
72
+ """
73
+ Check the columns and replace them with a copy that only the settings hold.
74
+
75
+ .. versionadded:: 0.1.0
76
+
77
+ Raises
78
+ ------
79
+ InvalidTypeError
80
+ When a setting is not of the type its annotation names.
81
+ EmptyListError
82
+ When ``columns`` is an empty list.
83
+ InvalidColumnNameError
84
+ When a column name is an empty text.
85
+ DuplicateColumnError
86
+ When a column name appears twice.
87
+ """
88
+ require_field_types(self)
89
+
90
+ if self.columns is None:
91
+ return
92
+
93
+ if self.columns == []:
94
+ raise EmptyListError(COLUMN_ITEM_NAME)
95
+
96
+ require_column_names(self.columns)
97
+ columns_copy = list(self.columns)
98
+ object.__setattr__(self, "columns", columns_copy)
@@ -0,0 +1,63 @@
1
+ """
2
+ How many missing values make a row or a column removed.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class MissingMode(Enum):
11
+ """
12
+ How many missing values make a row or a column removed, used by ``MissingDrop``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
20
+ >>> prices = ndp.Array.from_list([120.0, None, None])
21
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None])
22
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices, "stock": stocks})
23
+ >>> table.drop_missing(ndp.MissingDrop(columns=["price", "stock"], rule=ndp.MissingMode.ALL))
24
+ city price stock
25
+ TEXT FLOAT64 FLOAT64
26
+ 0 Paris 120.0 3.0
27
+ 1 Lyon NaN 5.0
28
+ """
29
+
30
+ ANY = auto()
31
+ """
32
+ A single missing value is enough. Default value.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
38
+ >>> prices = ndp.Array.from_list([120.0, None, None])
39
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None])
40
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices, "stock": stocks})
41
+ >>> table.drop_missing(ndp.MissingDrop(columns=["price", "stock"], rule=ndp.MissingMode.ANY))
42
+ city price stock
43
+ TEXT FLOAT64 FLOAT64
44
+ 0 Paris 120.0 3.0
45
+ """
46
+
47
+ ALL = auto()
48
+ """
49
+ Every value must be missing.
50
+
51
+ Examples
52
+ --------
53
+ >>> import numdaplot as ndp
54
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
55
+ >>> prices = ndp.Array.from_list([120.0, None, None])
56
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None])
57
+ >>> table = ndp.Table.from_arrays({"city": cities, "price": prices, "stock": stocks})
58
+ >>> table.drop_missing(ndp.MissingDrop(columns=["price", "stock"], rule=ndp.MissingMode.ALL))
59
+ city price stock
60
+ TEXT FLOAT64 FLOAT64
61
+ 0 Paris 120.0 3.0
62
+ 1 Lyon NaN 5.0
63
+ """
@@ -0,0 +1,71 @@
1
+ """
2
+ A ratio of missing values from which a row or a column is removed.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.ratios.fraction import require_fraction
10
+ from numdaplot.settings.field_types import require_field_types
11
+ from numdaplot.tables.missing.ratio_comparison import RatioComparison
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class MissingRatio:
16
+ """
17
+ A ratio of missing values from which a row or a column is removed, used by ``MissingDrop``.
18
+
19
+ The ratio of a row is its missing values divided by its number of values, and the same for a column.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ ratio
26
+ The threshold, a fraction between 0 and 1: ``0.3`` for 30 %.
27
+ comparison
28
+ Whether a ratio equal to the threshold is enough, ``RatioComparison.AT_LEAST`` by default, or the ratio must be
29
+ above it, ``RatioComparison.ABOVE``.
30
+
31
+ Raises
32
+ ------
33
+ InvalidTypeError
34
+ When a setting is not of the type its annotation names.
35
+ InvalidFractionError
36
+ When ``ratio`` is lower than 0, greater than 1 or NaN.
37
+
38
+ Examples
39
+ --------
40
+ >>> import numdaplot as ndp
41
+ >>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
42
+ >>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
43
+ >>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
44
+ >>> table.drop_missing(ndp.MissingDrop(rule=ndp.MissingRatio(0.4)), axis=ndp.Axis.EACH_COLUMN)
45
+ stock
46
+ FLOAT64
47
+ 0 3.0
48
+ 1 5.0
49
+ 2 NaN
50
+ 3 2.0
51
+ """
52
+
53
+ ratio: float
54
+ comparison: RatioComparison = RatioComparison.AT_LEAST
55
+
56
+ def __post_init__(self) -> None:
57
+ """
58
+ Check that the ratio is a fraction.
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
+ InvalidFractionError
67
+ When ``ratio`` is lower than 0, greater than 1 or NaN.
68
+ """
69
+ require_field_types(self)
70
+
71
+ require_fraction(self.ratio)