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,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Distinct 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
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
13
|
+
|
|
14
|
+
SINGLE_MISSING_VALUE = slice(0, 1)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def find_unique_values(values: NDArray[Any]) -> NDArray[Any]:
|
|
18
|
+
"""
|
|
19
|
+
Return each distinct value once, sorted, with a single missing value at the end when there is one.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
values
|
|
26
|
+
The values of an Array, of any number of dimensions.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
NDArray
|
|
31
|
+
The distinct values, in one dimension.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numpy
|
|
36
|
+
>>> from numdaplot.arrays.layout.unique_values import find_unique_values
|
|
37
|
+
>>> find_unique_values(numpy.array([[3.0, numpy.nan], [1.0, 3.0]]))
|
|
38
|
+
array([ 1., 3., nan])
|
|
39
|
+
"""
|
|
40
|
+
missing = find_missing(values)
|
|
41
|
+
present = ~missing
|
|
42
|
+
present_values = values[present]
|
|
43
|
+
missing_values = values[missing]
|
|
44
|
+
distinct_values = numpy.unique(present_values)
|
|
45
|
+
single_missing_values = missing_values[SINGLE_MISSING_VALUE]
|
|
46
|
+
parts = [distinct_values, single_missing_values]
|
|
47
|
+
unique_values = numpy.concatenate(parts)
|
|
48
|
+
|
|
49
|
+
return unique_values
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Application of a ValueMapping to the values of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from datetime import date, datetime, time
|
|
9
|
+
from typing import Any, cast
|
|
10
|
+
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.arrays.conversion.python_values import to_python_list
|
|
14
|
+
from numdaplot.arrays.creation.list_conversion import convert_list
|
|
15
|
+
from numdaplot.arrays.mapping.unmatched import Unmatched
|
|
16
|
+
from numdaplot.arrays.mapping.value_mapping import MAPPING_OPERATION, ValueMapping, find_new_type
|
|
17
|
+
from numdaplot.arrays.operations.type_requirements import require_comparable
|
|
18
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
19
|
+
from numdaplot.data_types.numpy_mapping import from_numpy_dtype
|
|
20
|
+
from numdaplot.data_types.type import Type
|
|
21
|
+
from numdaplot.errors.unmatched_value_error import UnmatchedValueError
|
|
22
|
+
from numdaplot.errors.unsupported_missing_error import UnsupportedMissingError
|
|
23
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
24
|
+
|
|
25
|
+
DECIMAL_ADVICE = "Give decimal new values, such as 10.0, which can be missing."
|
|
26
|
+
BOOLEAN_ADVICE = "Give texts as new values, which can be missing."
|
|
27
|
+
MIDNIGHT = time()
|
|
28
|
+
INTEGER_TYPES = frozenset(
|
|
29
|
+
{Type.INT8, Type.INT16, Type.INT32, Type.INT64, Type.UINT8, Type.UINT16, Type.UINT32, Type.UINT64}
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def map_values(values: NDArray[Any], mapping: ValueMapping) -> NDArray[Any]:
|
|
34
|
+
"""
|
|
35
|
+
Return the values of an Array replaced by the new values of a mapping, in the same shape.
|
|
36
|
+
|
|
37
|
+
.. versionadded:: 0.1.0
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
values
|
|
42
|
+
The values of an Array.
|
|
43
|
+
mapping
|
|
44
|
+
The new value of each listed value, and what happens to the others.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
NDArray
|
|
49
|
+
The new values, stored with the type the new values share. Missing values stay missing.
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
IncompatibleTypesError
|
|
54
|
+
When the old values are not of the type family of the Array.
|
|
55
|
+
UnmatchedValueError
|
|
56
|
+
When a value has no new value and ``others`` is ``Unmatched.ERROR``.
|
|
57
|
+
UnsupportedMissingError
|
|
58
|
+
When the result holds integers or booleans and a missing value.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
>>> import numpy
|
|
63
|
+
>>> import numdaplot as ndp
|
|
64
|
+
>>> from numdaplot.arrays.mapping.mapped_values import map_values
|
|
65
|
+
>>> mapping = ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")])
|
|
66
|
+
>>> map_values(numpy.array([[1, 2], [2, 1]]), mapping).tolist()
|
|
67
|
+
[['Homme', 'Femme'], ['Femme', 'Homme']]
|
|
68
|
+
"""
|
|
69
|
+
for change in mapping.changes:
|
|
70
|
+
require_comparable(values, change.old_value, MAPPING_OPERATION)
|
|
71
|
+
|
|
72
|
+
flat_values = values.ravel()
|
|
73
|
+
new_values = find_flat_new_values(flat_values, mapping)
|
|
74
|
+
new_type = find_new_type(mapping.changes)
|
|
75
|
+
require_missing_supported(new_values, new_type)
|
|
76
|
+
stored_values = convert_list(new_values, new_type)
|
|
77
|
+
shaped_values = stored_values.reshape(values.shape)
|
|
78
|
+
|
|
79
|
+
return shaped_values
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def find_flat_new_values(flat_values: NDArray[Any], mapping: ValueMapping) -> list[object]:
|
|
83
|
+
"""
|
|
84
|
+
Return the new value of each value of a flat Array, None for a missing one.
|
|
85
|
+
|
|
86
|
+
.. versionadded:: 0.1.0
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
flat_values
|
|
91
|
+
The values of an Array in one dimension.
|
|
92
|
+
mapping
|
|
93
|
+
The new value of each listed value, and what happens to the others.
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
list[object]
|
|
98
|
+
The new Python values, in order.
|
|
99
|
+
|
|
100
|
+
Raises
|
|
101
|
+
------
|
|
102
|
+
UnmatchedValueError
|
|
103
|
+
At the first value without new value, when ``others`` is ``Unmatched.ERROR``.
|
|
104
|
+
|
|
105
|
+
Examples
|
|
106
|
+
--------
|
|
107
|
+
>>> import numpy
|
|
108
|
+
>>> import numdaplot as ndp
|
|
109
|
+
>>> from numdaplot.arrays.mapping.mapped_values import find_flat_new_values
|
|
110
|
+
>>> mapping = ndp.ValueMapping(changes=[ndp.ValueChange(1.0, "one")], others=ndp.Unmatched.MISSING)
|
|
111
|
+
>>> find_flat_new_values(numpy.array([1.0, numpy.nan, 2.0]), mapping)
|
|
112
|
+
['one', None, None]
|
|
113
|
+
"""
|
|
114
|
+
array_type = from_numpy_dtype(flat_values.dtype)
|
|
115
|
+
new_value_by_old = dict[ScalarValue, ScalarValue | None]()
|
|
116
|
+
for change in mapping.changes:
|
|
117
|
+
lookup_value = find_lookup_value(change.old_value, array_type)
|
|
118
|
+
new_value_by_old[lookup_value] = change.new_value
|
|
119
|
+
|
|
120
|
+
missing = find_missing(flat_values)
|
|
121
|
+
raw_missing = missing.tolist()
|
|
122
|
+
is_missing_list = cast(list[bool], raw_missing)
|
|
123
|
+
python_values = to_python_list(flat_values)
|
|
124
|
+
new_values = list[object]()
|
|
125
|
+
for value, is_missing in zip(python_values, is_missing_list, strict=True):
|
|
126
|
+
if is_missing:
|
|
127
|
+
new_values.append(None)
|
|
128
|
+
continue
|
|
129
|
+
|
|
130
|
+
if value in new_value_by_old:
|
|
131
|
+
new_value = new_value_by_old[value]
|
|
132
|
+
new_values.append(new_value)
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
if mapping.others == Unmatched.ERROR:
|
|
136
|
+
raise UnmatchedValueError(value)
|
|
137
|
+
|
|
138
|
+
new_values.append(None)
|
|
139
|
+
|
|
140
|
+
return new_values
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def require_missing_supported(new_values: Sequence[object], new_type: Type | None) -> None:
|
|
144
|
+
"""
|
|
145
|
+
Check that a result of integers or booleans holds no missing value, with advice fitting a mapping.
|
|
146
|
+
|
|
147
|
+
.. versionadded:: 0.1.0
|
|
148
|
+
|
|
149
|
+
Parameters
|
|
150
|
+
----------
|
|
151
|
+
new_values
|
|
152
|
+
The new Python values, None for a missing one.
|
|
153
|
+
new_type
|
|
154
|
+
The type the new values share, or None.
|
|
155
|
+
|
|
156
|
+
Raises
|
|
157
|
+
------
|
|
158
|
+
UnsupportedMissingError
|
|
159
|
+
When the type is an integer or boolean type and a new value is None.
|
|
160
|
+
|
|
161
|
+
Examples
|
|
162
|
+
--------
|
|
163
|
+
>>> import numdaplot as ndp
|
|
164
|
+
>>> from numdaplot.arrays.mapping.mapped_values import require_missing_supported
|
|
165
|
+
>>> try:
|
|
166
|
+
... require_missing_supported([10, None], ndp.Type.INT64)
|
|
167
|
+
... except ndp.UnsupportedMissingError as error:
|
|
168
|
+
... print(error)
|
|
169
|
+
INT64 values cannot be missing in an Array. Give decimal new values, such as 10.0, which can be missing.
|
|
170
|
+
"""
|
|
171
|
+
has_missing = None in new_values
|
|
172
|
+
if not has_missing:
|
|
173
|
+
return
|
|
174
|
+
|
|
175
|
+
if new_type in INTEGER_TYPES:
|
|
176
|
+
raise UnsupportedMissingError(new_type.name, advice=DECIMAL_ADVICE)
|
|
177
|
+
|
|
178
|
+
if new_type == Type.BOOL:
|
|
179
|
+
raise UnsupportedMissingError(new_type.name, advice=BOOLEAN_ADVICE)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def find_lookup_value(old_value: ScalarValue, array_type: Type) -> ScalarValue:
|
|
183
|
+
"""
|
|
184
|
+
Return an old value written as the values of the Array are, so that a date finds a datetime at midnight.
|
|
185
|
+
|
|
186
|
+
.. versionadded:: 0.1.0
|
|
187
|
+
|
|
188
|
+
Parameters
|
|
189
|
+
----------
|
|
190
|
+
old_value
|
|
191
|
+
An old value of a ``ValueChange``.
|
|
192
|
+
array_type
|
|
193
|
+
The type of the values of the Array.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
ScalarValue
|
|
198
|
+
A date as a datetime at midnight for ``DATETIME`` values, a datetime at midnight as a date for ``DATE``
|
|
199
|
+
values, any other value unchanged.
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
>>> from datetime import date
|
|
204
|
+
>>> import numdaplot as ndp
|
|
205
|
+
>>> from numdaplot.arrays.mapping.mapped_values import find_lookup_value
|
|
206
|
+
>>> find_lookup_value(date(2026, 12, 25), ndp.Type.DATETIME)
|
|
207
|
+
datetime.datetime(2026, 12, 25, 0, 0)
|
|
208
|
+
"""
|
|
209
|
+
if array_type == Type.DATETIME:
|
|
210
|
+
datetime_value = write_date_as_datetime(old_value)
|
|
211
|
+
return datetime_value
|
|
212
|
+
|
|
213
|
+
if array_type == Type.DATE:
|
|
214
|
+
date_value = write_midnight_as_date(old_value)
|
|
215
|
+
return date_value
|
|
216
|
+
|
|
217
|
+
return old_value
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def write_date_as_datetime(old_value: ScalarValue) -> ScalarValue:
|
|
221
|
+
"""
|
|
222
|
+
Return a date as the datetime at midnight of that day, any other value unchanged.
|
|
223
|
+
|
|
224
|
+
.. versionadded:: 0.1.0
|
|
225
|
+
|
|
226
|
+
Parameters
|
|
227
|
+
----------
|
|
228
|
+
old_value
|
|
229
|
+
An old value of a ``ValueChange``.
|
|
230
|
+
|
|
231
|
+
Returns
|
|
232
|
+
-------
|
|
233
|
+
ScalarValue
|
|
234
|
+
The datetime at midnight, or the value itself.
|
|
235
|
+
|
|
236
|
+
Examples
|
|
237
|
+
--------
|
|
238
|
+
>>> from datetime import date
|
|
239
|
+
>>> from numdaplot.arrays.mapping.mapped_values import write_date_as_datetime
|
|
240
|
+
>>> write_date_as_datetime(date(2026, 12, 25)), write_date_as_datetime(3)
|
|
241
|
+
(datetime.datetime(2026, 12, 25, 0, 0), 3)
|
|
242
|
+
"""
|
|
243
|
+
if isinstance(old_value, datetime):
|
|
244
|
+
return old_value
|
|
245
|
+
|
|
246
|
+
if not isinstance(old_value, date):
|
|
247
|
+
return old_value
|
|
248
|
+
|
|
249
|
+
midnight = datetime.combine(old_value, MIDNIGHT)
|
|
250
|
+
|
|
251
|
+
return midnight
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def write_midnight_as_date(old_value: ScalarValue) -> ScalarValue:
|
|
255
|
+
"""
|
|
256
|
+
Return a datetime at midnight as its date, any other value unchanged.
|
|
257
|
+
|
|
258
|
+
.. versionadded:: 0.1.0
|
|
259
|
+
|
|
260
|
+
Parameters
|
|
261
|
+
----------
|
|
262
|
+
old_value
|
|
263
|
+
An old value of a ``ValueChange``.
|
|
264
|
+
|
|
265
|
+
Returns
|
|
266
|
+
-------
|
|
267
|
+
ScalarValue
|
|
268
|
+
The date of a datetime at midnight, or the value itself, so that a datetime with a time finds no date.
|
|
269
|
+
|
|
270
|
+
Examples
|
|
271
|
+
--------
|
|
272
|
+
>>> from datetime import datetime
|
|
273
|
+
>>> from numdaplot.arrays.mapping.mapped_values import write_midnight_as_date
|
|
274
|
+
>>> write_midnight_as_date(datetime(2026, 12, 25)), write_midnight_as_date(datetime(2026, 12, 25, 10))
|
|
275
|
+
(datetime.date(2026, 12, 25), datetime.datetime(2026, 12, 25, 10, 0))
|
|
276
|
+
"""
|
|
277
|
+
if not isinstance(old_value, datetime):
|
|
278
|
+
return old_value
|
|
279
|
+
|
|
280
|
+
old_time = old_value.time()
|
|
281
|
+
if old_time != MIDNIGHT:
|
|
282
|
+
return old_value
|
|
283
|
+
|
|
284
|
+
old_date = old_value.date()
|
|
285
|
+
|
|
286
|
+
return old_date
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""
|
|
2
|
+
What happens to a value that no setting gives a new value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Unmatched(Enum):
|
|
11
|
+
"""
|
|
12
|
+
What happens to a value of an Array that a ``ValueMapping`` gives no new value.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> sexes = ndp.Array.from_list([1, 2, 9])
|
|
20
|
+
>>> changes = [ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]
|
|
21
|
+
>>> sexes.apply(ndp.ValueMapping(changes=changes, others=ndp.Unmatched.MISSING))
|
|
22
|
+
Array(['Homme', 'Femme', nan], dtype=TEXT)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
ERROR = auto()
|
|
26
|
+
"""
|
|
27
|
+
The value raises ``UnmatchedValueError``. Default value.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> sexes = ndp.Array.from_list([1, 9])
|
|
33
|
+
>>> try:
|
|
34
|
+
... sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme")], others=ndp.Unmatched.ERROR))
|
|
35
|
+
... except ndp.UnmatchedValueError as error:
|
|
36
|
+
... print(error)
|
|
37
|
+
The value 9 has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
MISSING = auto()
|
|
41
|
+
"""
|
|
42
|
+
The value becomes missing.
|
|
43
|
+
|
|
44
|
+
Examples
|
|
45
|
+
--------
|
|
46
|
+
>>> import numdaplot as ndp
|
|
47
|
+
>>> sexes = ndp.Array.from_list([1, 9])
|
|
48
|
+
>>> sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme")], others=ndp.Unmatched.MISSING))
|
|
49
|
+
Array(['Homme', nan], dtype=TEXT)
|
|
50
|
+
"""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
One old value and the new value replacing it.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
10
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class ValueChange:
|
|
15
|
+
"""
|
|
16
|
+
One old value of an Array and the new value replacing it, used by ``ValueMapping``.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
old_value
|
|
23
|
+
The value replaced, of the type family of the Array: ``2.0`` finds the integer ``2``.
|
|
24
|
+
new_value
|
|
25
|
+
The value replacing it, or None to make it missing.
|
|
26
|
+
|
|
27
|
+
Raises
|
|
28
|
+
------
|
|
29
|
+
InvalidTypeError
|
|
30
|
+
When a setting is not of the type its annotation names, such as None as old value.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> severities = ndp.Array.from_list([1, 2, -1])
|
|
36
|
+
>>> changes = [ndp.ValueChange(1, "Indemne"), ndp.ValueChange(2, "Tue"), ndp.ValueChange(-1, None)]
|
|
37
|
+
>>> severities.apply(ndp.ValueMapping(changes=changes))
|
|
38
|
+
Array(['Indemne', 'Tue', nan], dtype=TEXT)
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
old_value: ScalarValue
|
|
42
|
+
new_value: ScalarValue | None
|
|
43
|
+
|
|
44
|
+
def __post_init__(self) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Check the type of every setting.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
InvalidTypeError
|
|
53
|
+
When a setting is not of the type its annotation names.
|
|
54
|
+
"""
|
|
55
|
+
require_field_types(self)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Replacement of each value of an Array by a new value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.mapping.unmatched import Unmatched
|
|
10
|
+
from numdaplot.arrays.mapping.value_change import ValueChange
|
|
11
|
+
from numdaplot.data_types.type import Type
|
|
12
|
+
from numdaplot.data_types.value_type import find_common_type, find_value_type
|
|
13
|
+
from numdaplot.errors.duplicate_value_error import DuplicateValueError
|
|
14
|
+
from numdaplot.errors.empty_list_error import EmptyListError
|
|
15
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
16
|
+
from numdaplot.settings.field_types import require_field_types
|
|
17
|
+
|
|
18
|
+
CHANGE_ITEM_NAME = "value change"
|
|
19
|
+
MAPPING_OPERATION = "ValueMapping"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class ValueMapping:
|
|
24
|
+
"""
|
|
25
|
+
The new value of each listed value of an Array, used by ``Array.apply``, such as codes replaced by labels.
|
|
26
|
+
|
|
27
|
+
A missing value stays missing. The new values share one type, which the result takes: integers and decimals
|
|
28
|
+
give decimals.
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
changes
|
|
35
|
+
The ``ValueChange`` of each replaced value, at least one, each old value once. The mapping keeps its own copy
|
|
36
|
+
of the list.
|
|
37
|
+
others
|
|
38
|
+
What happens to a value without ``ValueChange``, ``Unmatched.ERROR`` by default.
|
|
39
|
+
|
|
40
|
+
Raises
|
|
41
|
+
------
|
|
42
|
+
InvalidTypeError
|
|
43
|
+
When a setting is not of the type its annotation names.
|
|
44
|
+
EmptyListError
|
|
45
|
+
When ``changes`` is an empty list.
|
|
46
|
+
IncompatibleTypesError
|
|
47
|
+
When the old values, or the new values, mix several families of types, such as numbers and texts.
|
|
48
|
+
DuplicateValueError
|
|
49
|
+
When an old value appears twice.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> import numdaplot as ndp
|
|
54
|
+
>>> sexes = ndp.Array.from_list([2, 1, 2])
|
|
55
|
+
>>> sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]))
|
|
56
|
+
Array(['Femme', 'Homme', 'Femme'], dtype=TEXT)
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
changes: list[ValueChange]
|
|
60
|
+
others: Unmatched = Unmatched.ERROR
|
|
61
|
+
|
|
62
|
+
def __post_init__(self) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Check the changes: at least one, old and new values each of one type family, no old value twice.
|
|
65
|
+
|
|
66
|
+
.. versionadded:: 0.1.0
|
|
67
|
+
|
|
68
|
+
Raises
|
|
69
|
+
------
|
|
70
|
+
InvalidTypeError
|
|
71
|
+
When a setting is not of the type its annotation names.
|
|
72
|
+
EmptyListError
|
|
73
|
+
When ``changes`` is an empty list.
|
|
74
|
+
IncompatibleTypesError
|
|
75
|
+
When the old values, or the new values, mix several families of types.
|
|
76
|
+
DuplicateValueError
|
|
77
|
+
When an old value appears twice.
|
|
78
|
+
"""
|
|
79
|
+
require_field_types(self)
|
|
80
|
+
|
|
81
|
+
if self.changes == []:
|
|
82
|
+
raise EmptyListError(CHANGE_ITEM_NAME)
|
|
83
|
+
|
|
84
|
+
old_values = [change.old_value for change in self.changes]
|
|
85
|
+
old_types = [find_value_type(old_value) for old_value in old_values]
|
|
86
|
+
find_common_type(old_types, MAPPING_OPERATION)
|
|
87
|
+
require_unique_values(old_values)
|
|
88
|
+
find_new_type(self.changes)
|
|
89
|
+
changes_copy = list(self.changes)
|
|
90
|
+
object.__setattr__(self, "changes", changes_copy)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def require_unique_values(values: list[ScalarValue]) -> None:
|
|
94
|
+
"""
|
|
95
|
+
Check that no value appears twice, ``2`` and ``2.0`` being the same value.
|
|
96
|
+
|
|
97
|
+
.. versionadded:: 0.1.0
|
|
98
|
+
|
|
99
|
+
Parameters
|
|
100
|
+
----------
|
|
101
|
+
values
|
|
102
|
+
Values of one family of types.
|
|
103
|
+
|
|
104
|
+
Raises
|
|
105
|
+
------
|
|
106
|
+
DuplicateValueError
|
|
107
|
+
At the first value seen before.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> import numdaplot as ndp
|
|
112
|
+
>>> from numdaplot.arrays.mapping.value_mapping import require_unique_values
|
|
113
|
+
>>> try:
|
|
114
|
+
... require_unique_values([1, 2, 2.0])
|
|
115
|
+
... except ndp.DuplicateValueError as error:
|
|
116
|
+
... print(error)
|
|
117
|
+
The value 2.0 appears more than once.
|
|
118
|
+
"""
|
|
119
|
+
seen_values = set[ScalarValue]()
|
|
120
|
+
for value in values:
|
|
121
|
+
if value in seen_values:
|
|
122
|
+
raise DuplicateValueError(value)
|
|
123
|
+
|
|
124
|
+
seen_values.add(value)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def find_new_type(changes: list[ValueChange]) -> Type | None:
|
|
128
|
+
"""
|
|
129
|
+
Return the type shared by the new values of a mapping.
|
|
130
|
+
|
|
131
|
+
.. versionadded:: 0.1.0
|
|
132
|
+
|
|
133
|
+
Parameters
|
|
134
|
+
----------
|
|
135
|
+
changes
|
|
136
|
+
The changes of a mapping.
|
|
137
|
+
|
|
138
|
+
Returns
|
|
139
|
+
-------
|
|
140
|
+
Type or None
|
|
141
|
+
The common type of the new values that are not None, or None when every new value is None.
|
|
142
|
+
|
|
143
|
+
Raises
|
|
144
|
+
------
|
|
145
|
+
IncompatibleTypesError
|
|
146
|
+
When the new values mix several families of types.
|
|
147
|
+
|
|
148
|
+
Examples
|
|
149
|
+
--------
|
|
150
|
+
>>> import numdaplot as ndp
|
|
151
|
+
>>> from numdaplot.arrays.mapping.value_mapping import find_new_type
|
|
152
|
+
>>> find_new_type([ndp.ValueChange(1, 10), ndp.ValueChange(2, 2.5), ndp.ValueChange(-1, None)])
|
|
153
|
+
<Type.FLOAT64: 10>
|
|
154
|
+
"""
|
|
155
|
+
new_types = [find_value_type(change.new_value) for change in changes if change.new_value is not None]
|
|
156
|
+
if new_types == []:
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
new_type = find_common_type(new_types, MAPPING_OPERATION)
|
|
160
|
+
|
|
161
|
+
return new_type
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Absolute value math function.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.math_functions.math_function import MathFunction
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class Absolute(MathFunction):
|
|
14
|
+
"""
|
|
15
|
+
Absolute value of each value, its distance to 0: -3 and 3 both give 3.
|
|
16
|
+
|
|
17
|
+
Missing values stay missing.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Examples
|
|
22
|
+
--------
|
|
23
|
+
>>> import numdaplot as ndp
|
|
24
|
+
>>> gaps = ndp.Array.from_list([-3, 0, 2])
|
|
25
|
+
>>> gaps.apply(ndp.Absolute())
|
|
26
|
+
Array([3, 0, 2], dtype=INT64)
|
|
27
|
+
"""
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cosine math function.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.math_functions.math_function import MathFunction
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class Cosine(MathFunction):
|
|
14
|
+
"""
|
|
15
|
+
Cosine of each value, read as an angle in radians.
|
|
16
|
+
|
|
17
|
+
Missing values stay missing.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Examples
|
|
22
|
+
--------
|
|
23
|
+
>>> import numdaplot as ndp
|
|
24
|
+
>>> import math
|
|
25
|
+
>>> angles = ndp.Array.from_list([0.0, math.pi])
|
|
26
|
+
>>> angles.apply(ndp.Cosine())
|
|
27
|
+
Array([ 1., -1.], dtype=FLOAT64)
|
|
28
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Exponential math function.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.math_functions.math_function import MathFunction
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class Exponential(MathFunction):
|
|
14
|
+
"""
|
|
15
|
+
Exponential of each value, ``e`` raised to the value: 0 gives 1, 1 gives about 2.718.
|
|
16
|
+
|
|
17
|
+
Missing values stay missing.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Examples
|
|
22
|
+
--------
|
|
23
|
+
>>> import numdaplot as ndp
|
|
24
|
+
>>> rates = ndp.Array.from_list([0.0, 1.0])
|
|
25
|
+
>>> rates.apply(ndp.Exponential())
|
|
26
|
+
Array([1. , 2.71828183], dtype=FLOAT64)
|
|
27
|
+
"""
|