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,195 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Selection of the values of an Array, by rule and by position.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import TYPE_CHECKING, Self
|
|
10
|
+
|
|
11
|
+
from numdaplot.arrays.array_data import ArrayData
|
|
12
|
+
from numdaplot.arrays.selection.region_index import build_region_index
|
|
13
|
+
from numdaplot.arrays.selection.replaced_values import replace_region
|
|
14
|
+
from numdaplot.arrays.selection.rule_mask import build_rule_mask
|
|
15
|
+
from numdaplot.positions.region import Region
|
|
16
|
+
from numdaplot.rules.rule import Rule
|
|
17
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from numdaplot.arrays.replacement import Replacement
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ArraySelection(ArrayData):
|
|
24
|
+
"""
|
|
25
|
+
Selection of the values of an Array.
|
|
26
|
+
|
|
27
|
+
By rule with ``select`` and ``check``, by position with ``take`` and ``replace``.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
@checked_arguments
|
|
33
|
+
def select(self, rule: Rule) -> Self:
|
|
34
|
+
"""
|
|
35
|
+
Return the values satisfying a rule, in one dimension.
|
|
36
|
+
|
|
37
|
+
.. versionadded:: 0.1.0
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
rule
|
|
42
|
+
A ``Rule``, such as ``ndp.Greater(10)`` or ``ndp.IsIn(["Paris"])``: see ``Rule`` for every rule.
|
|
43
|
+
A missing value only satisfies ``IsMissing``.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
Self
|
|
48
|
+
A new one-dimensional Array, in reading order.
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
InvalidTypeError
|
|
53
|
+
When an argument is not of the type its annotation names.
|
|
54
|
+
IncompatibleTypesError
|
|
55
|
+
When the rule does not apply to the type of the values.
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> import numdaplot as ndp
|
|
60
|
+
>>> prices = ndp.Array.from_list([[5, 12], [30, 8]])
|
|
61
|
+
>>> prices.select(ndp.Greater(10))
|
|
62
|
+
Array([12, 30], dtype=INT64)
|
|
63
|
+
"""
|
|
64
|
+
mask = build_rule_mask(self._values, rule)
|
|
65
|
+
selected_values = self._values[mask]
|
|
66
|
+
selected_array = self._wrap(selected_values)
|
|
67
|
+
|
|
68
|
+
return selected_array
|
|
69
|
+
|
|
70
|
+
@checked_arguments
|
|
71
|
+
def check(self, rule: Rule) -> Self:
|
|
72
|
+
"""
|
|
73
|
+
Return whether each value satisfies a rule, keeping the shape.
|
|
74
|
+
|
|
75
|
+
Combine several checks with ``&``, ``|`` and ``~``.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
rule
|
|
82
|
+
A ``Rule``, such as ``ndp.Greater(10)`` or ``ndp.IsIn(["Paris"])``: see ``Rule`` for every rule.
|
|
83
|
+
A missing value only satisfies ``IsMissing``.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
Self
|
|
88
|
+
A new ``BOOL`` Array of the same shape.
|
|
89
|
+
|
|
90
|
+
Raises
|
|
91
|
+
------
|
|
92
|
+
InvalidTypeError
|
|
93
|
+
When an argument is not of the type its annotation names.
|
|
94
|
+
IncompatibleTypesError
|
|
95
|
+
When the rule does not apply to the type of the values.
|
|
96
|
+
|
|
97
|
+
Examples
|
|
98
|
+
--------
|
|
99
|
+
>>> import numdaplot as ndp
|
|
100
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
101
|
+
>>> cities.check(ndp.Contains("Pa"))
|
|
102
|
+
Array([ True, False, True], dtype=BOOL)
|
|
103
|
+
"""
|
|
104
|
+
mask = build_rule_mask(self._values, rule)
|
|
105
|
+
mask_array = self._wrap(mask)
|
|
106
|
+
|
|
107
|
+
return mask_array
|
|
108
|
+
|
|
109
|
+
@checked_arguments
|
|
110
|
+
def take(self, region: Region) -> Self:
|
|
111
|
+
"""
|
|
112
|
+
Return the values of a region of a one- or two-dimensional Array.
|
|
113
|
+
|
|
114
|
+
A row or a column chosen with ``Index`` keeps its dimension: one row of a two-dimensional
|
|
115
|
+
Array is still two-dimensional. Use ``to_value`` to read a single value.
|
|
116
|
+
|
|
117
|
+
.. versionadded:: 0.1.0
|
|
118
|
+
|
|
119
|
+
Parameters
|
|
120
|
+
----------
|
|
121
|
+
region
|
|
122
|
+
The rows and the columns to take, every one of a dimension when omitted.
|
|
123
|
+
Negative positions count from the end.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
Self
|
|
128
|
+
A new Array with as many dimensions as this one.
|
|
129
|
+
|
|
130
|
+
Raises
|
|
131
|
+
------
|
|
132
|
+
InvalidTypeError
|
|
133
|
+
When an argument is not of the type its annotation names.
|
|
134
|
+
DimensionError
|
|
135
|
+
When the Array has more than two dimensions, or columns are given for a one-dimensional Array.
|
|
136
|
+
RefusedOperationError
|
|
137
|
+
When columns are given as names, which only a Table has.
|
|
138
|
+
InvalidPositionError
|
|
139
|
+
When a position is not a whole number inside its dimension.
|
|
140
|
+
|
|
141
|
+
Examples
|
|
142
|
+
--------
|
|
143
|
+
>>> import numdaplot as ndp
|
|
144
|
+
>>> grid = ndp.Array.from_list([[1, 2, 3], [4, 5, 6]])
|
|
145
|
+
>>> grid.take(ndp.Region(rows=ndp.Index(-1), columns=ndp.Range(start=0, stop=1)))
|
|
146
|
+
Array([[4, 5]], dtype=INT64)
|
|
147
|
+
"""
|
|
148
|
+
region_index = build_region_index(region, self._values.shape)
|
|
149
|
+
region_values = self._values[region_index]
|
|
150
|
+
region_array = self._wrap(region_values)
|
|
151
|
+
|
|
152
|
+
return region_array
|
|
153
|
+
|
|
154
|
+
@checked_arguments
|
|
155
|
+
def replace(self, replacement: Replacement) -> Self:
|
|
156
|
+
"""
|
|
157
|
+
Return a new Array whose region is replaced; this Array does not change.
|
|
158
|
+
|
|
159
|
+
.. versionadded:: 0.1.0
|
|
160
|
+
|
|
161
|
+
Parameters
|
|
162
|
+
----------
|
|
163
|
+
replacement
|
|
164
|
+
The region, and a single value or an Array of exactly the shape of the region.
|
|
165
|
+
|
|
166
|
+
Returns
|
|
167
|
+
-------
|
|
168
|
+
Self
|
|
169
|
+
A new Array of the same shape and type.
|
|
170
|
+
|
|
171
|
+
Raises
|
|
172
|
+
------
|
|
173
|
+
InvalidTypeError
|
|
174
|
+
When an argument is not of the type its annotation names.
|
|
175
|
+
ShapeMismatchError
|
|
176
|
+
When an Array of new values does not have the shape of the region.
|
|
177
|
+
ValueConversionError
|
|
178
|
+
When the new values cannot be stored in the type of the Array without losing information.
|
|
179
|
+
TimeOverflowError
|
|
180
|
+
When a datetime is outside 1677 to 2262, or a duration beyond about 292 years.
|
|
181
|
+
DimensionError, RefusedOperationError, InvalidPositionError
|
|
182
|
+
When the region does not fit the Array, as in ``take``.
|
|
183
|
+
|
|
184
|
+
Examples
|
|
185
|
+
--------
|
|
186
|
+
>>> import numdaplot as ndp
|
|
187
|
+
>>> scores = ndp.Array.from_list([10, 20, 30])
|
|
188
|
+
>>> scores.replace(ndp.Replacement(region=ndp.Region(rows=ndp.Index(1)), value=0))
|
|
189
|
+
Array([10, 0, 30], dtype=INT64)
|
|
190
|
+
"""
|
|
191
|
+
new_values = self._read_operand(replacement.value)
|
|
192
|
+
replaced_values = replace_region(self._values, replacement.region, new_values)
|
|
193
|
+
replaced_array = self._wrap(replaced_values)
|
|
194
|
+
|
|
195
|
+
return replaced_array
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the sort of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.ordering.missing_position import MissingPosition
|
|
10
|
+
from numdaplot.ordering.order import Order
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class ArraySorting:
|
|
16
|
+
"""
|
|
17
|
+
Settings of the sort of an Array, used by ``Array.sort``.
|
|
18
|
+
|
|
19
|
+
The axis, inside each row or each column, is given to ``Array.sort`` itself.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
order
|
|
26
|
+
Ascending by default.
|
|
27
|
+
missing
|
|
28
|
+
Place of the missing values, last by default whatever the order.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
Raises
|
|
32
|
+
------
|
|
33
|
+
InvalidTypeError
|
|
34
|
+
When a setting is not of the type its annotation names.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> grid = ndp.Array.from_list([[3, 1], [2, 4]])
|
|
40
|
+
>>> grid.sort(ndp.ArraySorting(order=ndp.Order.DESCENDING), axis=ndp.Axis.EACH_COLUMN)
|
|
41
|
+
Array([[3, 4],
|
|
42
|
+
[2, 1]], dtype=INT64)
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
order: Order = Order.ASCENDING
|
|
46
|
+
missing: MissingPosition = MissingPosition.LAST
|
|
47
|
+
|
|
48
|
+
def __post_init__(self) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Check the type of every setting.
|
|
51
|
+
|
|
52
|
+
.. versionadded:: 0.1.0
|
|
53
|
+
|
|
54
|
+
Raises
|
|
55
|
+
------
|
|
56
|
+
InvalidTypeError
|
|
57
|
+
When a setting is not of the type its annotation names.
|
|
58
|
+
"""
|
|
59
|
+
require_field_types(self)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion of an ``ndp.Axis`` to a numpy axis number.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.dimension_error import DimensionError
|
|
8
|
+
from numdaplot.positions.axis import Axis
|
|
9
|
+
|
|
10
|
+
AXIS_DIMENSION_COUNT = 2
|
|
11
|
+
AXIS_OPERATION = "An axis"
|
|
12
|
+
NUMPY_AXES = {
|
|
13
|
+
Axis.EACH_ROW: 1,
|
|
14
|
+
Axis.EACH_COLUMN: 0,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def find_numpy_axis(axis: Axis | None, dimension_count: int) -> int | None:
|
|
19
|
+
"""
|
|
20
|
+
Return the numpy axis number an operation runs along.
|
|
21
|
+
|
|
22
|
+
``EACH_ROW`` handles every row on its own, so the numpy operation runs along the columns, axis 1.
|
|
23
|
+
|
|
24
|
+
.. versionadded:: 0.1.0
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
axis
|
|
29
|
+
The numdaplot axis, or ``None`` when omitted.
|
|
30
|
+
dimension_count
|
|
31
|
+
The number of dimensions of the Array.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
int or None
|
|
36
|
+
1 for ``EACH_ROW``, 0 for ``EACH_COLUMN``, ``None`` when the axis is omitted.
|
|
37
|
+
|
|
38
|
+
Raises
|
|
39
|
+
------
|
|
40
|
+
DimensionError
|
|
41
|
+
When an axis is given for an Array that is not two-dimensional.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> from numdaplot.arrays.axis_number import find_numpy_axis
|
|
47
|
+
>>> find_numpy_axis(ndp.Axis.EACH_COLUMN, 2)
|
|
48
|
+
0
|
|
49
|
+
"""
|
|
50
|
+
if axis is None:
|
|
51
|
+
return None
|
|
52
|
+
|
|
53
|
+
if dimension_count != AXIS_DIMENSION_COUNT:
|
|
54
|
+
raise DimensionError(AXIS_OPERATION, dimension_count)
|
|
55
|
+
|
|
56
|
+
numpy_axis = NUMPY_AXES[axis]
|
|
57
|
+
|
|
58
|
+
return numpy_axis
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Statistics counting the values of an Array: count, distinct count, most frequent value and its count.
|
|
3
|
+
|
|
4
|
+
Each function ignores missing values, unless ``Count`` is set to include them, and reduces the whole Array when
|
|
5
|
+
``axis`` is ``None``.
|
|
6
|
+
|
|
7
|
+
.. versionadded:: 0.1.0
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from collections.abc import Callable
|
|
11
|
+
from typing import Any, cast
|
|
12
|
+
|
|
13
|
+
import numpy
|
|
14
|
+
from numpy.typing import NDArray
|
|
15
|
+
|
|
16
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
17
|
+
from numdaplot.statistics.count import Count
|
|
18
|
+
from numdaplot.statistics.counted_missing import CountedMissing
|
|
19
|
+
from numdaplot.statistics.statistic import Statistic
|
|
20
|
+
|
|
21
|
+
LAST_AXIS = -1
|
|
22
|
+
NO_VALUE_COUNT = 0
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def compute_count(values: NDArray[Any], axis: int | None, statistic: Statistic) -> Any:
|
|
26
|
+
"""
|
|
27
|
+
Return the number of present values, or of every value when the statistic includes the missing ones.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
values
|
|
34
|
+
The values of an Array.
|
|
35
|
+
axis
|
|
36
|
+
The numpy axis to reduce, or ``None`` for the whole Array.
|
|
37
|
+
statistic
|
|
38
|
+
The ``Count`` statistic, holding whether missing values are counted.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
Any
|
|
43
|
+
A single count, or one count per reduced slice.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> import numpy
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import compute_count
|
|
50
|
+
>>> compute_count(numpy.array([1.0, numpy.nan]), None, ndp.Count())
|
|
51
|
+
np.int64(1)
|
|
52
|
+
>>> compute_count(numpy.array([1.0, numpy.nan]), None, ndp.Count(missing=ndp.CountedMissing.INCLUDED))
|
|
53
|
+
np.int64(2)
|
|
54
|
+
"""
|
|
55
|
+
count = cast(Count, statistic)
|
|
56
|
+
counted = numpy.ones(values.shape, dtype=numpy.bool_)
|
|
57
|
+
if count.missing == CountedMissing.EXCLUDED:
|
|
58
|
+
missing = find_missing(values)
|
|
59
|
+
counted = ~missing
|
|
60
|
+
|
|
61
|
+
counted_values = numpy.sum(counted, axis=axis)
|
|
62
|
+
|
|
63
|
+
return counted_values
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def compute_count_distinct(values: NDArray[Any], axis: int | None, statistic: Statistic) -> Any:
|
|
67
|
+
"""
|
|
68
|
+
Return the number of distinct present values.
|
|
69
|
+
|
|
70
|
+
.. versionadded:: 0.1.0
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
values
|
|
75
|
+
The values of an Array.
|
|
76
|
+
axis
|
|
77
|
+
The numpy axis to reduce, or ``None`` for the whole Array.
|
|
78
|
+
statistic
|
|
79
|
+
The ``CountDistinct`` statistic.
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
Any
|
|
84
|
+
A single count, or one count per reduced slice.
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> import numpy
|
|
89
|
+
>>> import numdaplot as ndp
|
|
90
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import compute_count_distinct
|
|
91
|
+
>>> compute_count_distinct(numpy.array([1, 1, 2]), None, ndp.CountDistinct())
|
|
92
|
+
2
|
|
93
|
+
"""
|
|
94
|
+
distinct_counts = apply_to_each_slice(values, axis, count_distinct_values)
|
|
95
|
+
|
|
96
|
+
return distinct_counts
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def compute_most_frequent(values: NDArray[Any], axis: int | None, statistic: Statistic) -> Any:
|
|
100
|
+
"""
|
|
101
|
+
Return the present value appearing the most often, the lowest one in case of a tie.
|
|
102
|
+
|
|
103
|
+
.. versionadded:: 0.1.0
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
values
|
|
108
|
+
The values of an Array, at least one present value per slice.
|
|
109
|
+
axis
|
|
110
|
+
The numpy axis to reduce, or ``None`` for the whole Array.
|
|
111
|
+
statistic
|
|
112
|
+
The ``MostFrequent`` statistic.
|
|
113
|
+
|
|
114
|
+
Returns
|
|
115
|
+
-------
|
|
116
|
+
Any
|
|
117
|
+
A single value, or one value per reduced slice.
|
|
118
|
+
|
|
119
|
+
Examples
|
|
120
|
+
--------
|
|
121
|
+
>>> import numpy
|
|
122
|
+
>>> import numdaplot as ndp
|
|
123
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import compute_most_frequent
|
|
124
|
+
>>> compute_most_frequent(numpy.array([3, 1, 3]), None, ndp.MostFrequent())
|
|
125
|
+
np.int64(3)
|
|
126
|
+
"""
|
|
127
|
+
most_frequent_values = apply_to_each_slice(values, axis, find_most_frequent_value)
|
|
128
|
+
|
|
129
|
+
return most_frequent_values
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def compute_most_frequent_count(values: NDArray[Any], axis: int | None, statistic: Statistic) -> Any:
|
|
133
|
+
"""
|
|
134
|
+
Return the number of times the most frequent present value appears.
|
|
135
|
+
|
|
136
|
+
.. versionadded:: 0.1.0
|
|
137
|
+
|
|
138
|
+
Parameters
|
|
139
|
+
----------
|
|
140
|
+
values
|
|
141
|
+
The values of an Array.
|
|
142
|
+
axis
|
|
143
|
+
The numpy axis to reduce, or ``None`` for the whole Array.
|
|
144
|
+
statistic
|
|
145
|
+
The ``MostFrequentCount`` statistic.
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
Any
|
|
150
|
+
A single count, or one count per reduced slice. 0 when there is no present value.
|
|
151
|
+
|
|
152
|
+
Examples
|
|
153
|
+
--------
|
|
154
|
+
>>> import numpy
|
|
155
|
+
>>> import numdaplot as ndp
|
|
156
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import compute_most_frequent_count
|
|
157
|
+
>>> compute_most_frequent_count(numpy.array([3, 1, 3]), None, ndp.MostFrequentCount())
|
|
158
|
+
np.int64(2)
|
|
159
|
+
"""
|
|
160
|
+
most_frequent_counts = apply_to_each_slice(values, axis, count_most_frequent_value)
|
|
161
|
+
|
|
162
|
+
return most_frequent_counts
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def apply_to_each_slice(values: NDArray[Any], axis: int | None, slice_function: Callable[[NDArray[Any]], Any]) -> Any:
|
|
166
|
+
"""
|
|
167
|
+
Return the result of a function applied to the whole Array, or to each slice along an axis.
|
|
168
|
+
|
|
169
|
+
.. versionadded:: 0.1.0
|
|
170
|
+
|
|
171
|
+
Parameters
|
|
172
|
+
----------
|
|
173
|
+
values
|
|
174
|
+
The values of an Array.
|
|
175
|
+
axis
|
|
176
|
+
The numpy axis to reduce, or ``None`` for the whole Array.
|
|
177
|
+
slice_function
|
|
178
|
+
The function reducing one-dimensional values to a single result.
|
|
179
|
+
|
|
180
|
+
Returns
|
|
181
|
+
-------
|
|
182
|
+
Any
|
|
183
|
+
A single result, or an array of one result per slice.
|
|
184
|
+
|
|
185
|
+
Examples
|
|
186
|
+
--------
|
|
187
|
+
>>> import numpy
|
|
188
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import apply_to_each_slice
|
|
189
|
+
>>> apply_to_each_slice(numpy.array([[1, 2], [3, 4]]), 0, numpy.max)
|
|
190
|
+
array([3, 4])
|
|
191
|
+
"""
|
|
192
|
+
if axis is None:
|
|
193
|
+
flat_values = values.reshape(LAST_AXIS)
|
|
194
|
+
single_result = slice_function(flat_values)
|
|
195
|
+
return single_result
|
|
196
|
+
|
|
197
|
+
slices = numpy.moveaxis(values, axis, LAST_AXIS)
|
|
198
|
+
slice_results = [slice_function(values_slice) for values_slice in slices]
|
|
199
|
+
results = numpy.array(slice_results)
|
|
200
|
+
|
|
201
|
+
return results
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def find_present_values(values: NDArray[Any]) -> NDArray[Any]:
|
|
205
|
+
"""
|
|
206
|
+
Return the present values, in a single dimension.
|
|
207
|
+
|
|
208
|
+
.. versionadded:: 0.1.0
|
|
209
|
+
|
|
210
|
+
Parameters
|
|
211
|
+
----------
|
|
212
|
+
values
|
|
213
|
+
The values of an Array.
|
|
214
|
+
|
|
215
|
+
Returns
|
|
216
|
+
-------
|
|
217
|
+
NDArray
|
|
218
|
+
Every value that is not missing.
|
|
219
|
+
|
|
220
|
+
Examples
|
|
221
|
+
--------
|
|
222
|
+
>>> import numpy
|
|
223
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import find_present_values
|
|
224
|
+
>>> find_present_values(numpy.array([1.0, numpy.nan]))
|
|
225
|
+
array([1.])
|
|
226
|
+
"""
|
|
227
|
+
missing = find_missing(values)
|
|
228
|
+
present = ~missing
|
|
229
|
+
present_values = values[present]
|
|
230
|
+
|
|
231
|
+
return present_values
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def count_distinct_values(values: NDArray[Any]) -> int:
|
|
235
|
+
"""
|
|
236
|
+
Return the number of distinct present values of one-dimensional values.
|
|
237
|
+
|
|
238
|
+
.. versionadded:: 0.1.0
|
|
239
|
+
|
|
240
|
+
Parameters
|
|
241
|
+
----------
|
|
242
|
+
values
|
|
243
|
+
One-dimensional values.
|
|
244
|
+
|
|
245
|
+
Returns
|
|
246
|
+
-------
|
|
247
|
+
int
|
|
248
|
+
The number of distinct present values.
|
|
249
|
+
|
|
250
|
+
Examples
|
|
251
|
+
--------
|
|
252
|
+
>>> import numpy
|
|
253
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import count_distinct_values
|
|
254
|
+
>>> count_distinct_values(numpy.array(["a", "b", "a"]))
|
|
255
|
+
2
|
|
256
|
+
"""
|
|
257
|
+
present_values = find_present_values(values)
|
|
258
|
+
distinct_values = numpy.unique(present_values)
|
|
259
|
+
distinct_count = distinct_values.size
|
|
260
|
+
|
|
261
|
+
return distinct_count
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def find_most_frequent_value(values: NDArray[Any]) -> Any:
|
|
265
|
+
"""
|
|
266
|
+
Return the present value appearing the most often, the lowest one in case of a tie.
|
|
267
|
+
|
|
268
|
+
.. versionadded:: 0.1.0
|
|
269
|
+
|
|
270
|
+
Parameters
|
|
271
|
+
----------
|
|
272
|
+
values
|
|
273
|
+
One-dimensional values, at least one of them present.
|
|
274
|
+
|
|
275
|
+
Returns
|
|
276
|
+
-------
|
|
277
|
+
Any
|
|
278
|
+
The most frequent value.
|
|
279
|
+
|
|
280
|
+
Examples
|
|
281
|
+
--------
|
|
282
|
+
>>> import numpy
|
|
283
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import find_most_frequent_value
|
|
284
|
+
>>> find_most_frequent_value(numpy.array([2, 1, 2, 1]))
|
|
285
|
+
np.int64(1)
|
|
286
|
+
"""
|
|
287
|
+
present_values = find_present_values(values)
|
|
288
|
+
distinct_values, counts = numpy.unique(present_values, return_counts=True)
|
|
289
|
+
most_frequent_position = numpy.argmax(counts)
|
|
290
|
+
most_frequent_value = distinct_values[most_frequent_position]
|
|
291
|
+
|
|
292
|
+
return most_frequent_value
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def count_most_frequent_value(values: NDArray[Any]) -> Any:
|
|
296
|
+
"""
|
|
297
|
+
Return the number of times the most frequent present value appears.
|
|
298
|
+
|
|
299
|
+
.. versionadded:: 0.1.0
|
|
300
|
+
|
|
301
|
+
Parameters
|
|
302
|
+
----------
|
|
303
|
+
values
|
|
304
|
+
One-dimensional values.
|
|
305
|
+
|
|
306
|
+
Returns
|
|
307
|
+
-------
|
|
308
|
+
Any
|
|
309
|
+
The highest count, 0 when there is no present value.
|
|
310
|
+
|
|
311
|
+
Examples
|
|
312
|
+
--------
|
|
313
|
+
>>> import numpy
|
|
314
|
+
>>> from numdaplot.arrays.calculation.counting_statistics import count_most_frequent_value
|
|
315
|
+
>>> count_most_frequent_value(numpy.array([2, 1, 2]))
|
|
316
|
+
np.int64(2)
|
|
317
|
+
"""
|
|
318
|
+
present_values = find_present_values(values)
|
|
319
|
+
if present_values.size == 0:
|
|
320
|
+
return NO_VALUE_COUNT
|
|
321
|
+
|
|
322
|
+
_, counts = numpy.unique(present_values, return_counts=True)
|
|
323
|
+
highest_count = numpy.max(counts)
|
|
324
|
+
|
|
325
|
+
return highest_count
|