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,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Transformation of each value of an Array with a numpy function of one operand.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.operations.operand import find_operand_type_names
|
|
13
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def transform_values(values: NDArray[Any], function: numpy.ufunc, name: str) -> NDArray[Any]:
|
|
17
|
+
"""
|
|
18
|
+
Return the result of a numpy function applied to each value.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
values
|
|
25
|
+
The values of an Array.
|
|
26
|
+
function
|
|
27
|
+
The numpy function, such as ``numpy.negative``.
|
|
28
|
+
name
|
|
29
|
+
The operator or function name shown in error messages, such as ``"-"``.
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
NDArray
|
|
34
|
+
The transformed values.
|
|
35
|
+
|
|
36
|
+
Raises
|
|
37
|
+
------
|
|
38
|
+
IncompatibleTypesError
|
|
39
|
+
When the function does not apply to the type of the values.
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
--------
|
|
43
|
+
>>> import numpy
|
|
44
|
+
>>> from numdaplot.arrays.operations.transformation import transform_values
|
|
45
|
+
>>> transform_values(numpy.array([1, -2]), numpy.negative, "-")
|
|
46
|
+
array([-1, 2])
|
|
47
|
+
"""
|
|
48
|
+
try:
|
|
49
|
+
transformed_values = function(values)
|
|
50
|
+
except TypeError as error:
|
|
51
|
+
type_names = find_operand_type_names([values])
|
|
52
|
+
raise IncompatibleTypesError(name, type_names) from error
|
|
53
|
+
|
|
54
|
+
return transformed_values
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Checks that the values of an Array have a type an operation applies to.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from numpy.typing import NDArray
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.numpy_mapping import from_numpy_dtype
|
|
12
|
+
from numdaplot.data_types.value_family import ValueFamily, find_family
|
|
13
|
+
from numdaplot.data_types.value_type import find_value_type
|
|
14
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
15
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def require_family(values: NDArray[Any], accepted_families: frozenset[ValueFamily], operation: str) -> None:
|
|
19
|
+
"""
|
|
20
|
+
Check that the values of an Array belong to one of the families an operation applies to.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
values
|
|
27
|
+
The values of an Array.
|
|
28
|
+
accepted_families
|
|
29
|
+
The families the operation applies to.
|
|
30
|
+
operation
|
|
31
|
+
Name of the operation, shown in the error message.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
IncompatibleTypesError
|
|
36
|
+
When the type of the values belongs to another family.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> import numpy
|
|
41
|
+
>>> import numdaplot as ndp
|
|
42
|
+
>>> from numdaplot.arrays.operations.type_requirements import require_family
|
|
43
|
+
>>> from numdaplot.data_types.value_family import ValueFamily
|
|
44
|
+
>>> try:
|
|
45
|
+
... require_family(numpy.array(["a"]), frozenset({ValueFamily.NUMBER}), "Mean")
|
|
46
|
+
... except ndp.IncompatibleTypesError as error:
|
|
47
|
+
... print(error)
|
|
48
|
+
Cannot apply Mean to TEXT.
|
|
49
|
+
"""
|
|
50
|
+
array_type = from_numpy_dtype(values.dtype)
|
|
51
|
+
array_family = find_family(array_type)
|
|
52
|
+
if array_family not in accepted_families:
|
|
53
|
+
raise IncompatibleTypesError(operation, [array_type.name])
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def require_comparable(values: NDArray[Any], reference: ScalarValue, operation: str) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Check that the values of an Array can be compared with a reference value.
|
|
59
|
+
|
|
60
|
+
Numbers compare with numbers, texts with texts, dates and datetimes with each other.
|
|
61
|
+
|
|
62
|
+
.. versionadded:: 0.1.0
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
values
|
|
67
|
+
The values of an Array.
|
|
68
|
+
reference
|
|
69
|
+
The value they are compared with.
|
|
70
|
+
operation
|
|
71
|
+
Name of the operation, shown in the error message.
|
|
72
|
+
|
|
73
|
+
Raises
|
|
74
|
+
------
|
|
75
|
+
IncompatibleTypesError
|
|
76
|
+
When the reference value belongs to another family than the values.
|
|
77
|
+
|
|
78
|
+
Examples
|
|
79
|
+
--------
|
|
80
|
+
>>> import numpy
|
|
81
|
+
>>> import numdaplot as ndp
|
|
82
|
+
>>> from numdaplot.arrays.operations.type_requirements import require_comparable
|
|
83
|
+
>>> try:
|
|
84
|
+
... require_comparable(numpy.array([1, 2]), "10", "Greater")
|
|
85
|
+
... except ndp.IncompatibleTypesError as error:
|
|
86
|
+
... print(error)
|
|
87
|
+
Cannot apply Greater to INT64 and TEXT.
|
|
88
|
+
"""
|
|
89
|
+
array_type = from_numpy_dtype(values.dtype)
|
|
90
|
+
reference_type = find_value_type(reference)
|
|
91
|
+
array_family = find_family(array_type)
|
|
92
|
+
reference_family = find_family(reference_type)
|
|
93
|
+
if array_family != reference_family:
|
|
94
|
+
raise IncompatibleTypesError(operation, [array_type.name, reference_type.name])
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the replacement of a region of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from numdaplot.positions.region import Region
|
|
13
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
14
|
+
from numdaplot.settings.field_types import require_field_types
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from numdaplot.arrays.array import Array
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# eq=False because comparing two settings would compare their Arrays with ==, which Array refuses.
|
|
21
|
+
@dataclass(frozen=True, eq=False)
|
|
22
|
+
class Replacement:
|
|
23
|
+
"""
|
|
24
|
+
Settings of the replacement of a region of an Array, used by ``Array.replace``.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
region
|
|
31
|
+
The positions to replace.
|
|
32
|
+
value
|
|
33
|
+
A ``ScalarValue``, such as ``0`` or ``"Paris"``, written at every position of the region, or an Array of
|
|
34
|
+
exactly the shape of the region. Its type must fit in the type of the Array: a decimal cannot replace
|
|
35
|
+
an integer.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
Raises
|
|
39
|
+
------
|
|
40
|
+
InvalidTypeError
|
|
41
|
+
When a setting is not of the type its annotation names.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> scores = ndp.Array.from_list([10, 20, 30])
|
|
47
|
+
>>> first_score = ndp.Region(rows=ndp.Index(0))
|
|
48
|
+
>>> scores.replace(ndp.Replacement(region=first_score, value=0))
|
|
49
|
+
Array([ 0, 20, 30], dtype=INT64)
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
region: Region
|
|
53
|
+
value: ScalarValue | Array
|
|
54
|
+
|
|
55
|
+
def __post_init__(self) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Check the type of every setting.
|
|
58
|
+
|
|
59
|
+
.. versionadded:: 0.1.0
|
|
60
|
+
|
|
61
|
+
Raises
|
|
62
|
+
------
|
|
63
|
+
InvalidTypeError
|
|
64
|
+
When a setting is not of the type its annotation names.
|
|
65
|
+
"""
|
|
66
|
+
require_field_types(self)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Masks of the rules comparing each value with reference values.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.operations.type_requirements import require_comparable
|
|
13
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
14
|
+
from numdaplot.arrays.selection.time_reference import compare_with_reference
|
|
15
|
+
from numdaplot.rules.between import Between
|
|
16
|
+
from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
|
|
17
|
+
from numdaplot.rules.equal import Equal
|
|
18
|
+
from numdaplot.rules.greater import Greater
|
|
19
|
+
from numdaplot.rules.greater_or_equal import GreaterOrEqual
|
|
20
|
+
from numdaplot.rules.less import Less
|
|
21
|
+
from numdaplot.rules.less_or_equal import LessOrEqual
|
|
22
|
+
from numdaplot.rules.not_equal import NotEqual
|
|
23
|
+
from numdaplot.rules.value_rule import ValueRule
|
|
24
|
+
|
|
25
|
+
COMPARISON_FUNCTIONS = dict[type[ValueRule[Any]], numpy.ufunc](
|
|
26
|
+
{
|
|
27
|
+
Equal: numpy.equal,
|
|
28
|
+
NotEqual: numpy.not_equal,
|
|
29
|
+
Greater: numpy.greater,
|
|
30
|
+
GreaterOrEqual: numpy.greater_equal,
|
|
31
|
+
Less: numpy.less,
|
|
32
|
+
LessOrEqual: numpy.less_equal,
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
BETWEEN_NAME = "Between"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def build_comparison_mask(values: NDArray[Any], rule: ValueRule[Any]) -> NDArray[numpy.bool_]:
|
|
39
|
+
"""
|
|
40
|
+
Return which values satisfy a rule comparing them with a single reference value.
|
|
41
|
+
|
|
42
|
+
A missing value never satisfies the rule, not even ``NotEqual``. A date, a datetime or a duration that nanoseconds
|
|
43
|
+
cannot hold lies beyond every datetime or duration: ``Less`` accepts them all for a reference in the year 3000.
|
|
44
|
+
|
|
45
|
+
.. versionadded:: 0.1.0
|
|
46
|
+
|
|
47
|
+
Parameters
|
|
48
|
+
----------
|
|
49
|
+
values
|
|
50
|
+
The values of an Array.
|
|
51
|
+
rule
|
|
52
|
+
``Equal``, ``NotEqual``, ``Greater``, ``GreaterOrEqual``, ``Less`` or ``LessOrEqual``.
|
|
53
|
+
|
|
54
|
+
Returns
|
|
55
|
+
-------
|
|
56
|
+
NDArray[numpy.bool_]
|
|
57
|
+
True at each value satisfying the rule.
|
|
58
|
+
|
|
59
|
+
Raises
|
|
60
|
+
------
|
|
61
|
+
IncompatibleTypesError
|
|
62
|
+
When the reference value cannot be compared with the values.
|
|
63
|
+
|
|
64
|
+
Examples
|
|
65
|
+
--------
|
|
66
|
+
>>> import numpy
|
|
67
|
+
>>> import numdaplot as ndp
|
|
68
|
+
>>> from numdaplot.arrays.selection.comparison_masks import build_comparison_mask
|
|
69
|
+
>>> build_comparison_mask(numpy.array([1, 5, 9]), ndp.Greater(4))
|
|
70
|
+
array([False, True, True])
|
|
71
|
+
"""
|
|
72
|
+
rule_class = type(rule)
|
|
73
|
+
require_comparable(values, rule.value, rule_class.__name__)
|
|
74
|
+
|
|
75
|
+
compare = COMPARISON_FUNCTIONS[rule_class]
|
|
76
|
+
matches = compare_with_reference(values, rule.value, compare)
|
|
77
|
+
missing = find_missing(values)
|
|
78
|
+
present = ~missing
|
|
79
|
+
mask = matches & present
|
|
80
|
+
|
|
81
|
+
return mask
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def build_between_mask(values: NDArray[Any], rule: Between[Any]) -> NDArray[numpy.bool_]:
|
|
85
|
+
"""
|
|
86
|
+
Return which values lie inside the interval of a ``Between`` rule.
|
|
87
|
+
|
|
88
|
+
.. versionadded:: 0.1.0
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
values
|
|
93
|
+
The values of an Array.
|
|
94
|
+
rule
|
|
95
|
+
The interval and the bounds it includes.
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-------
|
|
99
|
+
NDArray[numpy.bool_]
|
|
100
|
+
True at each value inside the interval. A missing value is never inside.
|
|
101
|
+
|
|
102
|
+
Raises
|
|
103
|
+
------
|
|
104
|
+
IncompatibleTypesError
|
|
105
|
+
When the bounds cannot be compared with the values.
|
|
106
|
+
|
|
107
|
+
Examples
|
|
108
|
+
--------
|
|
109
|
+
>>> import numpy
|
|
110
|
+
>>> import numdaplot as ndp
|
|
111
|
+
>>> from numdaplot.arrays.selection.comparison_masks import build_between_mask
|
|
112
|
+
>>> build_between_mask(numpy.array([1, 5, 9]), ndp.Between(low=1, high=5, bounds=ndp.Bounds.HIGH_ONLY))
|
|
113
|
+
array([False, True, False])
|
|
114
|
+
"""
|
|
115
|
+
require_comparable(values, rule.low, BETWEEN_NAME)
|
|
116
|
+
|
|
117
|
+
compare_with_low = numpy.greater
|
|
118
|
+
if rule.bounds in LOW_INCLUDED_BOUNDS:
|
|
119
|
+
compare_with_low = numpy.greater_equal
|
|
120
|
+
|
|
121
|
+
compare_with_high = numpy.less
|
|
122
|
+
if rule.bounds in HIGH_INCLUDED_BOUNDS:
|
|
123
|
+
compare_with_high = numpy.less_equal
|
|
124
|
+
|
|
125
|
+
above_low = compare_with_reference(values, rule.low, compare_with_low)
|
|
126
|
+
below_high = compare_with_reference(values, rule.high, compare_with_high)
|
|
127
|
+
missing = find_missing(values)
|
|
128
|
+
present = ~missing
|
|
129
|
+
mask = above_low & below_high & present
|
|
130
|
+
|
|
131
|
+
return mask
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Masks of the rules looking for values in a list or for a text inside each value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.operations.operand import convert_time_value
|
|
13
|
+
from numdaplot.arrays.operations.type_requirements import require_comparable, require_family
|
|
14
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
15
|
+
from numdaplot.arrays.selection.time_reference import remove_far_references
|
|
16
|
+
from numdaplot.data_types.value_family import ValueFamily
|
|
17
|
+
from numdaplot.rules.case import Case
|
|
18
|
+
from numdaplot.rules.contains import Contains
|
|
19
|
+
from numdaplot.rules.is_in import IsIn
|
|
20
|
+
|
|
21
|
+
IS_IN_NAME = "IsIn"
|
|
22
|
+
CONTAINS_NAME = "Contains"
|
|
23
|
+
TEXT_FAMILIES = frozenset({ValueFamily.TEXT})
|
|
24
|
+
EMPTY_TEXT = ""
|
|
25
|
+
NOT_FOUND_POSITION = -1
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def build_membership_mask(values: NDArray[Any], rule: IsIn[Any]) -> NDArray[numpy.bool_]:
|
|
29
|
+
"""
|
|
30
|
+
Return which values belong to the accepted values of an ``IsIn`` rule.
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.1.0
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
values
|
|
37
|
+
The values of an Array.
|
|
38
|
+
rule
|
|
39
|
+
The accepted values.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
NDArray[numpy.bool_]
|
|
44
|
+
True at each accepted value. A missing value is never accepted.
|
|
45
|
+
|
|
46
|
+
Raises
|
|
47
|
+
------
|
|
48
|
+
IncompatibleTypesError
|
|
49
|
+
When the accepted values cannot be compared with the values.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> import numpy
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> from numdaplot.arrays.selection.membership_masks import build_membership_mask
|
|
56
|
+
>>> build_membership_mask(numpy.array([1, 2, 3]), ndp.IsIn([1, 3]))
|
|
57
|
+
array([ True, False, True])
|
|
58
|
+
"""
|
|
59
|
+
first_accepted_value = rule.values[0]
|
|
60
|
+
require_comparable(values, first_accepted_value, IS_IN_NAME)
|
|
61
|
+
|
|
62
|
+
near_values = remove_far_references(values, rule.values)
|
|
63
|
+
accepted_values = [convert_time_value(accepted_value) for accepted_value in near_values]
|
|
64
|
+
matches = numpy.isin(values, accepted_values)
|
|
65
|
+
missing = find_missing(values)
|
|
66
|
+
present = ~missing
|
|
67
|
+
mask = matches & present
|
|
68
|
+
|
|
69
|
+
return mask
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def build_contains_mask(values: NDArray[Any], rule: Contains) -> NDArray[numpy.bool_]:
|
|
73
|
+
"""
|
|
74
|
+
Return which texts contain the text of a ``Contains`` rule.
|
|
75
|
+
|
|
76
|
+
.. versionadded:: 0.1.0
|
|
77
|
+
|
|
78
|
+
Parameters
|
|
79
|
+
----------
|
|
80
|
+
values
|
|
81
|
+
The values of a ``TEXT`` Array.
|
|
82
|
+
rule
|
|
83
|
+
The searched text and whether case is ignored.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
NDArray[numpy.bool_]
|
|
88
|
+
True at each text containing the searched text.
|
|
89
|
+
|
|
90
|
+
Raises
|
|
91
|
+
------
|
|
92
|
+
IncompatibleTypesError
|
|
93
|
+
When the values are not texts.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import numpy
|
|
98
|
+
>>> import numdaplot as ndp
|
|
99
|
+
>>> from numdaplot.arrays.selection.membership_masks import build_contains_mask
|
|
100
|
+
>>> build_contains_mask(numpy.array(["Paris", "Lyon"]), ndp.Contains("paris", case=ndp.Case.IGNORED))
|
|
101
|
+
array([ True, False])
|
|
102
|
+
"""
|
|
103
|
+
require_family(values, TEXT_FAMILIES, CONTAINS_NAME)
|
|
104
|
+
|
|
105
|
+
missing = find_missing(values)
|
|
106
|
+
present = ~missing
|
|
107
|
+
# numpy cannot search a missing text. The mask of the present texts removes the empty text standing for it.
|
|
108
|
+
searched_values = numpy.where(missing, EMPTY_TEXT, values)
|
|
109
|
+
searched_text = rule.text
|
|
110
|
+
if rule.case == Case.IGNORED:
|
|
111
|
+
searched_values = numpy.strings.lower(searched_values)
|
|
112
|
+
searched_text = rule.text.lower()
|
|
113
|
+
|
|
114
|
+
positions = numpy.strings.find(searched_values, searched_text)
|
|
115
|
+
found = positions != NOT_FOUND_POSITION
|
|
116
|
+
mask = found & present
|
|
117
|
+
|
|
118
|
+
return mask
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Positions of the missing values of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
NAN_KINDS = frozenset({"f", "T"})
|
|
13
|
+
TIME_KINDS = frozenset({"M", "m"})
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def find_missing(values: NDArray[Any]) -> NDArray[numpy.bool_]:
|
|
17
|
+
"""
|
|
18
|
+
Return which values are missing: NaN for decimals and texts, NaT for dates, datetimes and durations.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
values
|
|
25
|
+
The values of an Array.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
NDArray[numpy.bool_]
|
|
30
|
+
True at each missing value. Always false for types that cannot be missing.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numpy
|
|
35
|
+
>>> from numdaplot.arrays.selection.missing_mask import find_missing
|
|
36
|
+
>>> find_missing(numpy.array([1.0, numpy.nan]))
|
|
37
|
+
array([False, True])
|
|
38
|
+
"""
|
|
39
|
+
value_kind = values.dtype.kind
|
|
40
|
+
if value_kind in NAN_KINDS:
|
|
41
|
+
missing_values = numpy.isnan(values)
|
|
42
|
+
return missing_values
|
|
43
|
+
|
|
44
|
+
if value_kind in TIME_KINDS:
|
|
45
|
+
missing_times = numpy.isnat(values)
|
|
46
|
+
return missing_times
|
|
47
|
+
|
|
48
|
+
no_missing_value = numpy.zeros(values.shape, dtype=numpy.bool_)
|
|
49
|
+
|
|
50
|
+
return no_missing_value
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Numpy index of the positions of a Region inside an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.creation.range_values import compute_range_values
|
|
13
|
+
from numdaplot.errors.dimension_error import DimensionError
|
|
14
|
+
from numdaplot.errors.invalid_position_error import InvalidPositionError
|
|
15
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
16
|
+
from numdaplot.positions.index import Index
|
|
17
|
+
from numdaplot.positions.range import Range
|
|
18
|
+
from numdaplot.positions.region import Region
|
|
19
|
+
|
|
20
|
+
ONE_DIMENSION = 1
|
|
21
|
+
TWO_DIMENSIONS = 2
|
|
22
|
+
WHOLE_NUMBER_KINDS = frozenset({"i", "u"})
|
|
23
|
+
REGION_OPERATION = "A Region"
|
|
24
|
+
COLUMNS_OPERATION = "A Region with columns"
|
|
25
|
+
COLUMN_NAMES_OPERATION = "Column names in a Region for an Array"
|
|
26
|
+
COLUMN_NAMES_ALTERNATIVE = "Index or Range positions"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def build_region_index(region: Region, dimensions: tuple[int, ...]) -> tuple[NDArray[Any], ...]:
|
|
30
|
+
"""
|
|
31
|
+
Return the numpy index selecting the positions of a Region.
|
|
32
|
+
|
|
33
|
+
Rows and columns given as an ``Index`` keep their dimension, so the selection of one row
|
|
34
|
+
of a two-dimensional Array is still two-dimensional.
|
|
35
|
+
|
|
36
|
+
.. versionadded:: 0.1.0
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
region
|
|
41
|
+
The rows and the columns to select.
|
|
42
|
+
dimensions
|
|
43
|
+
The dimensions of the Array.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
tuple[NDArray, ...]
|
|
48
|
+
One array of positions per dimension, usable inside numpy brackets.
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
DimensionError
|
|
53
|
+
When the Array has more than two dimensions, or when columns are given for a
|
|
54
|
+
one-dimensional Array.
|
|
55
|
+
RefusedOperationError
|
|
56
|
+
When columns are given as names, which only a Table has.
|
|
57
|
+
InvalidPositionError
|
|
58
|
+
When a position is not a whole number inside its dimension.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
>>> import numdaplot as ndp
|
|
63
|
+
>>> from numdaplot.arrays.selection.region_index import build_region_index
|
|
64
|
+
>>> build_region_index(ndp.Region(rows=ndp.Index(-1)), (3,))
|
|
65
|
+
(array([-1]),)
|
|
66
|
+
"""
|
|
67
|
+
dimension_count = len(dimensions)
|
|
68
|
+
if dimension_count > TWO_DIMENSIONS:
|
|
69
|
+
raise DimensionError(REGION_OPERATION, dimension_count)
|
|
70
|
+
|
|
71
|
+
if isinstance(region.columns, list):
|
|
72
|
+
raise RefusedOperationError(COLUMN_NAMES_OPERATION, COLUMN_NAMES_ALTERNATIVE)
|
|
73
|
+
|
|
74
|
+
row_count = dimensions[0]
|
|
75
|
+
row_positions = find_positions(region.rows, row_count)
|
|
76
|
+
if dimension_count == ONE_DIMENSION:
|
|
77
|
+
if region.columns is not None:
|
|
78
|
+
raise DimensionError(COLUMNS_OPERATION, dimension_count)
|
|
79
|
+
|
|
80
|
+
return (row_positions,)
|
|
81
|
+
|
|
82
|
+
column_count = dimensions[1]
|
|
83
|
+
column_positions = find_positions(region.columns, column_count)
|
|
84
|
+
region_index = numpy.ix_(row_positions, column_positions)
|
|
85
|
+
|
|
86
|
+
return region_index
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def find_positions(selector: Index | Range | None, size: int) -> NDArray[Any]:
|
|
90
|
+
"""
|
|
91
|
+
Return the positions chosen in one dimension.
|
|
92
|
+
|
|
93
|
+
.. versionadded:: 0.1.0
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
selector
|
|
98
|
+
One position, a sequence of positions, or ``None`` for every position.
|
|
99
|
+
size
|
|
100
|
+
The size of the dimension.
|
|
101
|
+
|
|
102
|
+
Returns
|
|
103
|
+
-------
|
|
104
|
+
NDArray
|
|
105
|
+
The chosen positions, negative ones counting from the end.
|
|
106
|
+
|
|
107
|
+
Raises
|
|
108
|
+
------
|
|
109
|
+
InvalidPositionError
|
|
110
|
+
When a position is not a whole number inside the dimension.
|
|
111
|
+
|
|
112
|
+
Examples
|
|
113
|
+
--------
|
|
114
|
+
>>> import numdaplot as ndp
|
|
115
|
+
>>> from numdaplot.arrays.selection.region_index import find_positions
|
|
116
|
+
>>> find_positions(ndp.Range(start=0, stop=4, step=2), 5)
|
|
117
|
+
array([0, 2, 4])
|
|
118
|
+
"""
|
|
119
|
+
match selector:
|
|
120
|
+
case None:
|
|
121
|
+
positions = numpy.arange(size)
|
|
122
|
+
case Index():
|
|
123
|
+
positions = numpy.array([selector.position])
|
|
124
|
+
case Range():
|
|
125
|
+
positions = compute_range_values(selector)
|
|
126
|
+
|
|
127
|
+
require_valid_positions(positions, size)
|
|
128
|
+
|
|
129
|
+
return positions
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def require_valid_positions(positions: NDArray[Any], size: int) -> None:
|
|
133
|
+
"""
|
|
134
|
+
Check that positions are whole numbers inside a dimension.
|
|
135
|
+
|
|
136
|
+
.. versionadded:: 0.1.0
|
|
137
|
+
|
|
138
|
+
Parameters
|
|
139
|
+
----------
|
|
140
|
+
positions
|
|
141
|
+
The positions to check.
|
|
142
|
+
size
|
|
143
|
+
The size of the dimension, which accepts the positions from ``-size`` to ``size - 1``.
|
|
144
|
+
|
|
145
|
+
Raises
|
|
146
|
+
------
|
|
147
|
+
InvalidPositionError
|
|
148
|
+
At the first position that is not a whole number or falls outside the dimension.
|
|
149
|
+
|
|
150
|
+
Examples
|
|
151
|
+
--------
|
|
152
|
+
>>> import numpy
|
|
153
|
+
>>> import numdaplot as ndp
|
|
154
|
+
>>> from numdaplot.arrays.selection.region_index import require_valid_positions
|
|
155
|
+
>>> try:
|
|
156
|
+
... require_valid_positions(numpy.array([0, 3]), 3)
|
|
157
|
+
... except ndp.InvalidPositionError as error:
|
|
158
|
+
... print(error)
|
|
159
|
+
Expected a whole position between -3 and 2, got 3.
|
|
160
|
+
"""
|
|
161
|
+
if positions.size == 0:
|
|
162
|
+
return
|
|
163
|
+
|
|
164
|
+
if positions.dtype.kind not in WHOLE_NUMBER_KINDS:
|
|
165
|
+
first_position = positions[0]
|
|
166
|
+
rejected_position = first_position.item()
|
|
167
|
+
raise InvalidPositionError(rejected_position, size)
|
|
168
|
+
|
|
169
|
+
lowest_position = -size
|
|
170
|
+
below_lowest = positions < lowest_position
|
|
171
|
+
above_highest = positions >= size
|
|
172
|
+
outside = below_lowest | above_highest
|
|
173
|
+
has_outside_position = outside.any()
|
|
174
|
+
if has_outside_position:
|
|
175
|
+
outside_positions = positions[outside]
|
|
176
|
+
first_outside_position = outside_positions[0]
|
|
177
|
+
rejected_position = first_outside_position.item()
|
|
178
|
+
raise InvalidPositionError(rejected_position, size)
|