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,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Uniform distribution of whole numbers.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.creation.distribution import Distribution
|
|
10
|
+
from numdaplot.errors.invalid_bounds_error import InvalidBoundsError
|
|
11
|
+
from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS, Bounds
|
|
12
|
+
from numdaplot.settings.field_types import require_field_types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class RandomIntegers(Distribution):
|
|
17
|
+
"""
|
|
18
|
+
Whole numbers drawn with the same chance from ``low`` to ``high``.
|
|
19
|
+
|
|
20
|
+
Both bounds can be drawn by default: ``RandomIntegers(low=1, high=6)`` rolls a die.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
low
|
|
27
|
+
Low bound.
|
|
28
|
+
high
|
|
29
|
+
High bound.
|
|
30
|
+
bounds
|
|
31
|
+
Which bounds can be drawn. Both are included by default.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
InvalidTypeError
|
|
36
|
+
When a setting is not of the type its annotation names.
|
|
37
|
+
InvalidBoundsError
|
|
38
|
+
When no whole number lies between the bounds, such as ``low`` greater than ``high``,
|
|
39
|
+
or ``low=3, high=4`` with both bounds excluded.
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
--------
|
|
43
|
+
>>> import numdaplot as ndp
|
|
44
|
+
>>> dice = ndp.RandomIntegers(low=1, high=6)
|
|
45
|
+
>>> ndp.Array.random(dice, shape=ndp.Shape([5]), seed=0)
|
|
46
|
+
Array([6, 4, 4, 2, 2], dtype=INT64)
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
low: int
|
|
50
|
+
high: int
|
|
51
|
+
bounds: Bounds = Bounds.INCLUDED
|
|
52
|
+
|
|
53
|
+
def __post_init__(self) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Check that at least one whole number can be drawn.
|
|
56
|
+
|
|
57
|
+
.. versionadded:: 0.1.0
|
|
58
|
+
|
|
59
|
+
Raises
|
|
60
|
+
------
|
|
61
|
+
InvalidTypeError
|
|
62
|
+
When a setting is not of the type its annotation names.
|
|
63
|
+
InvalidBoundsError
|
|
64
|
+
When no whole number lies between the bounds.
|
|
65
|
+
"""
|
|
66
|
+
require_field_types(self)
|
|
67
|
+
|
|
68
|
+
lowest_value, value_limit = find_drawn_interval(self)
|
|
69
|
+
if lowest_value >= value_limit:
|
|
70
|
+
raise InvalidBoundsError(self.low, self.high)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def find_drawn_interval(distribution: RandomIntegers) -> tuple[int, int]:
|
|
74
|
+
"""
|
|
75
|
+
Return the lowest value that can be drawn and the value that every drawn value stays below.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
distribution
|
|
82
|
+
The distribution whose bounds are read.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
tuple[int, int]
|
|
87
|
+
The lowest drawable value, and the high limit excluded from the draw, as numpy expects them.
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
--------
|
|
91
|
+
>>> import numdaplot as ndp
|
|
92
|
+
>>> from numdaplot.arrays.creation.random_integers import find_drawn_interval
|
|
93
|
+
>>> find_drawn_interval(ndp.RandomIntegers(low=1, high=6))
|
|
94
|
+
(1, 7)
|
|
95
|
+
"""
|
|
96
|
+
lowest_value = distribution.low
|
|
97
|
+
if distribution.bounds not in LOW_INCLUDED_BOUNDS:
|
|
98
|
+
lowest_value += 1
|
|
99
|
+
|
|
100
|
+
value_limit = distribution.high
|
|
101
|
+
if distribution.bounds in HIGH_INCLUDED_BOUNDS:
|
|
102
|
+
value_limit += 1
|
|
103
|
+
|
|
104
|
+
return lowest_value, value_limit
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values drawn from a random distribution.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.creation.normal import Normal
|
|
13
|
+
from numdaplot.arrays.creation.random_integers import RandomIntegers, find_drawn_interval
|
|
14
|
+
from numdaplot.arrays.creation.uniform import Uniform
|
|
15
|
+
from numdaplot.arrays.shape import Shape
|
|
16
|
+
from numdaplot.errors.invalid_seed_error import InvalidSeedError
|
|
17
|
+
|
|
18
|
+
LOWEST_SEED = 0
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def draw_random_values(distribution: Uniform | Normal | RandomIntegers, shape: Shape, seed: int | None) -> NDArray[Any]:
|
|
22
|
+
"""
|
|
23
|
+
Return values drawn from a random distribution.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
distribution
|
|
30
|
+
The law followed by the values.
|
|
31
|
+
shape
|
|
32
|
+
The shape of the result.
|
|
33
|
+
seed
|
|
34
|
+
A number giving the same values at each call, at least 0. Different values at each call when ``None``.
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
NDArray
|
|
39
|
+
Decimals for ``Uniform`` and ``Normal``, integers for ``RandomIntegers``.
|
|
40
|
+
|
|
41
|
+
Raises
|
|
42
|
+
------
|
|
43
|
+
InvalidSeedError
|
|
44
|
+
When ``seed`` is lower than 0.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> from numdaplot.arrays.creation.random_values import draw_random_values
|
|
50
|
+
>>> dice = ndp.RandomIntegers(low=1, high=6)
|
|
51
|
+
>>> draw_random_values(dice, ndp.Shape([4]), 0)
|
|
52
|
+
array([6, 4, 4, 2])
|
|
53
|
+
"""
|
|
54
|
+
if seed is not None:
|
|
55
|
+
require_valid_seed(seed)
|
|
56
|
+
|
|
57
|
+
generator = numpy.random.default_rng(seed)
|
|
58
|
+
match distribution:
|
|
59
|
+
case Uniform():
|
|
60
|
+
values = generator.uniform(distribution.low, distribution.high, shape.dimensions)
|
|
61
|
+
case Normal():
|
|
62
|
+
values = generator.normal(distribution.mean, distribution.deviation, shape.dimensions)
|
|
63
|
+
case RandomIntegers():
|
|
64
|
+
lowest_value, value_limit = find_drawn_interval(distribution)
|
|
65
|
+
values = generator.integers(lowest_value, value_limit, shape.dimensions)
|
|
66
|
+
|
|
67
|
+
return values
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def require_valid_seed(seed: int) -> None:
|
|
71
|
+
"""
|
|
72
|
+
Check that a random seed is not negative.
|
|
73
|
+
|
|
74
|
+
.. versionadded:: 0.1.0
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
seed
|
|
79
|
+
The seed to check.
|
|
80
|
+
|
|
81
|
+
Raises
|
|
82
|
+
------
|
|
83
|
+
InvalidSeedError
|
|
84
|
+
When ``seed`` is lower than 0.
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> import numdaplot as ndp
|
|
89
|
+
>>> from numdaplot.arrays.creation.random_values import require_valid_seed
|
|
90
|
+
>>> try:
|
|
91
|
+
... require_valid_seed(-1)
|
|
92
|
+
... except ndp.InvalidSeedError as error:
|
|
93
|
+
... print(error)
|
|
94
|
+
Expected a seed of at least 0, got -1.
|
|
95
|
+
"""
|
|
96
|
+
if seed < LOWEST_SEED:
|
|
97
|
+
raise InvalidSeedError(seed)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Numbers of a regular sequence.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import math
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import numpy
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.positions.range import Range
|
|
14
|
+
from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
|
|
15
|
+
|
|
16
|
+
# Decimal steps accumulate rounding errors: 0.1 * 10 gives 0.9999999999999999, not 1.
|
|
17
|
+
STEP_TOLERANCE = 1e-9
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def compute_range_values(sequence: Range) -> NDArray[Any]:
|
|
21
|
+
"""
|
|
22
|
+
Return the numbers of a regular sequence.
|
|
23
|
+
|
|
24
|
+
A stop reached within a tiny fraction of a step counts as reached, so ``Range(0, 1, 0.1)``
|
|
25
|
+
ends with exactly 1.0 when the stop is included.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
sequence
|
|
32
|
+
The sequence. ``LOW_ONLY`` keeps its start and drops its stop, ``HIGH_ONLY`` the opposite.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
NDArray
|
|
37
|
+
Integers when the start and the step are integers, decimals otherwise.
|
|
38
|
+
Empty when the excluded bounds leave no number, such as from 1 to 1 with ``Bounds.EXCLUDED``.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> from numdaplot.arrays.creation.range_values import compute_range_values
|
|
44
|
+
>>> compute_range_values(ndp.Range(start=0, stop=10, step=5))
|
|
45
|
+
array([ 0, 5, 10])
|
|
46
|
+
"""
|
|
47
|
+
distance = sequence.stop - sequence.start
|
|
48
|
+
step_count = distance / sequence.step
|
|
49
|
+
nearest_step_count = round(step_count)
|
|
50
|
+
step_count_error = abs(step_count - nearest_step_count)
|
|
51
|
+
reaches_stop = step_count_error <= STEP_TOLERANCE
|
|
52
|
+
tolerated_step_count = step_count + STEP_TOLERANCE
|
|
53
|
+
|
|
54
|
+
first_index = 0
|
|
55
|
+
if sequence.bounds not in LOW_INCLUDED_BOUNDS:
|
|
56
|
+
first_index = 1
|
|
57
|
+
|
|
58
|
+
last_index = math.floor(tolerated_step_count)
|
|
59
|
+
includes_stop = sequence.bounds in HIGH_INCLUDED_BOUNDS
|
|
60
|
+
drops_reached_stop = reaches_stop and not includes_stop
|
|
61
|
+
if drops_reached_stop:
|
|
62
|
+
last_index -= 1
|
|
63
|
+
|
|
64
|
+
index_limit = last_index + 1
|
|
65
|
+
indexes = numpy.arange(first_index, index_limit)
|
|
66
|
+
offsets = indexes * sequence.step
|
|
67
|
+
values = sequence.start + offsets
|
|
68
|
+
has_values = indexes.size > 0
|
|
69
|
+
ends_on_stop = reaches_stop and includes_stop and has_values
|
|
70
|
+
if ends_on_stop:
|
|
71
|
+
values[-1] = sequence.stop
|
|
72
|
+
|
|
73
|
+
return values
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A given count of evenly spaced numbers between two bounds.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_count_error import InvalidCountError
|
|
10
|
+
from numdaplot.rules.bounds import Bounds
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
LOWEST_COUNT_WITH_BOTH_BOUNDS = 2
|
|
14
|
+
LOWEST_COUNT = 1
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Spacing:
|
|
19
|
+
"""
|
|
20
|
+
A given count of evenly spaced numbers from ``start`` to ``stop``, used by ``Array.from_spacing``.
|
|
21
|
+
|
|
22
|
+
``bounds`` tells whether ``start`` and ``stop`` are among the values. With ``start=0``,
|
|
23
|
+
``stop=1`` and ``count=4``:
|
|
24
|
+
|
|
25
|
+
- ``INCLUDED`` gives 0, 0.333, 0.667, 1;
|
|
26
|
+
- ``LOW_ONLY`` gives 0, 0.25, 0.5, 0.75;
|
|
27
|
+
- ``HIGH_ONLY`` gives 0.25, 0.5, 0.75, 1;
|
|
28
|
+
- ``EXCLUDED`` gives 0.2, 0.4, 0.6, 0.8.
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
start
|
|
35
|
+
First bound.
|
|
36
|
+
stop
|
|
37
|
+
Second bound, lower than ``start`` for decreasing values.
|
|
38
|
+
count
|
|
39
|
+
Number of values, at least 2 when both bounds are included, at least 1 otherwise.
|
|
40
|
+
bounds
|
|
41
|
+
Which bounds are among the values. Both are included by default.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
InvalidTypeError
|
|
46
|
+
When a setting is not of the type its annotation names.
|
|
47
|
+
InvalidCountError
|
|
48
|
+
When ``count`` is too low for the bounds.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numdaplot as ndp
|
|
53
|
+
>>> ndp.Array.from_spacing(ndp.Spacing(start=0, stop=1, count=5))
|
|
54
|
+
Array([0. , 0.25, 0.5 , 0.75, 1. ], dtype=FLOAT64)
|
|
55
|
+
>>> ndp.Array.from_spacing(ndp.Spacing(start=0, stop=1, count=4, bounds=ndp.Bounds.EXCLUDED))
|
|
56
|
+
Array([0.2, 0.4, 0.6, 0.8], dtype=FLOAT64)
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
start: float
|
|
60
|
+
stop: float
|
|
61
|
+
count: int
|
|
62
|
+
bounds: Bounds = Bounds.INCLUDED
|
|
63
|
+
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
"""
|
|
66
|
+
Check that the count is high enough for the bounds.
|
|
67
|
+
|
|
68
|
+
.. versionadded:: 0.1.0
|
|
69
|
+
|
|
70
|
+
Raises
|
|
71
|
+
------
|
|
72
|
+
InvalidTypeError
|
|
73
|
+
When a setting is not of the type its annotation names.
|
|
74
|
+
InvalidCountError
|
|
75
|
+
When ``count`` is too low for the bounds.
|
|
76
|
+
"""
|
|
77
|
+
require_field_types(self)
|
|
78
|
+
|
|
79
|
+
lowest_count = LOWEST_COUNT
|
|
80
|
+
if self.bounds == Bounds.INCLUDED:
|
|
81
|
+
lowest_count = LOWEST_COUNT_WITH_BOTH_BOUNDS
|
|
82
|
+
|
|
83
|
+
if self.count < lowest_count:
|
|
84
|
+
raise InvalidCountError(self.count, lowest_count)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Evenly spaced numbers.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.creation.spacing import Spacing
|
|
13
|
+
from numdaplot.rules.bounds import HIGH_INCLUDED_BOUNDS, LOW_INCLUDED_BOUNDS
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def compute_spacing_values(spacing: Spacing) -> NDArray[Any]:
|
|
17
|
+
"""
|
|
18
|
+
Return the evenly spaced numbers of a spacing.
|
|
19
|
+
|
|
20
|
+
The interval is cut into equal gaps: one fewer than the count when both bounds are kept,
|
|
21
|
+
one more when both are dropped.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
spacing
|
|
28
|
+
The spacing.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
NDArray
|
|
33
|
+
``count`` decimals. An included stop is exactly ``stop``.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> from numdaplot.arrays.creation.spacing_values import compute_spacing_values
|
|
39
|
+
>>> compute_spacing_values(ndp.Spacing(start=0, stop=1, count=4, bounds=ndp.Bounds.LOW_ONLY))
|
|
40
|
+
array([0. , 0.25, 0.5 , 0.75])
|
|
41
|
+
"""
|
|
42
|
+
includes_start = spacing.bounds in LOW_INCLUDED_BOUNDS
|
|
43
|
+
includes_stop = spacing.bounds in HIGH_INCLUDED_BOUNDS
|
|
44
|
+
|
|
45
|
+
gap_count = spacing.count + 1
|
|
46
|
+
first_offset = 1
|
|
47
|
+
if includes_start:
|
|
48
|
+
gap_count -= 1
|
|
49
|
+
first_offset = 0
|
|
50
|
+
|
|
51
|
+
if includes_stop:
|
|
52
|
+
gap_count -= 1
|
|
53
|
+
|
|
54
|
+
distance = spacing.stop - spacing.start
|
|
55
|
+
gap = distance / gap_count
|
|
56
|
+
offset_limit = first_offset + spacing.count
|
|
57
|
+
offsets = numpy.arange(first_offset, offset_limit)
|
|
58
|
+
distances = offsets * gap
|
|
59
|
+
values = spacing.start + distances
|
|
60
|
+
if includes_stop:
|
|
61
|
+
values[-1] = spacing.stop
|
|
62
|
+
|
|
63
|
+
return values
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Uniform distribution of decimals.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.creation.distribution import Distribution
|
|
10
|
+
from numdaplot.errors.invalid_bounds_error import InvalidBoundsError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class Uniform(Distribution):
|
|
16
|
+
"""
|
|
17
|
+
Decimals drawn with the same chance anywhere from ``low`` to ``high``.
|
|
18
|
+
|
|
19
|
+
``high`` itself is never drawn, as in numpy. Use ``RandomIntegers`` for whole numbers.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
low
|
|
26
|
+
Lowest value that can be drawn.
|
|
27
|
+
high
|
|
28
|
+
Value that every drawn value stays below, greater than or equal to ``low``.
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
InvalidBoundsError
|
|
35
|
+
When ``low`` is greater than ``high``.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> ndp.Array.random(ndp.Uniform(low=0, high=1), shape=ndp.Shape([3]), seed=0)
|
|
41
|
+
Array([0.63696169, 0.26978671, 0.04097352], dtype=FLOAT64)
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
low: float
|
|
45
|
+
high: float
|
|
46
|
+
|
|
47
|
+
def __post_init__(self) -> None:
|
|
48
|
+
"""
|
|
49
|
+
Check that the low bound is not greater than the high bound.
|
|
50
|
+
|
|
51
|
+
.. versionadded:: 0.1.0
|
|
52
|
+
|
|
53
|
+
Raises
|
|
54
|
+
------
|
|
55
|
+
InvalidTypeError
|
|
56
|
+
When a setting is not of the type its annotation names.
|
|
57
|
+
InvalidBoundsError
|
|
58
|
+
When ``low`` is greater than ``high``.
|
|
59
|
+
"""
|
|
60
|
+
require_field_types(self)
|
|
61
|
+
|
|
62
|
+
if self.low > self.high:
|
|
63
|
+
raise InvalidBoundsError(self.low, self.high)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the comparison of two Arrays or two Tables.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.type_match import TypeMatch
|
|
13
|
+
from numdaplot.settings.field_types import require_field_types
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from numdaplot.arrays.array import Array
|
|
17
|
+
from numdaplot.tables.table import Table
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# eq=False because comparing two settings would compare their Arrays or Tables with ==, which they refuse.
|
|
21
|
+
@dataclass(frozen=True, eq=False)
|
|
22
|
+
class Equality:
|
|
23
|
+
"""
|
|
24
|
+
Settings of the comparison of two Arrays or two Tables, used by ``Array.is_equal`` and ``Table.is_equal``.
|
|
25
|
+
|
|
26
|
+
Two Arrays are equal when they have the same shape and the same values at each position.
|
|
27
|
+
Two Tables are equal when they have the same columns, in the same order, with the same values.
|
|
28
|
+
Two missing values at the same position are equal.
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
other
|
|
35
|
+
The Array or the Table to compare with, of the same kind as the compared one.
|
|
36
|
+
types
|
|
37
|
+
Whether the types must also be the same. Only the values are compared by default.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
Raises
|
|
41
|
+
------
|
|
42
|
+
InvalidTypeError
|
|
43
|
+
When a setting is not of the type its annotation names.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> import numdaplot as ndp
|
|
48
|
+
>>> integers = ndp.Array.from_list([1, 2])
|
|
49
|
+
>>> decimals = ndp.Array.from_list([1.0, 2.0])
|
|
50
|
+
>>> integers.is_equal(ndp.Equality(other=decimals, types=ndp.TypeMatch.STRICT))
|
|
51
|
+
False
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
other: Array | Table
|
|
55
|
+
types: TypeMatch = TypeMatch.IGNORED
|
|
56
|
+
|
|
57
|
+
def __post_init__(self) -> None:
|
|
58
|
+
"""
|
|
59
|
+
Check the type of every setting.
|
|
60
|
+
|
|
61
|
+
.. versionadded:: 0.1.0
|
|
62
|
+
|
|
63
|
+
Raises
|
|
64
|
+
------
|
|
65
|
+
InvalidTypeError
|
|
66
|
+
When a setting is not of the type its annotation names.
|
|
67
|
+
"""
|
|
68
|
+
require_field_types(self)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sorting of the 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.array_sorting import ArraySorting
|
|
13
|
+
from numdaplot.arrays.axis_number import find_numpy_axis
|
|
14
|
+
from numdaplot.arrays.selection.missing_mask import find_missing
|
|
15
|
+
from numdaplot.ordering.missing_position import MissingPosition
|
|
16
|
+
from numdaplot.ordering.order import Order
|
|
17
|
+
from numdaplot.positions.axis import Axis
|
|
18
|
+
|
|
19
|
+
LAST_AXIS = -1
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def sort_values(values: NDArray[Any], sorting: ArraySorting, axis: Axis | None) -> NDArray[Any]:
|
|
23
|
+
"""
|
|
24
|
+
Return the values sorted inside each row, or inside each column.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
values
|
|
31
|
+
The values of an Array.
|
|
32
|
+
sorting
|
|
33
|
+
The order and the place of missing values.
|
|
34
|
+
axis
|
|
35
|
+
``EACH_ROW`` or ``EACH_COLUMN`` for a two-dimensional Array, or None to sort each row.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
NDArray
|
|
40
|
+
The sorted values, of the same shape.
|
|
41
|
+
|
|
42
|
+
Raises
|
|
43
|
+
------
|
|
44
|
+
DimensionError
|
|
45
|
+
When an axis is given for an Array that is not two-dimensional.
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> import numpy
|
|
50
|
+
>>> import numdaplot as ndp
|
|
51
|
+
>>> from numdaplot.arrays.layout.sorting_values import sort_values
|
|
52
|
+
>>> sort_values(numpy.array([[3, 1], [2, 4]]), ndp.ArraySorting(), ndp.Axis.EACH_COLUMN)
|
|
53
|
+
array([[2, 1],
|
|
54
|
+
[3, 4]])
|
|
55
|
+
"""
|
|
56
|
+
numpy_axis = find_numpy_axis(axis, values.ndim)
|
|
57
|
+
if numpy_axis is None:
|
|
58
|
+
numpy_axis = LAST_AXIS
|
|
59
|
+
|
|
60
|
+
moved_values = numpy.moveaxis(values, numpy_axis, LAST_AXIS)
|
|
61
|
+
slice_size = moved_values.shape[LAST_AXIS]
|
|
62
|
+
slices = moved_values.reshape(LAST_AXIS, slice_size)
|
|
63
|
+
sorted_slices = numpy.empty_like(slices)
|
|
64
|
+
for i, values_slice in enumerate(slices):
|
|
65
|
+
sorted_slices[i] = sort_slice(values_slice, sorting)
|
|
66
|
+
|
|
67
|
+
sorted_moved_values = sorted_slices.reshape(moved_values.shape)
|
|
68
|
+
sorted_values = numpy.moveaxis(sorted_moved_values, LAST_AXIS, numpy_axis)
|
|
69
|
+
|
|
70
|
+
return sorted_values
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def sort_slice(values: NDArray[Any], sorting: ArraySorting) -> NDArray[Any]:
|
|
74
|
+
"""
|
|
75
|
+
Return one-dimensional values sorted, with their missing values first or last.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
values
|
|
82
|
+
One-dimensional values.
|
|
83
|
+
sorting
|
|
84
|
+
The order and the place of missing values.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
NDArray
|
|
89
|
+
The sorted values.
|
|
90
|
+
|
|
91
|
+
Examples
|
|
92
|
+
--------
|
|
93
|
+
>>> import numpy
|
|
94
|
+
>>> import numdaplot as ndp
|
|
95
|
+
>>> from numdaplot.arrays.layout.sorting_values import sort_slice
|
|
96
|
+
>>> sort_slice(numpy.array([1.0, numpy.nan, 3.0]), ndp.ArraySorting(order=ndp.Order.DESCENDING))
|
|
97
|
+
array([ 3., 1., nan])
|
|
98
|
+
"""
|
|
99
|
+
missing = find_missing(values)
|
|
100
|
+
present = ~missing
|
|
101
|
+
present_values = values[present]
|
|
102
|
+
missing_values = values[missing]
|
|
103
|
+
ordered_values = numpy.sort(present_values)
|
|
104
|
+
if sorting.order == Order.DESCENDING:
|
|
105
|
+
ordered_values = ordered_values[::-1]
|
|
106
|
+
|
|
107
|
+
parts = [ordered_values, missing_values]
|
|
108
|
+
if sorting.missing == MissingPosition.FIRST:
|
|
109
|
+
parts = [missing_values, ordered_values]
|
|
110
|
+
|
|
111
|
+
sorted_values = numpy.concatenate(parts)
|
|
112
|
+
|
|
113
|
+
return sorted_values
|