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,437 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Dates built from their year, their month and their day.
|
|
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, Any, cast
|
|
11
|
+
|
|
12
|
+
import numpy
|
|
13
|
+
from numpy.typing import NDArray
|
|
14
|
+
|
|
15
|
+
from numdaplot.arrays.creation.date_parts import DateParts
|
|
16
|
+
from numdaplot.data_types.type import Type
|
|
17
|
+
from numdaplot.errors.rejected_dates import RejectedDate, RejectedDatePart
|
|
18
|
+
from numdaplot.errors.value_conversion_error import ValueConversionError
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from numdaplot.arrays.array import Array
|
|
22
|
+
|
|
23
|
+
DECIMAL_DTYPE = numpy.float64
|
|
24
|
+
WHOLE_DTYPE = numpy.int64
|
|
25
|
+
YEAR_DTYPE = "datetime64[Y]"
|
|
26
|
+
MONTH_DTYPE = "datetime64[M]"
|
|
27
|
+
DATE_DTYPE = "datetime64[D]"
|
|
28
|
+
MONTH_STEP_DTYPE = "timedelta64[M]"
|
|
29
|
+
DAY_STEP_DTYPE = "timedelta64[D]"
|
|
30
|
+
MISSING_DATE = numpy.datetime64("NaT", "D")
|
|
31
|
+
EPOCH_YEAR = 1970
|
|
32
|
+
MONTHS_PER_YEAR = 12
|
|
33
|
+
FIRST_YEAR = 1
|
|
34
|
+
LAST_YEAR = 9999
|
|
35
|
+
FIRST_MONTH = 1
|
|
36
|
+
LAST_MONTH = 12
|
|
37
|
+
FIRST_DAY = 1
|
|
38
|
+
LAST_DAY = 31
|
|
39
|
+
SAFE_PART = 1
|
|
40
|
+
YEAR_PART = "year"
|
|
41
|
+
MONTH_PART = "month"
|
|
42
|
+
DAY_PART = "day"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True, eq=False)
|
|
46
|
+
class PartNumbers:
|
|
47
|
+
"""
|
|
48
|
+
The year, the month and the day of each date, as flat decimals, NaN where missing.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
years
|
|
55
|
+
The years.
|
|
56
|
+
months
|
|
57
|
+
The months.
|
|
58
|
+
days
|
|
59
|
+
The days.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> import numpy
|
|
64
|
+
>>> from numdaplot.arrays.creation.date_parts_values import PartNumbers
|
|
65
|
+
>>> PartNumbers(numpy.array([2025.0]), numpy.array([3.0]), numpy.array([15.0])).days
|
|
66
|
+
array([15.])
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
years: NDArray[numpy.float64]
|
|
70
|
+
months: NDArray[numpy.float64]
|
|
71
|
+
days: NDArray[numpy.float64]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def build_dates(parts: DateParts) -> NDArray[numpy.datetime64]:
|
|
75
|
+
"""
|
|
76
|
+
Return the dates of a year, a month and a day, missing where a part is missing.
|
|
77
|
+
|
|
78
|
+
.. versionadded:: 0.1.0
|
|
79
|
+
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
parts
|
|
83
|
+
The year, the month and the day of each date.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
NDArray[numpy.datetime64]
|
|
88
|
+
The dates in ``datetime64[D]``, in the shape of the parts, NaT where a part is missing.
|
|
89
|
+
|
|
90
|
+
Raises
|
|
91
|
+
------
|
|
92
|
+
ValueConversionError
|
|
93
|
+
At the first part that is not a whole number, then at the first year, month and day that form no date.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import numdaplot as ndp
|
|
98
|
+
>>> from numdaplot.arrays.creation.date_parts_values import build_dates
|
|
99
|
+
>>> years = ndp.Array.from_list([2025.0, None])
|
|
100
|
+
>>> months = ndp.Array.from_list([2.0, 3.0])
|
|
101
|
+
>>> days = ndp.Array.from_list([28.0, 1.0])
|
|
102
|
+
>>> build_dates(ndp.DateParts(year=years, month=months, day=days))
|
|
103
|
+
array(['2025-02-28', 'NaT'], dtype='datetime64[D]')
|
|
104
|
+
"""
|
|
105
|
+
numbers = read_part_numbers(parts)
|
|
106
|
+
missing = find_missing_parts(numbers)
|
|
107
|
+
require_whole_parts(numbers, missing, parts)
|
|
108
|
+
safe_numbers = replace_unusable_parts(numbers, missing)
|
|
109
|
+
dates = combine_parts(safe_numbers)
|
|
110
|
+
require_real_dates(numbers, dates, missing, parts.year)
|
|
111
|
+
present_dates = numpy.where(missing, MISSING_DATE, dates)
|
|
112
|
+
dimensions = parts.year.shape.dimensions
|
|
113
|
+
shaped_dates = present_dates.reshape(dimensions)
|
|
114
|
+
|
|
115
|
+
return shaped_dates
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def read_part_numbers(parts: DateParts) -> PartNumbers:
|
|
119
|
+
"""
|
|
120
|
+
Return the year, the month and the day of each date as flat decimals.
|
|
121
|
+
|
|
122
|
+
.. versionadded:: 0.1.0
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
parts
|
|
127
|
+
The year, the month and the day of each date.
|
|
128
|
+
|
|
129
|
+
Returns
|
|
130
|
+
-------
|
|
131
|
+
PartNumbers
|
|
132
|
+
The parts as float64 numbers in one dimension, NaN where missing.
|
|
133
|
+
|
|
134
|
+
Examples
|
|
135
|
+
--------
|
|
136
|
+
>>> import numdaplot as ndp
|
|
137
|
+
>>> from numdaplot.arrays.creation.date_parts_values import read_part_numbers
|
|
138
|
+
>>> single = ndp.Array.from_list([[1]])
|
|
139
|
+
>>> read_part_numbers(ndp.DateParts(year=single, month=single, day=single)).years
|
|
140
|
+
array([1.])
|
|
141
|
+
"""
|
|
142
|
+
years = read_flat_decimals(parts.year)
|
|
143
|
+
months = read_flat_decimals(parts.month)
|
|
144
|
+
days = read_flat_decimals(parts.day)
|
|
145
|
+
numbers = PartNumbers(years, months, days)
|
|
146
|
+
|
|
147
|
+
return numbers
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def read_flat_decimals(part: Array) -> NDArray[numpy.float64]:
|
|
151
|
+
"""
|
|
152
|
+
Return the numbers of an Array as decimals in one dimension.
|
|
153
|
+
|
|
154
|
+
.. versionadded:: 0.1.0
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
part
|
|
159
|
+
An Array of numbers.
|
|
160
|
+
|
|
161
|
+
Returns
|
|
162
|
+
-------
|
|
163
|
+
NDArray[numpy.float64]
|
|
164
|
+
Its numbers, NaN where missing.
|
|
165
|
+
|
|
166
|
+
Examples
|
|
167
|
+
--------
|
|
168
|
+
>>> import numdaplot as ndp
|
|
169
|
+
>>> from numdaplot.arrays.creation.date_parts_values import read_flat_decimals
|
|
170
|
+
>>> read_flat_decimals(ndp.Array.from_list([[1, 2]]))
|
|
171
|
+
array([1., 2.])
|
|
172
|
+
"""
|
|
173
|
+
values = part.to_numpy()
|
|
174
|
+
decimals = values.astype(DECIMAL_DTYPE)
|
|
175
|
+
flat_decimals = decimals.ravel()
|
|
176
|
+
|
|
177
|
+
return flat_decimals
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def find_missing_parts(numbers: PartNumbers) -> NDArray[numpy.bool_]:
|
|
181
|
+
"""
|
|
182
|
+
Return where a part of a date is missing.
|
|
183
|
+
|
|
184
|
+
.. versionadded:: 0.1.0
|
|
185
|
+
|
|
186
|
+
Parameters
|
|
187
|
+
----------
|
|
188
|
+
numbers
|
|
189
|
+
The parts as decimals.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
NDArray[numpy.bool_]
|
|
194
|
+
True where the year, the month or the day is NaN.
|
|
195
|
+
|
|
196
|
+
Examples
|
|
197
|
+
--------
|
|
198
|
+
>>> import numpy
|
|
199
|
+
>>> from numdaplot.arrays.creation.date_parts_values import PartNumbers, find_missing_parts
|
|
200
|
+
>>> find_missing_parts(PartNumbers(numpy.array([2025.0, 2025.0]), numpy.array([1.0, numpy.nan]), numpy.ones(2)))
|
|
201
|
+
array([False, True])
|
|
202
|
+
"""
|
|
203
|
+
missing_years = numpy.isnan(numbers.years)
|
|
204
|
+
missing_months = numpy.isnan(numbers.months)
|
|
205
|
+
missing_days = numpy.isnan(numbers.days)
|
|
206
|
+
missing = missing_years | missing_months | missing_days
|
|
207
|
+
|
|
208
|
+
return missing
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def require_whole_parts(numbers: PartNumbers, missing: NDArray[numpy.bool_], parts: DateParts) -> None:
|
|
212
|
+
"""
|
|
213
|
+
Check that every present part is a whole number.
|
|
214
|
+
|
|
215
|
+
.. versionadded:: 0.1.0
|
|
216
|
+
|
|
217
|
+
Parameters
|
|
218
|
+
----------
|
|
219
|
+
numbers
|
|
220
|
+
The parts as decimals.
|
|
221
|
+
missing
|
|
222
|
+
True where a part is missing.
|
|
223
|
+
parts
|
|
224
|
+
The Arrays of the parts, whose types the error names.
|
|
225
|
+
|
|
226
|
+
Raises
|
|
227
|
+
------
|
|
228
|
+
ValueConversionError
|
|
229
|
+
At the first part that is not a whole number, the years first, then the months, then the days.
|
|
230
|
+
|
|
231
|
+
Examples
|
|
232
|
+
--------
|
|
233
|
+
>>> import numdaplot as ndp
|
|
234
|
+
>>> from numdaplot.arrays.creation.date_parts_values import (
|
|
235
|
+
... find_missing_parts,
|
|
236
|
+
... read_part_numbers,
|
|
237
|
+
... require_whole_parts,
|
|
238
|
+
... )
|
|
239
|
+
>>> years = ndp.Array.from_list([2025.0])
|
|
240
|
+
>>> months = ndp.Array.from_list([3.0])
|
|
241
|
+
>>> days = ndp.Array.from_list([3.5])
|
|
242
|
+
>>> parts = ndp.DateParts(year=years, month=months, day=days)
|
|
243
|
+
>>> numbers = read_part_numbers(parts)
|
|
244
|
+
>>> try:
|
|
245
|
+
... require_whole_parts(numbers, find_missing_parts(numbers), parts)
|
|
246
|
+
... except ndp.ValueConversionError as error:
|
|
247
|
+
... print(error)
|
|
248
|
+
Cannot use the FLOAT64 value 3.5 as a day: date parts must be whole numbers.
|
|
249
|
+
"""
|
|
250
|
+
checked_parts = (
|
|
251
|
+
(YEAR_PART, numbers.years, parts.year),
|
|
252
|
+
(MONTH_PART, numbers.months, parts.month),
|
|
253
|
+
(DAY_PART, numbers.days, parts.day),
|
|
254
|
+
)
|
|
255
|
+
for part_name, part_numbers, part in checked_parts:
|
|
256
|
+
rounded_numbers = numpy.floor(part_numbers)
|
|
257
|
+
is_whole = (rounded_numbers == part_numbers) & numpy.isfinite(part_numbers)
|
|
258
|
+
is_rejected = ~is_whole & ~missing
|
|
259
|
+
has_rejected = bool(is_rejected.any())
|
|
260
|
+
if not has_rejected:
|
|
261
|
+
continue
|
|
262
|
+
|
|
263
|
+
rejected_numbers = part_numbers[is_rejected]
|
|
264
|
+
first_number = float(rejected_numbers[0])
|
|
265
|
+
rejected_part = RejectedDatePart(part_name, first_number)
|
|
266
|
+
raise ValueConversionError(part.dtype.name, Type.DATE.name, rejected_part)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def replace_unusable_parts(numbers: PartNumbers, missing: NDArray[numpy.bool_]) -> PartNumbers:
|
|
270
|
+
"""
|
|
271
|
+
Return the parts with 1 where a part is missing or outside its usual range, so that every date can be computed.
|
|
272
|
+
|
|
273
|
+
.. versionadded:: 0.1.0
|
|
274
|
+
|
|
275
|
+
Parameters
|
|
276
|
+
----------
|
|
277
|
+
numbers
|
|
278
|
+
The whole parts as decimals.
|
|
279
|
+
missing
|
|
280
|
+
True where a part is missing.
|
|
281
|
+
|
|
282
|
+
Returns
|
|
283
|
+
-------
|
|
284
|
+
PartNumbers
|
|
285
|
+
The parts, each from 1 to its largest usual value.
|
|
286
|
+
|
|
287
|
+
Examples
|
|
288
|
+
--------
|
|
289
|
+
>>> import numpy
|
|
290
|
+
>>> from numdaplot.arrays.creation.date_parts_values import PartNumbers, replace_unusable_parts
|
|
291
|
+
>>> numbers = PartNumbers(numpy.array([2025.0]), numpy.array([13.0]), numpy.array([1.0]))
|
|
292
|
+
>>> replace_unusable_parts(numbers, numpy.array([False])).months
|
|
293
|
+
array([1.])
|
|
294
|
+
"""
|
|
295
|
+
usable_years = keep_in_range(numbers.years, missing, LAST_YEAR)
|
|
296
|
+
usable_months = keep_in_range(numbers.months, missing, LAST_MONTH)
|
|
297
|
+
usable_days = keep_in_range(numbers.days, missing, LAST_DAY)
|
|
298
|
+
usable_numbers = PartNumbers(usable_years, usable_months, usable_days)
|
|
299
|
+
|
|
300
|
+
return usable_numbers
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
def keep_in_range(
|
|
304
|
+
part_numbers: NDArray[numpy.float64], missing: NDArray[numpy.bool_], last_value: int
|
|
305
|
+
) -> NDArray[numpy.float64]:
|
|
306
|
+
"""
|
|
307
|
+
Return a part with 1 where it is missing or outside 1 to its last value.
|
|
308
|
+
|
|
309
|
+
.. versionadded:: 0.1.0
|
|
310
|
+
|
|
311
|
+
Parameters
|
|
312
|
+
----------
|
|
313
|
+
part_numbers
|
|
314
|
+
The numbers of one part.
|
|
315
|
+
missing
|
|
316
|
+
True where a part of the date is missing.
|
|
317
|
+
last_value
|
|
318
|
+
The largest value of the part.
|
|
319
|
+
|
|
320
|
+
Returns
|
|
321
|
+
-------
|
|
322
|
+
NDArray[numpy.float64]
|
|
323
|
+
The numbers kept, 1 elsewhere.
|
|
324
|
+
|
|
325
|
+
Examples
|
|
326
|
+
--------
|
|
327
|
+
>>> import numpy
|
|
328
|
+
>>> from numdaplot.arrays.creation.date_parts_values import keep_in_range
|
|
329
|
+
>>> keep_in_range(numpy.array([0.0, 5.0, 40.0]), numpy.array([False, False, False]), 31)
|
|
330
|
+
array([1., 5., 1.])
|
|
331
|
+
"""
|
|
332
|
+
is_in_range = (part_numbers >= SAFE_PART) & (part_numbers <= last_value) & ~missing
|
|
333
|
+
kept_numbers = numpy.where(is_in_range, part_numbers, SAFE_PART)
|
|
334
|
+
|
|
335
|
+
return kept_numbers
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def combine_parts(numbers: PartNumbers) -> NDArray[numpy.datetime64]:
|
|
339
|
+
"""
|
|
340
|
+
Return the dates of whole parts, a day beyond the end of its month spilling over the next month.
|
|
341
|
+
|
|
342
|
+
.. versionadded:: 0.1.0
|
|
343
|
+
|
|
344
|
+
Parameters
|
|
345
|
+
----------
|
|
346
|
+
numbers
|
|
347
|
+
Whole parts, each in its usual range.
|
|
348
|
+
|
|
349
|
+
Returns
|
|
350
|
+
-------
|
|
351
|
+
NDArray[numpy.datetime64]
|
|
352
|
+
The dates in ``datetime64[D]``: the 31st of February gives the 3rd of March, 2025.
|
|
353
|
+
|
|
354
|
+
Examples
|
|
355
|
+
--------
|
|
356
|
+
>>> import numpy
|
|
357
|
+
>>> from numdaplot.arrays.creation.date_parts_values import PartNumbers, combine_parts
|
|
358
|
+
>>> combine_parts(PartNumbers(numpy.array([2025.0]), numpy.array([2.0]), numpy.array([31.0])))
|
|
359
|
+
array(['2025-03-03'], dtype='datetime64[D]')
|
|
360
|
+
"""
|
|
361
|
+
whole_years = numbers.years.astype(WHOLE_DTYPE)
|
|
362
|
+
whole_months = numbers.months.astype(WHOLE_DTYPE)
|
|
363
|
+
whole_days = numbers.days.astype(WHOLE_DTYPE)
|
|
364
|
+
years_since_epoch = whole_years - EPOCH_YEAR
|
|
365
|
+
year_starts = years_since_epoch.astype(YEAR_DTYPE)
|
|
366
|
+
month_steps = whole_months - FIRST_MONTH
|
|
367
|
+
month_offsets = month_steps.astype(MONTH_STEP_DTYPE)
|
|
368
|
+
month_starts = year_starts + month_offsets
|
|
369
|
+
month_start_days = month_starts.astype(DATE_DTYPE)
|
|
370
|
+
day_steps = whole_days - FIRST_DAY
|
|
371
|
+
day_offsets = day_steps.astype(DAY_STEP_DTYPE)
|
|
372
|
+
raw_dates = month_start_days + day_offsets
|
|
373
|
+
# Some versions of the numpy stubs lose the datetime type of a sum of datetimes and durations.
|
|
374
|
+
dates = cast(Any, raw_dates)
|
|
375
|
+
|
|
376
|
+
return dates
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
def require_real_dates(
|
|
380
|
+
numbers: PartNumbers, dates: NDArray[numpy.datetime64], missing: NDArray[numpy.bool_], year_part: Array
|
|
381
|
+
) -> None:
|
|
382
|
+
"""
|
|
383
|
+
Check that each computed date has the year, the month and the day it was built from.
|
|
384
|
+
|
|
385
|
+
A part outside its usual range, or a day beyond the end of its month, gives another date.
|
|
386
|
+
|
|
387
|
+
.. versionadded:: 0.1.0
|
|
388
|
+
|
|
389
|
+
Parameters
|
|
390
|
+
----------
|
|
391
|
+
numbers
|
|
392
|
+
The whole parts, as given.
|
|
393
|
+
dates
|
|
394
|
+
The dates computed from the parts kept in their usual ranges.
|
|
395
|
+
missing
|
|
396
|
+
True where a part is missing.
|
|
397
|
+
year_part
|
|
398
|
+
The Array of the years, whose type the error names.
|
|
399
|
+
|
|
400
|
+
Raises
|
|
401
|
+
------
|
|
402
|
+
ValueConversionError
|
|
403
|
+
At the first year, month and day that form no date.
|
|
404
|
+
|
|
405
|
+
Examples
|
|
406
|
+
--------
|
|
407
|
+
>>> import numpy
|
|
408
|
+
>>> import numdaplot as ndp
|
|
409
|
+
>>> from numdaplot.arrays.creation.date_parts_values import PartNumbers, combine_parts, require_real_dates
|
|
410
|
+
>>> numbers = PartNumbers(numpy.array([2025.0]), numpy.array([2.0]), numpy.array([31.0]))
|
|
411
|
+
>>> try:
|
|
412
|
+
... require_real_dates(numbers, combine_parts(numbers), numpy.array([False]), ndp.Array.from_list([2025]))
|
|
413
|
+
... except ndp.ValueConversionError as error:
|
|
414
|
+
... print(error)
|
|
415
|
+
Cannot build a DATE from the year 2025, the month 2 and the day 31.
|
|
416
|
+
"""
|
|
417
|
+
year_values = dates.astype(YEAR_DTYPE)
|
|
418
|
+
month_values = dates.astype(MONTH_DTYPE)
|
|
419
|
+
built_years = year_values.astype(WHOLE_DTYPE) + EPOCH_YEAR
|
|
420
|
+
month_counts = month_values.astype(WHOLE_DTYPE)
|
|
421
|
+
built_months = month_counts % MONTHS_PER_YEAR + FIRST_MONTH
|
|
422
|
+
day_steps = dates - month_values.astype(DATE_DTYPE)
|
|
423
|
+
built_days = day_steps.astype(WHOLE_DTYPE) + FIRST_DAY
|
|
424
|
+
same_years = (built_years == numbers.years) & (numbers.years >= FIRST_YEAR)
|
|
425
|
+
same_dates = same_years & (built_months == numbers.months) & (built_days == numbers.days)
|
|
426
|
+
is_rejected = ~same_dates & ~missing
|
|
427
|
+
has_rejected = bool(is_rejected.any())
|
|
428
|
+
if not has_rejected:
|
|
429
|
+
return
|
|
430
|
+
|
|
431
|
+
rejected_positions = numpy.flatnonzero(is_rejected)
|
|
432
|
+
first_position = int(rejected_positions[0])
|
|
433
|
+
first_year = int(numbers.years[first_position])
|
|
434
|
+
first_month = int(numbers.months[first_position])
|
|
435
|
+
first_day = int(numbers.days[first_position])
|
|
436
|
+
rejected_date = RejectedDate(first_year, first_month, first_day)
|
|
437
|
+
raise ValueConversionError(year_part.dtype.name, Type.DATE.name, rejected_date)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base class of every random distribution.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
8
|
+
|
|
9
|
+
CONSTRUCTOR_OPERATION = "Creating a Distribution with ndp.Distribution()"
|
|
10
|
+
CONSTRUCTOR_ALTERNATIVE = "a distribution such as ndp.Uniform"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Distribution:
|
|
14
|
+
"""
|
|
15
|
+
Base class of every random distribution, the law followed by the values of ``Array.random``.
|
|
16
|
+
|
|
17
|
+
A distribution is immutable and checks its settings when it is created.
|
|
18
|
+
|
|
19
|
+
Only its subclasses are created: calling ``ndp.Distribution()`` raises ``RefusedOperationError``.
|
|
20
|
+
|
|
21
|
+
Every distribution, passed to ``Array.random``:
|
|
22
|
+
|
|
23
|
+
|Distribution|What it draws|Example|
|
|
24
|
+
|---|---|---|
|
|
25
|
+
|``Uniform``|Equally likely decimals from ``low`` to ``high``|``ndp.Uniform(low=0, high=10)``|
|
|
26
|
+
|``Normal``|Decimals around a mean, following a bell curve|``ndp.Normal(mean=0, deviation=1)``|
|
|
27
|
+
|``RandomIntegers``|Equally likely integers from ``low`` to ``high``|``ndp.RandomIntegers(low=1, high=6)``|
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> import numdaplot as ndp
|
|
34
|
+
>>> shape = ndp.Shape([3])
|
|
35
|
+
>>> for distribution in [ndp.Uniform(low=0, high=10), ndp.RandomIntegers(low=0, high=10)]:
|
|
36
|
+
... print(ndp.Array.random(distribution, shape=shape, seed=1))
|
|
37
|
+
Array([5.11821625, 9.50463696, 1.44159613], dtype=FLOAT64)
|
|
38
|
+
Array([5, 5, 8], dtype=INT64)
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self) -> None:
|
|
42
|
+
"""
|
|
43
|
+
Refuse the creation of the base class itself, and let a subclass be created.
|
|
44
|
+
|
|
45
|
+
.. versionadded:: 0.1.0
|
|
46
|
+
|
|
47
|
+
Raises
|
|
48
|
+
------
|
|
49
|
+
RefusedOperationError
|
|
50
|
+
When the created object is a Distribution and not one of its subclasses.
|
|
51
|
+
"""
|
|
52
|
+
created_class = type(self)
|
|
53
|
+
if created_class is Distribution:
|
|
54
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values made of a single repeated value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.creation.list_conversion import convert_list
|
|
13
|
+
from numdaplot.arrays.shape import Shape
|
|
14
|
+
from numdaplot.data_types.type import Type
|
|
15
|
+
from numdaplot.rules.rule_values import ScalarValue
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_filled_values(shape: Shape, value: ScalarValue, dtype: Type | None) -> NDArray[Any]:
|
|
19
|
+
"""
|
|
20
|
+
Return numpy values of a shape, all equal to one value.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
shape
|
|
27
|
+
The shape of the result.
|
|
28
|
+
value
|
|
29
|
+
The repeated value.
|
|
30
|
+
dtype
|
|
31
|
+
The type to store the value as, guessed from the value when ``None``.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
NDArray
|
|
36
|
+
The filled values.
|
|
37
|
+
|
|
38
|
+
Raises
|
|
39
|
+
------
|
|
40
|
+
ValueConversionError
|
|
41
|
+
When the value cannot be stored as ``dtype`` without losing information.
|
|
42
|
+
TimeOverflowError
|
|
43
|
+
When a value stored as ``DATETIME`` or ``DURATION`` is outside the range of nanoseconds.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> import numdaplot as ndp
|
|
48
|
+
>>> from numdaplot.arrays.creation.filled_values import build_filled_values
|
|
49
|
+
>>> build_filled_values(ndp.Shape([2, 3]), 0, None)
|
|
50
|
+
array([[0, 0, 0],
|
|
51
|
+
[0, 0, 0]])
|
|
52
|
+
"""
|
|
53
|
+
single_value_list = list[object]([value])
|
|
54
|
+
stored_value = convert_list(single_value_list, dtype)
|
|
55
|
+
single_stored_value = stored_value[0]
|
|
56
|
+
filled_values = numpy.full(shape.dimensions, single_stored_value, dtype=stored_value.dtype)
|
|
57
|
+
|
|
58
|
+
return filled_values
|