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.
- numdaplot/__init__.py +506 -0
- numdaplot/arrays/__init__.py +5 -0
- numdaplot/arrays/array.py +92 -0
- numdaplot/arrays/array_arithmetic.py +404 -0
- numdaplot/arrays/array_calculation.py +143 -0
- numdaplot/arrays/array_conversion.py +150 -0
- numdaplot/arrays/array_creation.py +371 -0
- numdaplot/arrays/array_data.py +281 -0
- numdaplot/arrays/array_layout.py +179 -0
- numdaplot/arrays/array_logic.py +227 -0
- numdaplot/arrays/array_reflected_arithmetic.py +334 -0
- numdaplot/arrays/array_refusals.py +339 -0
- numdaplot/arrays/array_selection.py +195 -0
- numdaplot/arrays/array_sorting.py +59 -0
- numdaplot/arrays/axis_number.py +58 -0
- numdaplot/arrays/calculation/__init__.py +5 -0
- numdaplot/arrays/calculation/counting_statistics.py +325 -0
- numdaplot/arrays/calculation/location_statistics.py +268 -0
- numdaplot/arrays/calculation/math_function_values.py +183 -0
- numdaplot/arrays/calculation/statistic_values.py +209 -0
- numdaplot/arrays/calculation/time_function_values.py +419 -0
- numdaplot/arrays/conversion/__init__.py +5 -0
- numdaplot/arrays/conversion/array_text.py +62 -0
- numdaplot/arrays/conversion/equality_check.py +72 -0
- numdaplot/arrays/conversion/python_values.py +70 -0
- numdaplot/arrays/conversion/time_text.py +290 -0
- numdaplot/arrays/creation/__init__.py +5 -0
- numdaplot/arrays/creation/date_parts.py +89 -0
- numdaplot/arrays/creation/date_parts_values.py +437 -0
- numdaplot/arrays/creation/distribution.py +54 -0
- numdaplot/arrays/creation/filled_values.py +58 -0
- numdaplot/arrays/creation/list_conversion.py +311 -0
- numdaplot/arrays/creation/list_shape.py +97 -0
- numdaplot/arrays/creation/normal.py +65 -0
- numdaplot/arrays/creation/numpy_conversion.py +149 -0
- numdaplot/arrays/creation/random_integers.py +104 -0
- numdaplot/arrays/creation/random_values.py +97 -0
- numdaplot/arrays/creation/range_values.py +73 -0
- numdaplot/arrays/creation/spacing.py +84 -0
- numdaplot/arrays/creation/spacing_values.py +63 -0
- numdaplot/arrays/creation/uniform.py +63 -0
- numdaplot/arrays/equality.py +68 -0
- numdaplot/arrays/layout/__init__.py +5 -0
- numdaplot/arrays/layout/sorting_values.py +113 -0
- numdaplot/arrays/layout/unique_values.py +49 -0
- numdaplot/arrays/mapping/__init__.py +5 -0
- numdaplot/arrays/mapping/mapped_values.py +286 -0
- numdaplot/arrays/mapping/unmatched.py +50 -0
- numdaplot/arrays/mapping/value_change.py +55 -0
- numdaplot/arrays/mapping/value_mapping.py +161 -0
- numdaplot/arrays/math_functions/__init__.py +5 -0
- numdaplot/arrays/math_functions/absolute.py +27 -0
- numdaplot/arrays/math_functions/cosine.py +28 -0
- numdaplot/arrays/math_functions/exponential.py +27 -0
- numdaplot/arrays/math_functions/logarithm.py +72 -0
- numdaplot/arrays/math_functions/math_function.py +58 -0
- numdaplot/arrays/math_functions/round.py +58 -0
- numdaplot/arrays/math_functions/sine.py +28 -0
- numdaplot/arrays/math_functions/square_root.py +27 -0
- numdaplot/arrays/operations/__init__.py +5 -0
- numdaplot/arrays/operations/boolean_operands.py +48 -0
- numdaplot/arrays/operations/combination.py +157 -0
- numdaplot/arrays/operations/float_errors.py +170 -0
- numdaplot/arrays/operations/integer_bounds.py +175 -0
- numdaplot/arrays/operations/integer_rules.py +397 -0
- numdaplot/arrays/operations/operand.py +139 -0
- numdaplot/arrays/operations/time_arithmetic.py +479 -0
- numdaplot/arrays/operations/time_bounds.py +286 -0
- numdaplot/arrays/operations/time_result_bounds.py +397 -0
- numdaplot/arrays/operations/transformation.py +54 -0
- numdaplot/arrays/operations/type_requirements.py +94 -0
- numdaplot/arrays/replacement.py +66 -0
- numdaplot/arrays/selection/__init__.py +5 -0
- numdaplot/arrays/selection/comparison_masks.py +131 -0
- numdaplot/arrays/selection/membership_masks.py +118 -0
- numdaplot/arrays/selection/missing_mask.py +50 -0
- numdaplot/arrays/selection/region_index.py +178 -0
- numdaplot/arrays/selection/replaced_values.py +120 -0
- numdaplot/arrays/selection/rule_mask.py +83 -0
- numdaplot/arrays/selection/time_reference.py +172 -0
- numdaplot/arrays/shape.py +74 -0
- numdaplot/arrays/type_match.py +51 -0
- numdaplot/data_types/__init__.py +5 -0
- numdaplot/data_types/library.py +57 -0
- numdaplot/data_types/numpy_mapping.py +207 -0
- numdaplot/data_types/pandas_mapping.py +114 -0
- numdaplot/data_types/time_of_day.py +292 -0
- numdaplot/data_types/type.py +224 -0
- numdaplot/data_types/value_family.py +149 -0
- numdaplot/data_types/value_type.py +147 -0
- numdaplot/dates/__init__.py +5 -0
- numdaplot/dates/custom_date_format.py +83 -0
- numdaplot/dates/date_format.py +120 -0
- numdaplot/dates/date_part.py +59 -0
- numdaplot/dates/date_part_unit.py +153 -0
- numdaplot/dates/date_period.py +57 -0
- numdaplot/dates/duration_in.py +58 -0
- numdaplot/dates/duration_unit.py +90 -0
- numdaplot/dates/period_unit.py +101 -0
- numdaplot/dates/time_function.py +56 -0
- numdaplot/dates/time_zone.py +68 -0
- numdaplot/dates/time_zone_change.py +71 -0
- numdaplot/dates/time_zone_mode.py +81 -0
- numdaplot/dates/to_duration.py +58 -0
- numdaplot/errors/__init__.py +7 -0
- numdaplot/errors/broadcast_warning.py +36 -0
- numdaplot/errors/calculation_warning.py +35 -0
- numdaplot/errors/cell_out_of_range_error.py +77 -0
- numdaplot/errors/column_not_found_error.py +64 -0
- numdaplot/errors/conflicting_settings_error.py +60 -0
- numdaplot/errors/dimension_error.py +62 -0
- numdaplot/errors/display_warning.py +32 -0
- numdaplot/errors/duplicate_column_error.py +82 -0
- numdaplot/errors/duplicate_label_error.py +55 -0
- numdaplot/errors/duplicate_statistic_error.py +55 -0
- numdaplot/errors/duplicate_value_error.py +54 -0
- numdaplot/errors/empty_array_error.py +55 -0
- numdaplot/errors/empty_list_error.py +52 -0
- numdaplot/errors/empty_region_error.py +34 -0
- numdaplot/errors/empty_text_error.py +34 -0
- numdaplot/errors/empty_total_error.py +62 -0
- numdaplot/errors/empty_values_error.py +34 -0
- numdaplot/errors/file_access_error.py +70 -0
- numdaplot/errors/file_exists_error.py +62 -0
- numdaplot/errors/file_not_found_error.py +56 -0
- numdaplot/errors/incompatible_charts_error.py +80 -0
- numdaplot/errors/incompatible_types_error.py +104 -0
- numdaplot/errors/integer_overflow_error.py +61 -0
- numdaplot/errors/invalid_base_error.py +52 -0
- numdaplot/errors/invalid_bin_width_error.py +66 -0
- numdaplot/errors/invalid_bounds_error.py +58 -0
- numdaplot/errors/invalid_chart_data_error.py +81 -0
- numdaplot/errors/invalid_color_count_error.py +63 -0
- numdaplot/errors/invalid_color_error.py +51 -0
- numdaplot/errors/invalid_column_name_error.py +52 -0
- numdaplot/errors/invalid_conversion_error.py +119 -0
- numdaplot/errors/invalid_count_error.py +61 -0
- numdaplot/errors/invalid_date_format_error.py +51 -0
- numdaplot/errors/invalid_deviation_error.py +52 -0
- numdaplot/errors/invalid_fraction_error.py +51 -0
- numdaplot/errors/invalid_label_count_error.py +61 -0
- numdaplot/errors/invalid_limits_error.py +111 -0
- numdaplot/errors/invalid_opacity_error.py +52 -0
- numdaplot/errors/invalid_point_size_error.py +52 -0
- numdaplot/errors/invalid_position_error.py +106 -0
- numdaplot/errors/invalid_resolution_error.py +51 -0
- numdaplot/errors/invalid_rotation_error.py +53 -0
- numdaplot/errors/invalid_seed_error.py +53 -0
- numdaplot/errors/invalid_separator_error.py +52 -0
- numdaplot/errors/invalid_shape_error.py +52 -0
- numdaplot/errors/invalid_sheet_name_error.py +54 -0
- numdaplot/errors/invalid_size_error.py +58 -0
- numdaplot/errors/invalid_step_error.py +77 -0
- numdaplot/errors/invalid_suffixes_error.py +61 -0
- numdaplot/errors/invalid_time_zone_change_error.py +63 -0
- numdaplot/errors/invalid_type_error.py +79 -0
- numdaplot/errors/irregular_list_error.py +36 -0
- numdaplot/errors/join_relation_error.py +183 -0
- numdaplot/errors/missing_dependency_error.py +58 -0
- numdaplot/errors/missing_type_error.py +36 -0
- numdaplot/errors/missing_value_error.py +62 -0
- numdaplot/errors/not_single_value_error.py +53 -0
- numdaplot/errors/numdaplot_error.py +25 -0
- numdaplot/errors/numdaplot_warning.py +34 -0
- numdaplot/errors/occupied_cell_error.py +63 -0
- numdaplot/errors/out_of_domain_error.py +70 -0
- numdaplot/errors/readability_warning.py +35 -0
- numdaplot/errors/refused_operation_error.py +64 -0
- numdaplot/errors/refused_setting_error.py +60 -0
- numdaplot/errors/rejected_dates.py +60 -0
- numdaplot/errors/repeated_key.py +36 -0
- numdaplot/errors/shape_mismatch_error.py +67 -0
- numdaplot/errors/time_overflow_error.py +131 -0
- numdaplot/errors/time_zone_mismatch_error.py +83 -0
- numdaplot/errors/unknown_time_zone_error.py +51 -0
- numdaplot/errors/unmatched_value_error.py +81 -0
- numdaplot/errors/unsupported_image_format_error.py +56 -0
- numdaplot/errors/unsupported_index_error.py +38 -0
- numdaplot/errors/unsupported_missing_error.py +129 -0
- numdaplot/errors/unsupported_type_error.py +62 -0
- numdaplot/errors/value_conversion_error.py +215 -0
- numdaplot/ordering/__init__.py +5 -0
- numdaplot/ordering/missing_position.py +46 -0
- numdaplot/ordering/order.py +46 -0
- numdaplot/package_version.py +36 -0
- numdaplot/plots/__init__.py +5 -0
- numdaplot/plots/chart_layer.py +47 -0
- numdaplot/plots/charts/__init__.py +5 -0
- numdaplot/plots/charts/bar_chart.py +98 -0
- numdaplot/plots/charts/bar_layout.py +58 -0
- numdaplot/plots/charts/bin_count.py +61 -0
- numdaplot/plots/charts/bin_width.py +78 -0
- numdaplot/plots/charts/box_chart.py +97 -0
- numdaplot/plots/charts/cell_values.py +61 -0
- numdaplot/plots/charts/chart.py +59 -0
- numdaplot/plots/charts/chart_settings.py +105 -0
- numdaplot/plots/charts/color_scale.py +147 -0
- numdaplot/plots/charts/heatmap_chart.py +92 -0
- numdaplot/plots/charts/histogram_chart.py +93 -0
- numdaplot/plots/charts/line_chart.py +100 -0
- numdaplot/plots/charts/line_type.py +75 -0
- numdaplot/plots/charts/marker_shape.py +113 -0
- numdaplot/plots/charts/missing_chart.py +60 -0
- numdaplot/plots/charts/missing_map_chart.py +27 -0
- numdaplot/plots/charts/orientation.py +58 -0
- numdaplot/plots/charts/outliers.py +49 -0
- numdaplot/plots/charts/percentages.py +55 -0
- numdaplot/plots/charts/pie_chart.py +87 -0
- numdaplot/plots/charts/scatter_chart.py +159 -0
- numdaplot/plots/charts/value_axis.py +66 -0
- numdaplot/plots/data/__init__.py +5 -0
- numdaplot/plots/data/array_values.py +128 -0
- numdaplot/plots/data/chart_data.py +143 -0
- numdaplot/plots/data/chart_values.py +109 -0
- numdaplot/plots/data/column_reading.py +468 -0
- numdaplot/plots/data/heatmap_values.py +63 -0
- numdaplot/plots/data/missing_cells.py +165 -0
- numdaplot/plots/data/pie_values.py +215 -0
- numdaplot/plots/data/point_values.py +249 -0
- numdaplot/plots/data/position_kind.py +83 -0
- numdaplot/plots/data/renamed_layers.py +340 -0
- numdaplot/plots/data/sample_values.py +160 -0
- numdaplot/plots/data/shown_columns.py +248 -0
- numdaplot/plots/data/table_values.py +256 -0
- numdaplot/plots/data/unique_labels.py +45 -0
- numdaplot/plots/drawing/__init__.py +5 -0
- numdaplot/plots/drawing/bar_drawing.py +316 -0
- numdaplot/plots/drawing/box_drawing.py +344 -0
- numdaplot/plots/drawing/cell_merging.py +237 -0
- numdaplot/plots/drawing/chart_texts.py +124 -0
- numdaplot/plots/drawing/color_bar.py +57 -0
- numdaplot/plots/drawing/color_scale_values.py +120 -0
- numdaplot/plots/drawing/default_labels.py +41 -0
- numdaplot/plots/drawing/drawn_chart.py +50 -0
- numdaplot/plots/drawing/grid_axes.py +75 -0
- numdaplot/plots/drawing/heatmap_drawing.py +313 -0
- numdaplot/plots/drawing/histogram_drawing.py +350 -0
- numdaplot/plots/drawing/label_room.py +344 -0
- numdaplot/plots/drawing/label_thinning.py +216 -0
- numdaplot/plots/drawing/layer_alignment.py +319 -0
- numdaplot/plots/drawing/layer_colors.py +123 -0
- numdaplot/plots/drawing/line_drawing.py +85 -0
- numdaplot/plots/drawing/marker_codes.py +20 -0
- numdaplot/plots/drawing/missing_drawing.py +360 -0
- numdaplot/plots/drawing/moment_period_formatter.py +253 -0
- numdaplot/plots/drawing/pie_drawing.py +185 -0
- numdaplot/plots/drawing/plot_axes.py +38 -0
- numdaplot/plots/drawing/plot_drawing.py +288 -0
- numdaplot/plots/drawing/plot_theme.py +45 -0
- numdaplot/plots/drawing/position_axis.py +278 -0
- numdaplot/plots/drawing/scatter_drawing.py +364 -0
- numdaplot/plots/drawing/series_colors.py +177 -0
- numdaplot/plots/drawing/size_inches.py +45 -0
- numdaplot/plots/drawing/style_drawing.py +410 -0
- numdaplot/plots/drawing/text_contrast.py +44 -0
- numdaplot/plots/drawing/tick_rotation.py +354 -0
- numdaplot/plots/drawing/time_axis.py +212 -0
- numdaplot/plots/drawing/whole_numbers.py +72 -0
- numdaplot/plots/figure/__init__.py +5 -0
- numdaplot/plots/figure/cell.py +95 -0
- numdaplot/plots/figure/figure.py +256 -0
- numdaplot/plots/figure/figure_drawing.py +99 -0
- numdaplot/plots/figure/figure_style.py +60 -0
- numdaplot/plots/figure/layout.py +71 -0
- numdaplot/plots/figure/placement.py +150 -0
- numdaplot/plots/layer_reading.py +166 -0
- numdaplot/plots/output/__init__.py +5 -0
- numdaplot/plots/output/image_saving.py +187 -0
- numdaplot/plots/output/plot_display.py +181 -0
- numdaplot/plots/output/shown_object.py +45 -0
- numdaplot/plots/overlay_checks.py +245 -0
- numdaplot/plots/plot.py +31 -0
- numdaplot/plots/plot_data.py +140 -0
- numdaplot/plots/plot_distribution_creation.py +237 -0
- numdaplot/plots/plot_output.py +124 -0
- numdaplot/plots/plot_overlays.py +273 -0
- numdaplot/plots/plot_overview_creation.py +195 -0
- numdaplot/plots/plot_series_creation.py +213 -0
- numdaplot/plots/style/__init__.py +5 -0
- numdaplot/plots/style/axis_settings.py +60 -0
- numdaplot/plots/style/color.py +168 -0
- numdaplot/plots/style/custom_color.py +65 -0
- numdaplot/plots/style/grid_lines.py +49 -0
- numdaplot/plots/style/image_options.py +71 -0
- numdaplot/plots/style/legend_position.py +149 -0
- numdaplot/plots/style/plot_style.py +136 -0
- numdaplot/plots/style/size.py +70 -0
- numdaplot/plots/style/size_unit.py +62 -0
- numdaplot/positions/__init__.py +5 -0
- numdaplot/positions/axis.py +54 -0
- numdaplot/positions/index.py +51 -0
- numdaplot/positions/range.py +90 -0
- numdaplot/positions/region.py +92 -0
- numdaplot/py.typed +0 -0
- numdaplot/ratios/__init__.py +5 -0
- numdaplot/ratios/fraction.py +40 -0
- numdaplot/ratios/measure.py +48 -0
- numdaplot/rules/__init__.py +5 -0
- numdaplot/rules/between.py +78 -0
- numdaplot/rules/bounds.py +83 -0
- numdaplot/rules/case.py +48 -0
- numdaplot/rules/contains.py +63 -0
- numdaplot/rules/equal.py +43 -0
- numdaplot/rules/greater.py +39 -0
- numdaplot/rules/greater_or_equal.py +38 -0
- numdaplot/rules/is_in.py +67 -0
- numdaplot/rules/is_missing.py +25 -0
- numdaplot/rules/is_present.py +25 -0
- numdaplot/rules/less.py +39 -0
- numdaplot/rules/less_or_equal.py +38 -0
- numdaplot/rules/not_equal.py +45 -0
- numdaplot/rules/rule.py +62 -0
- numdaplot/rules/rule_values.py +44 -0
- numdaplot/rules/value_rule.py +110 -0
- numdaplot/settings/__init__.py +5 -0
- numdaplot/settings/argument_types.py +327 -0
- numdaplot/settings/field_types.py +593 -0
- numdaplot/statistics/__init__.py +5 -0
- numdaplot/statistics/count.py +71 -0
- numdaplot/statistics/count_distinct.py +27 -0
- numdaplot/statistics/counted_missing.py +46 -0
- numdaplot/statistics/maximum.py +27 -0
- numdaplot/statistics/mean.py +27 -0
- numdaplot/statistics/median.py +27 -0
- numdaplot/statistics/minimum.py +27 -0
- numdaplot/statistics/most_frequent.py +27 -0
- numdaplot/statistics/most_frequent_count.py +27 -0
- numdaplot/statistics/quantile.py +61 -0
- numdaplot/statistics/standard_deviation.py +29 -0
- numdaplot/statistics/statistic.py +63 -0
- numdaplot/statistics/sum.py +27 -0
- numdaplot/tables/__init__.py +5 -0
- numdaplot/tables/aggregation/__init__.py +5 -0
- numdaplot/tables/aggregation/aggregated_frame.py +189 -0
- numdaplot/tables/aggregation/aggregation.py +97 -0
- numdaplot/tables/aggregation/calculation.py +123 -0
- numdaplot/tables/aggregation/result_column.py +108 -0
- numdaplot/tables/aggregation/row_groups.py +96 -0
- numdaplot/tables/aggregation/statistic_name.py +122 -0
- numdaplot/tables/columns/__init__.py +5 -0
- numdaplot/tables/columns/added_column.py +89 -0
- numdaplot/tables/columns/boolean_conversion.py +144 -0
- numdaplot/tables/columns/boolean_rule.py +59 -0
- numdaplot/tables/columns/bracket_end.py +50 -0
- numdaplot/tables/columns/bracket_names.py +346 -0
- numdaplot/tables/columns/bracketed_column.py +179 -0
- numdaplot/tables/columns/brackets.py +234 -0
- numdaplot/tables/columns/chosen_columns.py +55 -0
- numdaplot/tables/columns/column_choice.py +84 -0
- numdaplot/tables/columns/column_mode.py +64 -0
- numdaplot/tables/columns/column_names.py +186 -0
- numdaplot/tables/columns/conversion.py +103 -0
- numdaplot/tables/columns/converted_column.py +669 -0
- numdaplot/tables/columns/date_conversion.py +526 -0
- numdaplot/tables/columns/date_range.py +135 -0
- numdaplot/tables/columns/name_change.py +67 -0
- numdaplot/tables/columns/new_column.py +79 -0
- numdaplot/tables/columns/number_conversion.py +281 -0
- numdaplot/tables/columns/renamed_columns.py +60 -0
- numdaplot/tables/columns/renaming.py +81 -0
- numdaplot/tables/columns/text_conversion.py +70 -0
- numdaplot/tables/columns/time_conversion.py +313 -0
- numdaplot/tables/columns/time_zone_conversion.py +128 -0
- numdaplot/tables/conflict.py +68 -0
- numdaplot/tables/description/__init__.py +5 -0
- numdaplot/tables/description/described_frame.py +335 -0
- numdaplot/tables/description/description.py +155 -0
- numdaplot/tables/duplicates/__init__.py +5 -0
- numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
- numdaplot/tables/duplicates/deduplication.py +88 -0
- numdaplot/tables/duplicates/keep.py +81 -0
- numdaplot/tables/files/__init__.py +5 -0
- numdaplot/tables/files/column_names.py +60 -0
- numdaplot/tables/files/csv_file.py +265 -0
- numdaplot/tables/files/csv_read_options.py +89 -0
- numdaplot/tables/files/csv_separator.py +41 -0
- numdaplot/tables/files/csv_write_options.py +79 -0
- numdaplot/tables/files/decimal_count.py +42 -0
- numdaplot/tables/files/encoding.py +82 -0
- numdaplot/tables/files/excel_file.py +171 -0
- numdaplot/tables/files/excel_read_options.py +79 -0
- numdaplot/tables/files/excel_sheet.py +50 -0
- numdaplot/tables/files/excel_time_cells.py +146 -0
- numdaplot/tables/files/excel_write_options.py +63 -0
- numdaplot/tables/files/file_access.py +152 -0
- numdaplot/tables/files/file_paths.py +106 -0
- numdaplot/tables/files/json_decimals.py +387 -0
- numdaplot/tables/files/json_file.py +203 -0
- numdaplot/tables/files/json_layout.py +63 -0
- numdaplot/tables/files/json_read_options.py +64 -0
- numdaplot/tables/files/json_write_options.py +71 -0
- numdaplot/tables/files/missing_texts.py +63 -0
- numdaplot/tables/files/optional_package.py +42 -0
- numdaplot/tables/files/pandas_backend.py +11 -0
- numdaplot/tables/files/parquet_file.py +91 -0
- numdaplot/tables/files/parquet_read_options.py +56 -0
- numdaplot/tables/files/sas_file.py +94 -0
- numdaplot/tables/files/sas_read_options.py +67 -0
- numdaplot/tables/files/stata_file.py +83 -0
- numdaplot/tables/files/stata_read_options.py +56 -0
- numdaplot/tables/files/xpt_read_options.py +65 -0
- numdaplot/tables/filtering/__init__.py +5 -0
- numdaplot/tables/filtering/checked_frame.py +60 -0
- numdaplot/tables/filtering/column_mask.py +71 -0
- numdaplot/tables/filtering/column_match.py +62 -0
- numdaplot/tables/filtering/condition.py +94 -0
- numdaplot/tables/filtering/filter.py +74 -0
- numdaplot/tables/filtering/filter_mode.py +67 -0
- numdaplot/tables/filtering/row_mask.py +152 -0
- numdaplot/tables/filtering/rule_moments.py +164 -0
- numdaplot/tables/frames/__init__.py +5 -0
- numdaplot/tables/frames/array_frame.py +95 -0
- numdaplot/tables/frames/cleaned_names.py +132 -0
- numdaplot/tables/frames/column.py +15 -0
- numdaplot/tables/frames/column_values.py +273 -0
- numdaplot/tables/frames/frame_equality.py +130 -0
- numdaplot/tables/frames/frame_normalization.py +459 -0
- numdaplot/tables/frames/named_column_errors.py +85 -0
- numdaplot/tables/frames/pandas_decimals.py +113 -0
- numdaplot/tables/frames/region_positions.py +113 -0
- numdaplot/tables/frames/table_text.py +222 -0
- numdaplot/tables/frames/time_columns.py +345 -0
- numdaplot/tables/frames/time_range_errors.py +117 -0
- numdaplot/tables/frames/time_zones.py +271 -0
- numdaplot/tables/joining/__init__.py +5 -0
- numdaplot/tables/joining/join.py +110 -0
- numdaplot/tables/joining/join_keys.py +367 -0
- numdaplot/tables/joining/join_mode.py +93 -0
- numdaplot/tables/joining/join_relation.py +149 -0
- numdaplot/tables/joining/join_suffixes.py +71 -0
- numdaplot/tables/joining/joined_frame.py +166 -0
- numdaplot/tables/joining/joined_names.py +107 -0
- numdaplot/tables/joining/joined_rows.py +235 -0
- numdaplot/tables/joining/key_types.py +57 -0
- numdaplot/tables/joining/relation.py +78 -0
- numdaplot/tables/missing/__init__.py +5 -0
- numdaplot/tables/missing/missing_count.py +59 -0
- numdaplot/tables/missing/missing_counts.py +214 -0
- numdaplot/tables/missing/missing_drop.py +98 -0
- numdaplot/tables/missing/missing_mode.py +63 -0
- numdaplot/tables/missing/missing_ratio.py +71 -0
- numdaplot/tables/missing/missing_removal.py +257 -0
- numdaplot/tables/missing/missing_summary.py +174 -0
- numdaplot/tables/missing/ratio_comparison.py +70 -0
- numdaplot/tables/pivot/__init__.py +5 -0
- numdaplot/tables/pivot/pivot_table.py +104 -0
- numdaplot/tables/pivot/pivoted_frame.py +244 -0
- numdaplot/tables/preview/__init__.py +5 -0
- numdaplot/tables/preview/notebook_display.py +238 -0
- numdaplot/tables/preview/preview.py +100 -0
- numdaplot/tables/preview/preview_rows.py +55 -0
- numdaplot/tables/preview/shown_columns.py +62 -0
- numdaplot/tables/preview/side.py +82 -0
- numdaplot/tables/sorting/__init__.py +5 -0
- numdaplot/tables/sorting/sort_key.py +71 -0
- numdaplot/tables/sorting/sorted_frame.py +81 -0
- numdaplot/tables/sorting/sorting.py +82 -0
- numdaplot/tables/table.py +71 -0
- numdaplot/tables/table_calculation.py +172 -0
- numdaplot/tables/table_columns.py +214 -0
- numdaplot/tables/table_conversion.py +351 -0
- numdaplot/tables/table_data.py +321 -0
- numdaplot/tables/table_display.py +56 -0
- numdaplot/tables/table_joining.py +80 -0
- numdaplot/tables/table_layout.py +105 -0
- numdaplot/tables/table_missing.py +146 -0
- numdaplot/tables/table_reading.py +451 -0
- numdaplot/tables/table_refusals.py +295 -0
- numdaplot/tables/table_selection.py +163 -0
- numdaplot/tables/table_writing.py +269 -0
- numdaplot-0.1.0.dist-info/METADATA +176 -0
- numdaplot-0.1.0.dist-info/RECORD +474 -0
- numdaplot-0.1.0.dist-info/WHEEL +4 -0
- 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,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,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
|
+
"""
|
numdaplot/rules/case.py
ADDED
|
@@ -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()
|
numdaplot/rules/equal.py
ADDED
|
@@ -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
|
numdaplot/rules/is_in.py
ADDED
|
@@ -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
|
+
"""
|