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,94 @@
1
+ """
2
+ Reading SAS data and SAS transport (XPT) files.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from pathlib import Path
8
+ from typing import Literal
9
+
10
+ import pandas
11
+
12
+ from numdaplot.tables.files.encoding import Encoding
13
+ from numdaplot.tables.files.sas_read_options import SasReadOptions
14
+ from numdaplot.tables.files.xpt_read_options import XptReadOptions
15
+
16
+ SAS_DATA_FORMAT = "sas7bdat"
17
+ SAS_TRANSPORT_FORMAT = "xport"
18
+
19
+ type SasFormat = Literal["sas7bdat", "xport"]
20
+ """The names pandas gives to the SAS data and SAS transport formats.
21
+
22
+ .. versionadded:: 0.1.0
23
+ """
24
+
25
+
26
+ def read_sas_file(path: Path, options: SasReadOptions) -> pandas.DataFrame:
27
+ """
28
+ Return the columns of a SAS data file (``.sas7bdat``).
29
+
30
+ .. versionadded:: 0.1.0
31
+
32
+ Parameters
33
+ ----------
34
+ path
35
+ The path of an existing SAS data file.
36
+ options
37
+ The encoding of the texts of the file.
38
+
39
+ Returns
40
+ -------
41
+ pandas.DataFrame
42
+ The columns as pandas reads them. SAS stores every number as a decimal.
43
+ """
44
+ frame = read_sas_format(path, SAS_DATA_FORMAT, options.encoding)
45
+
46
+ return frame
47
+
48
+
49
+ def read_xpt_file(path: Path, options: XptReadOptions) -> pandas.DataFrame:
50
+ """
51
+ Return the columns of a SAS transport file (``.xpt``).
52
+
53
+ .. versionadded:: 0.1.0
54
+
55
+ Parameters
56
+ ----------
57
+ path
58
+ The path of an existing SAS transport file.
59
+ options
60
+ The encoding of the texts of the file.
61
+
62
+ Returns
63
+ -------
64
+ pandas.DataFrame
65
+ The columns as pandas reads them. SAS stores every number as a decimal.
66
+ """
67
+ frame = read_sas_format(path, SAS_TRANSPORT_FORMAT, options.encoding)
68
+
69
+ return frame
70
+
71
+
72
+ def read_sas_format(path: Path, sas_format: SasFormat, encoding: Encoding) -> pandas.DataFrame:
73
+ """
74
+ Return the columns of a SAS file of a given format.
75
+
76
+ .. versionadded:: 0.1.0
77
+
78
+ Parameters
79
+ ----------
80
+ path
81
+ The path of an existing SAS file.
82
+ sas_format
83
+ ``sas7bdat`` for SAS data, ``xport`` for SAS transport.
84
+ encoding
85
+ The encoding of the texts of the file.
86
+
87
+ Returns
88
+ -------
89
+ pandas.DataFrame
90
+ The columns as pandas reads them.
91
+ """
92
+ frame = pandas.read_sas(path, format=sas_format, encoding=encoding.value)
93
+
94
+ return frame
@@ -0,0 +1,67 @@
1
+ """
2
+ Settings of the SAS data files a Table reads.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.settings.field_types import require_field_types
10
+ from numdaplot.tables.files.column_names import ColumnNames
11
+ from numdaplot.tables.files.encoding import Encoding
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class SasReadOptions:
16
+ """
17
+ Settings of a SAS data file (``.sas7bdat``) read by ``Table.from_sas``.
18
+
19
+ These files are read only.
20
+
21
+ The example reads
22
+ [airline.sas7bdat](https://github.com/Ryieru/numdaplot/blob/main/tests/data/airline.sas7bdat),
23
+ a SAS data file of 32 rows.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ encoding
30
+ The text encoding of the texts stored in the file, UTF-8 by default.
31
+ column_names
32
+ Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
33
+ the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
34
+
35
+ Raises
36
+ ------
37
+ InvalidTypeError
38
+ When a setting is not of the type its annotation names.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> latin_1 = ndp.SasReadOptions(encoding=ndp.Encoding.LATIN_1)
44
+ >>> airline = ndp.Table.from_sas("airline.sas7bdat", latin_1)
45
+ >>> airline.preview(ndp.Preview(count=3))
46
+ YEAR Y W R L K
47
+ FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64
48
+ 0 1948.0 1.214 0.243 0.1454 1.415 0.612
49
+ 1 1949.0 1.354 0.260 0.2181 1.384 0.559
50
+ 2 1950.0 1.569 0.278 0.3157 1.388 0.573
51
+ """
52
+
53
+ encoding: Encoding = Encoding.UTF_8
54
+ column_names: ColumnNames = ColumnNames.CLEANED
55
+
56
+ def __post_init__(self) -> None:
57
+ """
58
+ Check the type of every setting.
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
+ """
67
+ require_field_types(self)
@@ -0,0 +1,83 @@
1
+ """
2
+ Reading and writing Stata files.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from pathlib import Path
8
+
9
+ import pandas
10
+
11
+ from numdaplot.tables.frames.time_zones import require_no_time_zone
12
+
13
+ STATA_OPERATION = "A Stata file"
14
+
15
+
16
+ def read_stata_file(path: Path) -> pandas.DataFrame:
17
+ """
18
+ Return the columns of a Stata file (``.dta``).
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ path
25
+ The path of an existing Stata file.
26
+
27
+ Returns
28
+ -------
29
+ pandas.DataFrame
30
+ The columns as pandas reads them.
31
+
32
+ Examples
33
+ --------
34
+ >>> import tempfile
35
+ >>> from pathlib import Path
36
+ >>> import pandas
37
+ >>> from numdaplot.tables.files.stata_file import read_stata_file
38
+ >>> path = Path(tempfile.mkdtemp()) / "sales.dta"
39
+ >>> pandas.DataFrame({"price": [1.5]}).to_stata(path, write_index=False)
40
+ >>> read_stata_file(path)
41
+ price
42
+ 0 1.5
43
+ """
44
+ frame = pandas.read_stata(path)
45
+
46
+ return frame
47
+
48
+
49
+ def write_stata_file(frame: pandas.DataFrame, path: Path) -> None:
50
+ """
51
+ Write the columns of a Table in a Stata file (``.dta``).
52
+
53
+ Stata stores integers and booleans holding missing values as decimals, and a missing text
54
+ as an empty text. Column names that Stata refuses, such as names with spaces, are changed
55
+ by pandas with a warning.
56
+
57
+ .. versionadded:: 0.1.0
58
+
59
+ Parameters
60
+ ----------
61
+ frame
62
+ The columns of a Table.
63
+ path
64
+ The path of the file, replaced when it exists.
65
+
66
+ Raises
67
+ ------
68
+ TimeZoneMismatchError
69
+ When a column holds datetimes with a time zone, which Stata files cannot store.
70
+
71
+ Examples
72
+ --------
73
+ >>> import tempfile
74
+ >>> from pathlib import Path
75
+ >>> import pandas
76
+ >>> from numdaplot.tables.files.stata_file import write_stata_file
77
+ >>> path = Path(tempfile.mkdtemp()) / "sales.dta"
78
+ >>> write_stata_file(pandas.DataFrame({"price": [1.5]}), path)
79
+ >>> path.exists()
80
+ True
81
+ """
82
+ require_no_time_zone(frame, STATA_OPERATION)
83
+ frame.to_stata(path, write_index=False)
@@ -0,0 +1,56 @@
1
+ r"""
2
+ Settings of the Stata files a Table reads.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.settings.field_types import require_field_types
10
+ from numdaplot.tables.files.column_names import ColumnNames
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class StataReadOptions:
15
+ r"""
16
+ Settings of a Stata file (``.dta``) read by ``Table.from_stata``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ column_names
23
+ Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
24
+ the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
25
+
26
+ Raises
27
+ ------
28
+ InvalidTypeError
29
+ When a setting is not of the type its annotation names.
30
+
31
+ Examples
32
+ --------
33
+ >>> import tempfile
34
+ >>> from pathlib import Path
35
+ >>> import numdaplot as ndp
36
+ >>> path = Path(tempfile.mkdtemp()) / "sales.dta"
37
+ >>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).to_stata(path)
38
+ >>> options = ndp.StataReadOptions(column_names=ndp.ColumnNames.KEPT)
39
+ >>> ndp.Table.from_stata(path, options).column_names
40
+ ['price']
41
+ """
42
+
43
+ column_names: ColumnNames = ColumnNames.CLEANED
44
+
45
+ def __post_init__(self) -> None:
46
+ """
47
+ Check the type of every setting.
48
+
49
+ .. versionadded:: 0.1.0
50
+
51
+ Raises
52
+ ------
53
+ InvalidTypeError
54
+ When a setting is not of the type its annotation names.
55
+ """
56
+ require_field_types(self)
@@ -0,0 +1,65 @@
1
+ """
2
+ Settings of the SAS transport (XPT) files a Table reads.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.settings.field_types import require_field_types
10
+ from numdaplot.tables.files.column_names import ColumnNames
11
+ from numdaplot.tables.files.encoding import Encoding
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class XptReadOptions:
16
+ """
17
+ Settings of a SAS transport (XPT) file (``.xpt``) read by ``Table.from_xpt``.
18
+
19
+ These files are read only.
20
+
21
+ The example reads
22
+ [paxraw_d_short.xpt](https://github.com/Ryieru/numdaplot/blob/main/tests/data/paxraw_d_short.xpt),
23
+ a SAS transport file of 100 rows.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ encoding
30
+ The text encoding of the texts stored in the file, UTF-8 by default.
31
+ column_names
32
+ Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
33
+ the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
34
+
35
+ Raises
36
+ ------
37
+ InvalidTypeError
38
+ When a setting is not of the type its annotation names.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> latin_1 = ndp.XptReadOptions(encoding=ndp.Encoding.LATIN_1)
44
+ >>> activity = ndp.Table.from_xpt("paxraw_d_short.xpt", latin_1)
45
+ >>> activity.row_count
46
+ 100
47
+ >>> activity.column_names
48
+ ['SEQN', 'PAXSTAT', 'PAXCAL', 'PAXDAY', 'PAXN', 'PAXHOUR', 'PAXMINUT', 'PAXINTEN', 'PAXSTEP']
49
+ """
50
+
51
+ encoding: Encoding = Encoding.UTF_8
52
+ column_names: ColumnNames = ColumnNames.CLEANED
53
+
54
+ def __post_init__(self) -> None:
55
+ """
56
+ Check the type of every setting.
57
+
58
+ .. versionadded:: 0.1.0
59
+
60
+ Raises
61
+ ------
62
+ InvalidTypeError
63
+ When a setting is not of the type its annotation names.
64
+ """
65
+ require_field_types(self)
@@ -0,0 +1,5 @@
1
+ """
2
+ Filters keeping the rows of a Table that satisfy conditions.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,60 @@
1
+ """
2
+ Values of a Table satisfying a rule.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import pandas
8
+
9
+ from numdaplot.rules.rule import Rule
10
+ from numdaplot.tables.filtering.column_mask import build_column_mask
11
+ from numdaplot.tables.frames.column import Column
12
+ from numdaplot.tables.frames.column_values import build_column
13
+
14
+
15
+ def check_frame(frame: pandas.DataFrame, rule: Rule) -> pandas.DataFrame:
16
+ """
17
+ Return which values of every column of a Table satisfy a rule.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ frame
24
+ The columns of a Table.
25
+ rule
26
+ Any rule of numdaplot. A missing value only satisfies ``IsMissing``.
27
+
28
+ Returns
29
+ -------
30
+ pandas.DataFrame
31
+ The same column names and rows, each value replaced by True or False.
32
+
33
+ Raises
34
+ ------
35
+ IncompatibleTypesError
36
+ When the rule does not apply to the type of one of the columns.
37
+
38
+ Examples
39
+ --------
40
+ >>> import pandas
41
+ >>> import numdaplot as ndp
42
+ >>> from numdaplot.tables.filtering.checked_frame import check_frame
43
+ >>> check_frame(pandas.DataFrame({"price": [1.5, None]}), ndp.IsMissing())
44
+ price
45
+ 0 False
46
+ 1 True
47
+ """
48
+ checked_columns = dict[str, Column]()
49
+
50
+ for column_name in frame.columns:
51
+ column = frame[column_name]
52
+ column_mask = build_column_mask(column, rule)
53
+ checked_name = str(column_name)
54
+ checked_columns[checked_name] = build_column(column_mask)
55
+
56
+ row_count = len(frame)
57
+ row_numbers = pandas.RangeIndex(row_count)
58
+ checked = pandas.DataFrame(checked_columns, index=row_numbers)
59
+
60
+ return checked
@@ -0,0 +1,71 @@
1
+ """
2
+ Rows of a Table column satisfying a rule.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ from numpy.typing import NDArray
9
+
10
+ from numdaplot.arrays.selection.rule_mask import build_rule_mask
11
+ from numdaplot.rules.is_missing import IsMissing
12
+ from numdaplot.rules.is_present import IsPresent
13
+ from numdaplot.rules.rule import Rule
14
+ from numdaplot.tables.filtering.rule_moments import match_rule_time_zone
15
+ from numdaplot.tables.frames.column import Column
16
+ from numdaplot.tables.frames.column_values import find_column_missing, read_present_values
17
+ from numdaplot.tables.frames.named_column_errors import NamedColumnErrors
18
+ from numdaplot.tables.frames.time_zones import find_column_time_zone
19
+
20
+
21
+ def build_column_mask(column: Column, rule: Rule) -> NDArray[numpy.bool_]:
22
+ """
23
+ Return which values of a Table column satisfy a rule.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ column
30
+ A Table column.
31
+ rule
32
+ Any rule of numdaplot. A missing value only satisfies ``IsMissing``.
33
+
34
+ Returns
35
+ -------
36
+ NDArray[numpy.bool_]
37
+ True at each row whose value satisfies the rule.
38
+
39
+ Raises
40
+ ------
41
+ IncompatibleTypesError
42
+ When the rule does not apply to the type of the column.
43
+ TimeZoneMismatchError
44
+ When a datetime of the rule has a time zone and the column has none, or the reverse.
45
+
46
+ Examples
47
+ --------
48
+ >>> import pandas
49
+ >>> import numdaplot as ndp
50
+ >>> from numdaplot.tables.filtering.column_mask import build_column_mask
51
+ >>> build_column_mask(pandas.Series([5, None, 12], dtype="Int64"), ndp.Greater(10))
52
+ array([False, False, True])
53
+ """
54
+ missing = find_column_missing(column)
55
+ if isinstance(rule, IsMissing):
56
+ return missing
57
+
58
+ present = ~missing
59
+ if isinstance(rule, IsPresent):
60
+ return present
61
+
62
+ time_zone = find_column_time_zone(column)
63
+ matched_rule = match_rule_time_zone(rule, time_zone)
64
+ present_values = read_present_values(column)
65
+ with NamedColumnErrors(column):
66
+ present_mask = build_rule_mask(present_values, matched_rule)
67
+
68
+ mask = numpy.zeros(missing.shape, dtype=numpy.bool_)
69
+ mask[present] = present_mask
70
+
71
+ return mask
@@ -0,0 +1,62 @@
1
+ """
2
+ How the columns of a Condition combine.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class ColumnMatch(Enum):
11
+ """
12
+ How the columns of a ``Condition`` combine to satisfy it.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
20
+ >>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
21
+ >>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
22
+ >>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ALL)
23
+ >>> ranges.filter(ndp.Filter(conditions=[above_ten]))
24
+ low high
25
+ FLOAT64 FLOAT64
26
+ 0 20.0 40.0
27
+ """
28
+
29
+ ANY = auto()
30
+ """
31
+ A row satisfies the condition when at least one of the columns satisfies the rule. Default value.
32
+
33
+ Examples
34
+ --------
35
+ >>> import numdaplot as ndp
36
+ >>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
37
+ >>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
38
+ >>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
39
+ >>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ANY)
40
+ >>> ranges.filter(ndp.Filter(conditions=[above_ten]))
41
+ low high
42
+ FLOAT64 FLOAT64
43
+ 0 5.0 30.0
44
+ 1 20.0 40.0
45
+ """
46
+
47
+ ALL = auto()
48
+ """
49
+ A row satisfies the condition when every column satisfies the rule.
50
+
51
+ Examples
52
+ --------
53
+ >>> import numdaplot as ndp
54
+ >>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
55
+ >>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
56
+ >>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
57
+ >>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ALL)
58
+ >>> ranges.filter(ndp.Filter(conditions=[above_ten]))
59
+ low high
60
+ FLOAT64 FLOAT64
61
+ 0 20.0 40.0
62
+ """
@@ -0,0 +1,94 @@
1
+ """
2
+ A rule applied to one or several columns of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.empty_list_error import EmptyListError
10
+ from numdaplot.rules.rule import Rule
11
+ from numdaplot.settings.field_types import require_field_types
12
+ from numdaplot.tables.columns.column_names import require_column_names
13
+ from numdaplot.tables.filtering.column_match import ColumnMatch
14
+
15
+ COLUMN_ITEM_NAME = "column"
16
+
17
+
18
+ @dataclass(frozen=True)
19
+ class Condition:
20
+ """
21
+ A rule applied to one or several columns of a Table, used by ``Filter``.
22
+
23
+ A missing value only satisfies ``IsMissing``.
24
+
25
+ .. versionadded:: 0.1.0
26
+
27
+ Parameters
28
+ ----------
29
+ rule
30
+ A ``Rule``, such as ``ndp.Greater(100)`` or ``ndp.IsIn(["Paris"])``: see ``Rule`` for every rule.
31
+ columns
32
+ The names of the columns the rule applies to, every column when omitted.
33
+ The condition keeps its own copy of the list.
34
+ mode
35
+ Whether one column satisfying the rule is enough, ``ColumnMatch.ANY`` by default, or every column must,
36
+ ``ColumnMatch.ALL``.
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
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 90.0])
53
+ >>> costs = ndp.Array.from_list([70.0, 60.0, 110.0])
54
+ >>> sales = ndp.Table.from_arrays({"price": prices, "cost": costs})
55
+ >>> above_hundred = ndp.Condition(rule=ndp.Greater(100), columns=["price", "cost"])
56
+ >>> sales.filter(ndp.Filter(conditions=[above_hundred]))
57
+ price cost
58
+ FLOAT64 FLOAT64
59
+ 0 120.0 70.0
60
+ 1 90.0 110.0
61
+ """
62
+
63
+ rule: Rule
64
+ columns: list[str] | None = None
65
+ mode: ColumnMatch = ColumnMatch.ANY
66
+
67
+ def __post_init__(self) -> None:
68
+ """
69
+ Check the columns and replace them with a copy that only the condition holds.
70
+
71
+ .. versionadded:: 0.1.0
72
+
73
+ Raises
74
+ ------
75
+ InvalidTypeError
76
+ When a setting is not of the type its annotation names.
77
+ EmptyListError
78
+ When ``columns`` is an empty list.
79
+ InvalidColumnNameError
80
+ When a column name is an empty text.
81
+ DuplicateColumnError
82
+ When a column name appears twice.
83
+ """
84
+ require_field_types(self)
85
+
86
+ if self.columns is None:
87
+ return
88
+
89
+ if self.columns == []:
90
+ raise EmptyListError(COLUMN_ITEM_NAME)
91
+
92
+ require_column_names(self.columns)
93
+ columns_copy = list(self.columns)
94
+ object.__setattr__(self, "columns", columns_copy)