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,92 @@
1
+ """
2
+ A rectangular part of an Array or a Table, chosen by position.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.empty_list_error import EmptyListError
10
+ from numdaplot.errors.empty_region_error import EmptyRegionError
11
+ from numdaplot.positions.index import Index
12
+ from numdaplot.positions.range import Range
13
+ from numdaplot.settings.field_types import require_field_types
14
+ from numdaplot.tables.columns.column_names import require_column_names
15
+
16
+ COLUMN_ITEM_NAME = "column"
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class Region:
21
+ """
22
+ A rectangular part of an Array or a Table, chosen by position, used by ``take`` and ``replace``.
23
+
24
+ .. versionadded:: 0.1.0
25
+
26
+ Parameters
27
+ ----------
28
+ rows
29
+ The rows to take: one ``Index`` or a ``Range``. Every row when omitted, but a Region needs rows,
30
+ columns or both.
31
+ columns
32
+ The columns to take: one ``Index``, a ``Range``, or a list of column names for a Table.
33
+ Every column when omitted. The region keeps its own copy of a list of names.
34
+
35
+ Raises
36
+ ------
37
+ InvalidTypeError
38
+ When a setting is not of the type its annotation names.
39
+ EmptyRegionError
40
+ When ``rows`` and ``columns`` are both omitted.
41
+ EmptyListError
42
+ When ``columns`` is an empty list.
43
+ InvalidColumnNameError
44
+ When a column name is an empty text.
45
+ DuplicateColumnError
46
+ When a column name appears twice.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> grid = ndp.Array.from_list([[1, 2, 3], [4, 5, 6]])
52
+ >>> grid.take(ndp.Region(rows=ndp.Index(0), columns=ndp.Range(start=1, stop=2)))
53
+ Array([[2, 3]], dtype=INT64)
54
+ """
55
+
56
+ rows: Index | Range | None = None
57
+ columns: Index | Range | list[str] | None = None
58
+
59
+ def __post_init__(self) -> None:
60
+ """
61
+ Check the rows and the columns, and replace a list of column names with a copy only the region 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
+ EmptyRegionError
70
+ When ``rows`` and ``columns`` are both omitted.
71
+ EmptyListError
72
+ When ``columns`` is an empty list.
73
+ InvalidColumnNameError
74
+ When a column name is an empty text.
75
+ DuplicateColumnError
76
+ When a column name appears twice.
77
+ """
78
+ require_field_types(self)
79
+
80
+ has_no_position = self.rows is None and self.columns is None
81
+ if has_no_position:
82
+ raise EmptyRegionError()
83
+
84
+ if not isinstance(self.columns, list):
85
+ return
86
+
87
+ if self.columns == []:
88
+ raise EmptyListError(COLUMN_ITEM_NAME)
89
+
90
+ require_column_names(self.columns)
91
+ columns_copy = list(self.columns)
92
+ object.__setattr__(self, "columns", columns_copy)
numdaplot/py.typed ADDED
File without changes
@@ -0,0 +1,5 @@
1
+ """
2
+ Validation of fractions, shared by every numdaplot setting expressed between 0 and 1.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,40 @@
1
+ """
2
+ Check that a value is a fraction between 0 and 1.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.invalid_fraction_error import InvalidFractionError
8
+
9
+ MIN_FRACTION = 0.0
10
+ MAX_FRACTION = 1.0
11
+
12
+
13
+ def require_fraction(value: float) -> None:
14
+ """
15
+ Check that a value is a fraction between 0 and 1, both included.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Parameters
20
+ ----------
21
+ value
22
+ The value to check. NaN is never a fraction.
23
+
24
+ Raises
25
+ ------
26
+ InvalidFractionError
27
+ When the value is lower than 0, greater than 1 or NaN.
28
+
29
+ Examples
30
+ --------
31
+ >>> from numdaplot.ratios.fraction import require_fraction
32
+ >>> require_fraction(0.25)
33
+ >>> require_fraction(-0.1)
34
+ Traceback (most recent call last):
35
+ ...
36
+ numdaplot.errors.invalid_fraction_error.InvalidFractionError: Expected a fraction between 0 and 1, got -0.1.
37
+ """
38
+ is_fraction = MIN_FRACTION <= value <= MAX_FRACTION
39
+ if not is_fraction:
40
+ raise InvalidFractionError(value)
@@ -0,0 +1,48 @@
1
+ """
2
+ How a quantity is measured: as a count or as a fraction of a whole.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Measure(Enum):
11
+ """
12
+ How a quantity is measured: as a count, or as a fraction of a whole between 0 and 1.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Table.from_arrays({"price": ndp.Array.from_list([12.5, None, 30.0, None])})
20
+ >>> prices.count_missing(ndp.MissingCount(measure=ndp.Measure.COUNT)).to_value()
21
+ 2
22
+ >>> prices.count_missing(ndp.MissingCount(measure=ndp.Measure.RATIO)).to_value()
23
+ 0.5
24
+ """
25
+
26
+ COUNT = auto()
27
+ """
28
+ A number of values. Default value.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> prices = ndp.Table.from_arrays({"price": ndp.Array.from_list([12.5, None, 30.0, None])})
34
+ >>> prices.count_missing(ndp.MissingCount(measure=ndp.Measure.COUNT)).to_value()
35
+ 2
36
+ """
37
+
38
+ RATIO = auto()
39
+ """
40
+ A fraction of the values, between 0 and 1.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> prices = ndp.Table.from_arrays({"price": ndp.Array.from_list([12.5, None, 30.0, None])})
46
+ >>> prices.count_missing(ndp.MissingCount(measure=ndp.Measure.RATIO)).to_value()
47
+ 0.5
48
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Rules that test each value: shared by ``Table.filter``, ``Array.select`` and ``check``.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,78 @@
1
+ """
2
+ Rule keeping the values inside an interval.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from datetime import date, datetime, time, timedelta
9
+
10
+ from numdaplot.errors.invalid_bounds_error import InvalidBoundsError
11
+ from numdaplot.rules.bounds import Bounds
12
+ from numdaplot.rules.rule import Rule
13
+ from numdaplot.settings.field_types import require_field_types
14
+
15
+
16
+ # The type parameter has the name of the alias holding the same types: the documentation shows the alias,
17
+ # and both bounds must be of one type.
18
+ @dataclass(frozen=True)
19
+ class Between[OrderedValue: (int, float, str, date, datetime, timedelta, time)](Rule):
20
+ """
21
+ Keep the values inside an interval.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ low
28
+ Low bound of the interval, an ``OrderedValue`` such as ``10``, ``"A"`` or ``date(2026, 1, 1)``.
29
+ high
30
+ High bound of the interval, an ``OrderedValue`` such as ``20``, ``"M"`` or ``date(2026, 12, 31)``, greater than
31
+ or equal to ``low`` and of a comparable kind.
32
+ bounds
33
+ Which bounds are part of the interval. Both are included by default.
34
+
35
+ Raises
36
+ ------
37
+ InvalidTypeError
38
+ When a setting is not of the type its annotation names.
39
+ InvalidBoundsError
40
+ When ``low`` is greater than ``high``, or when they cannot be compared,
41
+ such as a number and a text, or a date and a datetime.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> ages = ndp.Array.from_list([8, 10, 15, 20, 31])
47
+ >>> ages.select(ndp.Between(low=10, high=20))
48
+ Array([10, 15, 20], dtype=INT64)
49
+ >>> ages.select(ndp.Between(low=10, high=20, bounds=ndp.Bounds.EXCLUDED))
50
+ Array([15], dtype=INT64)
51
+ """
52
+
53
+ low: OrderedValue
54
+ high: OrderedValue
55
+ bounds: Bounds = Bounds.INCLUDED
56
+
57
+ def __post_init__(self) -> None:
58
+ """
59
+ Check the bounds: the low bound is not greater than the high bound.
60
+
61
+ .. versionadded:: 0.1.0
62
+
63
+ Raises
64
+ ------
65
+ InvalidTypeError
66
+ When a setting is not of the type its annotation names.
67
+ InvalidBoundsError
68
+ When ``low`` is greater than ``high``, or when they cannot be compared.
69
+ """
70
+ require_field_types(self)
71
+
72
+ try:
73
+ is_reversed = self.low > self.high
74
+ except TypeError as error:
75
+ raise InvalidBoundsError(self.low, self.high) from error
76
+
77
+ if is_reversed:
78
+ raise InvalidBoundsError(self.low, self.high)
@@ -0,0 +1,83 @@
1
+ """
2
+ Which bounds of an interval are part of it.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Bounds(Enum):
11
+ """
12
+ Which bounds of an interval are part of it, used by ``Between`` and ``Range``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> scores = ndp.Array.from_list([0, 5, 10])
20
+ >>> scores.select(ndp.Between(low=0, high=10, bounds=ndp.Bounds.LOW_ONLY))
21
+ Array([0, 5], dtype=INT64)
22
+ """
23
+
24
+ INCLUDED = auto()
25
+ """
26
+ Both bounds are included: low <= x <= high. Default value.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> ages = ndp.Array.from_list([10, 15, 20])
32
+ >>> ages.select(ndp.Between(low=10, high=20, bounds=ndp.Bounds.INCLUDED))
33
+ Array([10, 15, 20], dtype=INT64)
34
+ """
35
+
36
+ EXCLUDED = auto()
37
+ """
38
+ Both bounds are excluded: low < x < high.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> ages = ndp.Array.from_list([10, 15, 20])
44
+ >>> ages.select(ndp.Between(low=10, high=20, bounds=ndp.Bounds.EXCLUDED))
45
+ Array([15], dtype=INT64)
46
+ """
47
+
48
+ LOW_ONLY = auto()
49
+ """
50
+ Only the low bound is included: low <= x < high.
51
+
52
+ Examples
53
+ --------
54
+ >>> import numdaplot as ndp
55
+ >>> ages = ndp.Array.from_list([10, 15, 20])
56
+ >>> ages.select(ndp.Between(low=10, high=20, bounds=ndp.Bounds.LOW_ONLY))
57
+ Array([10, 15], dtype=INT64)
58
+ """
59
+
60
+ HIGH_ONLY = auto()
61
+ """
62
+ Only the high bound is included: low < x <= high.
63
+
64
+ Examples
65
+ --------
66
+ >>> import numdaplot as ndp
67
+ >>> ages = ndp.Array.from_list([10, 15, 20])
68
+ >>> ages.select(ndp.Between(low=10, high=20, bounds=ndp.Bounds.HIGH_ONLY))
69
+ Array([15, 20], dtype=INT64)
70
+ """
71
+
72
+
73
+ LOW_INCLUDED_BOUNDS = frozenset({Bounds.INCLUDED, Bounds.LOW_ONLY})
74
+ """The bounds settings that include the low bound, or the start of a sequence.
75
+
76
+ .. versionadded:: 0.1.0
77
+ """
78
+
79
+ HIGH_INCLUDED_BOUNDS = frozenset({Bounds.INCLUDED, Bounds.HIGH_ONLY})
80
+ """The bounds settings that include the high bound, or the end of a sequence.
81
+
82
+ .. versionadded:: 0.1.0
83
+ """
@@ -0,0 +1,48 @@
1
+ """
2
+ Whether text comparisons distinguish upper and lower case.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Case(Enum):
11
+ """
12
+ Whether text comparisons distinguish upper and lower case, used by ``Contains``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "PARIS", "Lyon"])
20
+ >>> cities.select(ndp.Contains("paris", case=ndp.Case.SENSITIVE))
21
+ Array([], dtype=TEXT)
22
+ >>> cities.select(ndp.Contains("paris", case=ndp.Case.IGNORED))
23
+ Array(['Paris', 'PARIS'], dtype=TEXT)
24
+ """
25
+
26
+ SENSITIVE = auto()
27
+ """
28
+ ``"paris"`` does not match ``"Paris"``, as in Python and pandas. Default value.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> cities = ndp.Array.from_list(["Paris", "PARIS", "Lyon"])
34
+ >>> cities.select(ndp.Contains("Paris", case=ndp.Case.SENSITIVE))
35
+ Array(['Paris'], dtype=TEXT)
36
+ """
37
+
38
+ IGNORED = auto()
39
+ """
40
+ ``"paris"`` matches ``"Paris"``, ``"PARIS"`` and ``"paris"``.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> cities = ndp.Array.from_list(["Paris", "PARIS", "Lyon"])
46
+ >>> cities.select(ndp.Contains("Paris", case=ndp.Case.IGNORED))
47
+ Array(['Paris', 'PARIS'], dtype=TEXT)
48
+ """
@@ -0,0 +1,63 @@
1
+ """
2
+ Rule keeping the texts that contain a given text.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.empty_text_error import EmptyTextError
10
+ from numdaplot.rules.case import Case
11
+ from numdaplot.rules.rule import Rule
12
+ from numdaplot.settings.field_types import require_field_types
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class Contains(Rule):
17
+ """
18
+ Keep the texts that contain a given text. Applies to text values only.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ text
25
+ The text to look for, anywhere in each value. It cannot be empty.
26
+ case
27
+ Whether upper and lower case are distinguished. Sensitive by default.
28
+
29
+ Raises
30
+ ------
31
+ InvalidTypeError
32
+ When a setting is not of the type its annotation names.
33
+ EmptyTextError
34
+ When ``text`` is empty.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> emails = ndp.Array.from_list(["ana@shop.fr", "bob@mail.com"])
40
+ >>> emails.select(ndp.Contains(".fr"))
41
+ Array(['ana@shop.fr'], dtype=TEXT)
42
+ """
43
+
44
+ text: str
45
+ case: Case = Case.SENSITIVE
46
+
47
+ def __post_init__(self) -> None:
48
+ """
49
+ Check that the searched text is not empty.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Raises
54
+ ------
55
+ InvalidTypeError
56
+ When a setting is not of the type its annotation names.
57
+ EmptyTextError
58
+ When ``text`` is empty.
59
+ """
60
+ require_field_types(self)
61
+
62
+ if self.text == "":
63
+ raise EmptyTextError()
@@ -0,0 +1,43 @@
1
+ """
2
+ Rule keeping the values equal to a reference value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from typing import ClassVar
9
+
10
+ from numdaplot.rules.rule_values import ScalarValue
11
+ from numdaplot.rules.value_rule import ValueRule
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class Equal(ValueRule[ScalarValue]):
16
+ """
17
+ Keep the values equal to a reference value.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ value
24
+ The reference value, a ``ScalarValue`` such as ``"Paris"``, ``10`` or ``True``.
25
+
26
+ Raises
27
+ ------
28
+ RefusedOperationError
29
+ When ``value`` is None: ``IsMissing`` tests the missing values.
30
+ InvalidTypeError
31
+ When ``value`` is not a single value, such as an Array or a list.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> countries = ndp.Array.from_list(["FR", "DE", "FR"])
37
+ >>> countries.check(ndp.Equal("FR"))
38
+ Array([ True, False, True], dtype=BOOL)
39
+ """
40
+
41
+ MISSING_VALUE_RULE: ClassVar[str | None] = "IsMissing"
42
+
43
+ value: ScalarValue
@@ -0,0 +1,39 @@
1
+ """
2
+ Rule keeping the values strictly greater than a reference value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.rules.rule_values import OrderedValue
10
+ from numdaplot.rules.value_rule import ValueRule
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class Greater(ValueRule[OrderedValue]):
15
+ """
16
+ Keep the values strictly greater than a reference value.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ value
23
+ The reference value, an ``OrderedValue`` such as ``10``, ``"M"`` or ``date(2026, 1, 31)``, which is not
24
+ kept itself.
25
+
26
+ Raises
27
+ ------
28
+ InvalidTypeError
29
+ When ``value`` is not a single value, such as an Array or a list.
30
+
31
+ Examples
32
+ --------
33
+ >>> import numdaplot as ndp
34
+ >>> prices = ndp.Array.from_list([80, 100, 120])
35
+ >>> prices.select(ndp.Greater(100))
36
+ Array([120], dtype=INT64)
37
+ """
38
+
39
+ value: OrderedValue
@@ -0,0 +1,38 @@
1
+ """
2
+ Rule keeping the values greater than or equal to a reference value.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.rules.rule_values import OrderedValue
10
+ from numdaplot.rules.value_rule import ValueRule
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class GreaterOrEqual(ValueRule[OrderedValue]):
15
+ """
16
+ Keep the values greater than or equal to a reference value.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ value
23
+ The reference value, an ``OrderedValue`` such as ``10``, ``"M"`` or ``date(2026, 1, 31)``, which is kept itself.
24
+
25
+ Raises
26
+ ------
27
+ InvalidTypeError
28
+ When ``value`` is not a single value, such as an Array or a list.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> prices = ndp.Array.from_list([80, 100, 120])
34
+ >>> prices.select(ndp.GreaterOrEqual(100))
35
+ Array([100, 120], dtype=INT64)
36
+ """
37
+
38
+ value: OrderedValue
@@ -0,0 +1,67 @@
1
+ """
2
+ Rule keeping the values that belong to a list.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from datetime import date, datetime, time, timedelta
9
+
10
+ from numdaplot.errors.empty_values_error import EmptyValuesError
11
+ from numdaplot.rules.rule import Rule
12
+ from numdaplot.settings.field_types import require_field_types
13
+
14
+
15
+ # The type parameter has the name of the alias holding the same types: the documentation shows the alias,
16
+ # and every accepted value must be of one type.
17
+ @dataclass(frozen=True)
18
+ class IsIn[ScalarValue: (bool, int, float, str, date, datetime, timedelta, time)](Rule):
19
+ """
20
+ Keep the values that belong to a list of accepted values.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ values
27
+ The accepted values, a list of ``ScalarValue`` such as ``["Paris", "Lyon"]`` or ``[1, 2]``, at least one and
28
+ all of the same kind. The rule keeps its own copy, so changing the list afterwards does not change the rule.
29
+
30
+ Raises
31
+ ------
32
+ InvalidTypeError
33
+ When a setting is not of the type its annotation names.
34
+ EmptyValuesError
35
+ When ``values`` is empty.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> countries = ndp.Array.from_list(["FR", "US", "DE"])
41
+ >>> countries.select(ndp.IsIn(["FR", "DE"]))
42
+ Array(['FR', 'DE'], dtype=TEXT)
43
+ """
44
+
45
+ values: list[ScalarValue]
46
+
47
+ def __post_init__(self) -> None:
48
+ """
49
+ Check the list and its values, then replace it with a copy that only the rule holds.
50
+
51
+ .. versionadded:: 0.1.0
52
+
53
+ Raises
54
+ ------
55
+ InvalidTypeError
56
+ When a setting is not of the type its annotation names.
57
+ EmptyValuesError
58
+ When ``values`` is empty.
59
+ """
60
+ require_field_types(self)
61
+
62
+ value_count = len(self.values)
63
+ if value_count == 0:
64
+ raise EmptyValuesError()
65
+
66
+ values_copy = list(self.values)
67
+ object.__setattr__(self, "values", values_copy)
@@ -0,0 +1,25 @@
1
+ """
2
+ Rule keeping the missing values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.rules.rule import Rule
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class IsMissing(Rule):
14
+ """
15
+ Keep the missing values, whatever their type: NaN, ``pd.NA`` or ``NaT``.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Examples
20
+ --------
21
+ >>> import numdaplot as ndp
22
+ >>> temperatures = ndp.Array.from_list([12.5, None, 18.0])
23
+ >>> temperatures.check(ndp.IsMissing())
24
+ Array([False, True, False], dtype=BOOL)
25
+ """