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,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Logarithm 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
|
+
from numdaplot.errors.invalid_base_error import InvalidBaseError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
LOWEST_EXCLUDED_BASE = 0
|
|
14
|
+
FORBIDDEN_BASE = 1
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Logarithm(MathFunction):
|
|
19
|
+
"""
|
|
20
|
+
Logarithm of each value: with ``base=10``, 1000 gives 3.
|
|
21
|
+
|
|
22
|
+
Applying it to a value lower than or equal to 0 raises ``OutOfDomainError``.
|
|
23
|
+
Missing values stay missing.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
base
|
|
30
|
+
Base of the logarithm, greater than 0 and different from 1.
|
|
31
|
+
The natural logarithm, of base ``e``, when omitted.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
InvalidTypeError
|
|
36
|
+
When a setting is not of the type its annotation names.
|
|
37
|
+
InvalidBaseError
|
|
38
|
+
When ``base`` is lower than or equal to 0, or equal to 1.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> populations = ndp.Array.from_list([1, 100, 1000])
|
|
44
|
+
>>> populations.apply(ndp.Logarithm(base=10))
|
|
45
|
+
Array([0., 2., 3.], dtype=FLOAT64)
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
base: float | None = None
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
"""
|
|
52
|
+
Check that the base can be used.
|
|
53
|
+
|
|
54
|
+
.. versionadded:: 0.1.0
|
|
55
|
+
|
|
56
|
+
Raises
|
|
57
|
+
------
|
|
58
|
+
InvalidTypeError
|
|
59
|
+
When a setting is not of the type its annotation names.
|
|
60
|
+
InvalidBaseError
|
|
61
|
+
When ``base`` is lower than or equal to 0, or equal to 1.
|
|
62
|
+
"""
|
|
63
|
+
require_field_types(self)
|
|
64
|
+
|
|
65
|
+
if self.base is None:
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
if self.base <= LOWEST_EXCLUDED_BASE:
|
|
69
|
+
raise InvalidBaseError(self.base)
|
|
70
|
+
|
|
71
|
+
if self.base == FORBIDDEN_BASE:
|
|
72
|
+
raise InvalidBaseError(self.base)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base class of every math function.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
8
|
+
|
|
9
|
+
CONSTRUCTOR_OPERATION = "Creating a MathFunction with ndp.MathFunction()"
|
|
10
|
+
CONSTRUCTOR_ALTERNATIVE = "a math function such as ndp.SquareRoot"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MathFunction:
|
|
14
|
+
"""
|
|
15
|
+
Base class of every math function, applied to each value of a number Array by ``Array.apply``.
|
|
16
|
+
|
|
17
|
+
A math function is immutable and checks its settings when it is created.
|
|
18
|
+
|
|
19
|
+
Only its subclasses are created: calling ``ndp.MathFunction()`` raises ``RefusedOperationError``.
|
|
20
|
+
|
|
21
|
+
Every math function, passed to ``Array.apply``:
|
|
22
|
+
|
|
23
|
+
|Math function|What it gives for each value|Example|
|
|
24
|
+
|---|---|---|
|
|
25
|
+
|``Absolute``|Its distance to 0: -3 and 3 both give 3|``ndp.Absolute()``|
|
|
26
|
+
|``SquareRoot``|Its square root: 9 gives 3|``ndp.SquareRoot()``|
|
|
27
|
+
|``Exponential``|``e`` raised to the value: 0 gives 1|``ndp.Exponential()``|
|
|
28
|
+
|``Logarithm``|Its logarithm: with ``base=10``, 1000 gives 3|``ndp.Logarithm(base=10)``|
|
|
29
|
+
|``Round``|The value rounded to a number of decimals|``ndp.Round(decimals=2)``|
|
|
30
|
+
|``Sine``|Its sine, read as an angle in radians|``ndp.Sine()``|
|
|
31
|
+
|``Cosine``|Its cosine, read as an angle in radians|``ndp.Cosine()``|
|
|
32
|
+
|
|
33
|
+
.. versionadded:: 0.1.0
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> values = ndp.Array.from_list([1.0, 4.0])
|
|
39
|
+
>>> for function in [ndp.SquareRoot(), ndp.Logarithm(base=2)]:
|
|
40
|
+
... print(values.apply(function))
|
|
41
|
+
Array([1., 2.], dtype=FLOAT64)
|
|
42
|
+
Array([0., 2.], dtype=FLOAT64)
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Refuse the creation of the base class itself, and let a subclass be created.
|
|
48
|
+
|
|
49
|
+
.. versionadded:: 0.1.0
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
RefusedOperationError
|
|
54
|
+
When the created object is a MathFunction and not one of its subclasses.
|
|
55
|
+
"""
|
|
56
|
+
created_class = type(self)
|
|
57
|
+
if created_class is MathFunction:
|
|
58
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Rounding 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
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class Round(MathFunction):
|
|
15
|
+
"""
|
|
16
|
+
Each value rounded to a number of decimals.
|
|
17
|
+
|
|
18
|
+
A value exactly halfway is rounded to the nearest even digit, as in numpy:
|
|
19
|
+
2.5 gives 2 and 3.5 gives 4. Missing values stay missing.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
decimals
|
|
26
|
+
Number of decimals kept, 0 by default to round to whole numbers. A negative number rounds to
|
|
27
|
+
tens, hundreds...: -2 turns 1234 into 1200.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> prices = ndp.Array.from_list([12.346, 2.5, 3.5])
|
|
39
|
+
>>> prices.apply(ndp.Round(decimals=2))
|
|
40
|
+
Array([12.35, 2.5 , 3.5 ], dtype=FLOAT64)
|
|
41
|
+
>>> prices.apply(ndp.Round())
|
|
42
|
+
Array([12., 2., 4.], dtype=FLOAT64)
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
decimals: int = 0
|
|
46
|
+
|
|
47
|
+
def __post_init__(self) -> None:
|
|
48
|
+
"""
|
|
49
|
+
Check the type of every setting.
|
|
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
|
+
"""
|
|
58
|
+
require_field_types(self)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sine 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 Sine(MathFunction):
|
|
14
|
+
"""
|
|
15
|
+
Sine 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 / 2])
|
|
26
|
+
>>> angles.apply(ndp.Sine())
|
|
27
|
+
Array([0., 1.], dtype=FLOAT64)
|
|
28
|
+
"""
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Square root 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 SquareRoot(MathFunction):
|
|
14
|
+
"""
|
|
15
|
+
Square root of each value: 9 gives 3.
|
|
16
|
+
|
|
17
|
+
Applying it to a negative value raises ``OutOfDomainError``. Missing values stay missing.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Examples
|
|
22
|
+
--------
|
|
23
|
+
>>> import numdaplot as ndp
|
|
24
|
+
>>> areas = ndp.Array.from_list([4, 9, 16])
|
|
25
|
+
>>> areas.apply(ndp.SquareRoot())
|
|
26
|
+
Array([2., 3., 4.], dtype=FLOAT64)
|
|
27
|
+
"""
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check that the operands of a boolean operator are booleans.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.arrays.operations.operand import Operand, find_operand_type, find_operand_type_names
|
|
8
|
+
from numdaplot.data_types.type import Type
|
|
9
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def require_booleans(operands: list[Operand], symbol: str) -> None:
|
|
13
|
+
"""
|
|
14
|
+
Check that every operand of a boolean operator holds booleans.
|
|
15
|
+
|
|
16
|
+
``&``, ``|`` and ``~`` combine the masks returned by ``check``. On integers, numpy would
|
|
17
|
+
combine their bits instead, which is refused.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
operands
|
|
24
|
+
The values of Arrays, or single values.
|
|
25
|
+
symbol
|
|
26
|
+
The operator shown in error messages, such as ``"&"``.
|
|
27
|
+
|
|
28
|
+
Raises
|
|
29
|
+
------
|
|
30
|
+
IncompatibleTypesError
|
|
31
|
+
When an operand is not a boolean.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numpy
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> from numdaplot.arrays.operations.boolean_operands import require_booleans
|
|
38
|
+
>>> try:
|
|
39
|
+
... require_booleans([numpy.array([True]), 2], "|")
|
|
40
|
+
... except ndp.IncompatibleTypesError as error:
|
|
41
|
+
... print(error)
|
|
42
|
+
Cannot apply | to BOOL and INT64.
|
|
43
|
+
"""
|
|
44
|
+
for operand in operands:
|
|
45
|
+
operand_type = find_operand_type(operand)
|
|
46
|
+
if operand_type != Type.BOOL:
|
|
47
|
+
type_names = find_operand_type_names(operands)
|
|
48
|
+
raise IncompatibleTypesError(symbol, type_names)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Combination of two operands with an arithmetic or boolean function.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import warnings
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import numpy
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.arrays.operations.float_errors import FloatErrorWarnings, TimeErrorWarnings
|
|
14
|
+
from numdaplot.arrays.operations.integer_rules import require_combination_fits, require_defined_integers
|
|
15
|
+
from numdaplot.arrays.operations.operand import Operand, find_operand_type_names
|
|
16
|
+
from numdaplot.arrays.operations.time_arithmetic import combine_time_values, involves_time
|
|
17
|
+
from numdaplot.errors.broadcast_warning import BroadcastWarning
|
|
18
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
19
|
+
from numdaplot.errors.integer_overflow_error import IntegerOverflowError
|
|
20
|
+
from numdaplot.errors.shape_mismatch_error import ShapeMismatchError
|
|
21
|
+
|
|
22
|
+
PYTHON_OBJECT_KIND = "O"
|
|
23
|
+
BROADCAST_MESSAGE = "Shapes {left_dimensions} and {right_dimensions} differ, values are repeated to match."
|
|
24
|
+
# The warning points at the user line: check_shapes, combine_values, the Array helper, the operator, its check.
|
|
25
|
+
BROADCAST_STACK_LEVEL = 6
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def combine_values(left: Operand, right: Operand, function: numpy.ufunc, symbol: str) -> NDArray[Any]:
|
|
29
|
+
"""
|
|
30
|
+
Return the result of a numpy function applied to two operands, value by value.
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.1.0
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
left
|
|
37
|
+
The values of an Array, or a single value.
|
|
38
|
+
right
|
|
39
|
+
The values of an Array, or a single value. At least one side is the values of an Array.
|
|
40
|
+
function
|
|
41
|
+
The numpy function, such as ``numpy.add``.
|
|
42
|
+
symbol
|
|
43
|
+
The operator shown in error messages, such as ``"+"``.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
NDArray
|
|
48
|
+
The combined values, following the numpy type rules, and the rules of ``combine_time_values`` for
|
|
49
|
+
dates, datetimes and durations.
|
|
50
|
+
|
|
51
|
+
Warns
|
|
52
|
+
-----
|
|
53
|
+
BroadcastWarning
|
|
54
|
+
When both sides are Array values of different but compatible shapes.
|
|
55
|
+
CalculationWarning
|
|
56
|
+
When values of decimals become NaN or an infinite value, or durations become missing values.
|
|
57
|
+
|
|
58
|
+
Raises
|
|
59
|
+
------
|
|
60
|
+
ShapeMismatchError
|
|
61
|
+
When both sides are Array values whose shapes cannot be combined.
|
|
62
|
+
IncompatibleTypesError
|
|
63
|
+
When the function does not apply to the types of the operands.
|
|
64
|
+
OutOfDomainError
|
|
65
|
+
When integers are divided by 0 with ``//`` or ``%``, or raised to a negative power.
|
|
66
|
+
IntegerOverflowError
|
|
67
|
+
When a result does not fit its integer type.
|
|
68
|
+
TimeOverflowError
|
|
69
|
+
When a date, a datetime or a duration is outside the range of nanoseconds.
|
|
70
|
+
RefusedOperationError, ValueConversionError
|
|
71
|
+
When a time operation is refused, as in ``combine_time_values``.
|
|
72
|
+
|
|
73
|
+
Examples
|
|
74
|
+
--------
|
|
75
|
+
>>> import numpy
|
|
76
|
+
>>> from numdaplot.arrays.operations.combination import combine_values
|
|
77
|
+
>>> combine_values(numpy.array([1, 2]), 10, numpy.multiply, "*")
|
|
78
|
+
array([10, 20])
|
|
79
|
+
"""
|
|
80
|
+
check_shapes(left, right)
|
|
81
|
+
has_time = involves_time(left, right)
|
|
82
|
+
if has_time:
|
|
83
|
+
with TimeErrorWarnings(symbol):
|
|
84
|
+
time_values = combine_time_values(left, right, function, symbol)
|
|
85
|
+
|
|
86
|
+
return time_values
|
|
87
|
+
|
|
88
|
+
require_defined_integers(left, right, function)
|
|
89
|
+
operands = list[Operand]([left, right])
|
|
90
|
+
try:
|
|
91
|
+
with FloatErrorWarnings(symbol):
|
|
92
|
+
combined_values = function(left, right)
|
|
93
|
+
require_combination_fits(operands, function, combined_values, symbol)
|
|
94
|
+
except TypeError as error:
|
|
95
|
+
type_names = find_operand_type_names(operands)
|
|
96
|
+
raise IncompatibleTypesError(symbol, type_names) from error
|
|
97
|
+
except OverflowError as error:
|
|
98
|
+
type_names = find_operand_type_names(operands)
|
|
99
|
+
raise IntegerOverflowError(symbol, type_names[0]) from error
|
|
100
|
+
|
|
101
|
+
if combined_values.dtype.kind == PYTHON_OBJECT_KIND:
|
|
102
|
+
type_names = find_operand_type_names(operands)
|
|
103
|
+
raise IncompatibleTypesError(symbol, type_names)
|
|
104
|
+
|
|
105
|
+
return combined_values
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def check_shapes(left: Operand, right: Operand) -> None:
|
|
109
|
+
"""
|
|
110
|
+
Check that two operands can be combined, and warn when an Array is stretched to match the other.
|
|
111
|
+
|
|
112
|
+
.. versionadded:: 0.1.0
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
left
|
|
117
|
+
The values of an Array, or a single value.
|
|
118
|
+
right
|
|
119
|
+
The values of an Array, or a single value.
|
|
120
|
+
|
|
121
|
+
Warns
|
|
122
|
+
-----
|
|
123
|
+
BroadcastWarning
|
|
124
|
+
When both sides are Array values of different but compatible shapes.
|
|
125
|
+
|
|
126
|
+
Raises
|
|
127
|
+
------
|
|
128
|
+
ShapeMismatchError
|
|
129
|
+
When both sides are Array values whose shapes cannot be combined.
|
|
130
|
+
|
|
131
|
+
Examples
|
|
132
|
+
--------
|
|
133
|
+
>>> import numpy
|
|
134
|
+
>>> import numdaplot as ndp
|
|
135
|
+
>>> from numdaplot.arrays.operations.combination import check_shapes
|
|
136
|
+
>>> try:
|
|
137
|
+
... check_shapes(numpy.array([1, 2]), numpy.array([1, 2, 3]))
|
|
138
|
+
... except ndp.ShapeMismatchError as error:
|
|
139
|
+
... print(error)
|
|
140
|
+
Expected matching shapes, got [2] and [3].
|
|
141
|
+
"""
|
|
142
|
+
if not isinstance(left, numpy.ndarray):
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
if not isinstance(right, numpy.ndarray):
|
|
146
|
+
return
|
|
147
|
+
|
|
148
|
+
if left.shape == right.shape:
|
|
149
|
+
return
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
numpy.broadcast_shapes(left.shape, right.shape)
|
|
153
|
+
except ValueError as error:
|
|
154
|
+
raise ShapeMismatchError(left.shape, right.shape) from error
|
|
155
|
+
|
|
156
|
+
message = BROADCAST_MESSAGE.format(left_dimensions=left.shape, right_dimensions=right.shape)
|
|
157
|
+
warnings.warn(message, BroadcastWarning, stacklevel=BROADCAST_STACK_LEVEL)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Warnings about the values of a calculation that become NaN or an infinite value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import warnings
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from types import TracebackType
|
|
11
|
+
|
|
12
|
+
import numpy
|
|
13
|
+
|
|
14
|
+
from numdaplot.errors.calculation_warning import CalculationWarning
|
|
15
|
+
|
|
16
|
+
CALL_MODE = "call"
|
|
17
|
+
IGNORE_MODE = "ignore"
|
|
18
|
+
PACKAGE_LEVEL = 2
|
|
19
|
+
PACKAGE_DIRECTORY = str(Path(__file__).parents[PACKAGE_LEVEL]) + os.sep
|
|
20
|
+
INTERNAL_FILES = (PACKAGE_DIRECTORY,)
|
|
21
|
+
# The keys are the names numpy gives to its floating point errors.
|
|
22
|
+
FLOAT_ERROR_MESSAGES = {
|
|
23
|
+
"invalid value": "The operation {operation_name} has values without a defined result, such as 0 / 0: "
|
|
24
|
+
"they became NaN.",
|
|
25
|
+
"divide by zero": "The operation {operation_name} divides by zero: these values became inf.",
|
|
26
|
+
"overflow": "The operation {operation_name} has values too large for their type: they became inf.",
|
|
27
|
+
}
|
|
28
|
+
# A duration too large is refused before it is computed, so a calculation on times only meets these two errors.
|
|
29
|
+
TIME_ERROR_MESSAGES = {
|
|
30
|
+
"invalid value": "The operation {operation_name} has values without a defined result, such as 0 / 0: "
|
|
31
|
+
"they became missing.",
|
|
32
|
+
"divide by zero": "The operation {operation_name} divides by zero: these values became missing.",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class FloatErrorWarnings:
|
|
37
|
+
"""
|
|
38
|
+
Context giving the numpy floating point errors of a block as ``CalculationWarning``, at the calling code.
|
|
39
|
+
|
|
40
|
+
Each kind of error gives one warning when the block ends, and none when the block raises an error.
|
|
41
|
+
|
|
42
|
+
.. versionadded:: 0.1.0
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
operation_name
|
|
47
|
+
The operator or the function shown in the message, such as ``/`` or ``Sum``.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import numpy
|
|
52
|
+
>>> import warnings
|
|
53
|
+
>>> from numdaplot.arrays.operations.float_errors import FloatErrorWarnings
|
|
54
|
+
>>> with warnings.catch_warnings(record=True) as caught_warnings:
|
|
55
|
+
... warnings.simplefilter("always")
|
|
56
|
+
... with FloatErrorWarnings("/"):
|
|
57
|
+
... numpy.array([1.0]) / numpy.array([0.0])
|
|
58
|
+
array([inf])
|
|
59
|
+
>>> print(caught_warnings[0].message)
|
|
60
|
+
The operation / divides by zero: these values became inf.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
messages = FLOAT_ERROR_MESSAGES
|
|
64
|
+
|
|
65
|
+
def __init__(self, operation_name: str) -> None:
|
|
66
|
+
"""
|
|
67
|
+
Prepare the numpy settings recording the errors of the block.
|
|
68
|
+
|
|
69
|
+
.. versionadded:: 0.1.0
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
operation_name
|
|
74
|
+
The operator or the function shown in the message, such as ``/`` or ``Sum``.
|
|
75
|
+
"""
|
|
76
|
+
self.operation_name = operation_name
|
|
77
|
+
self.met_errors = set[str]()
|
|
78
|
+
self.numpy_settings = numpy.errstate(
|
|
79
|
+
divide=CALL_MODE,
|
|
80
|
+
invalid=CALL_MODE,
|
|
81
|
+
over=CALL_MODE,
|
|
82
|
+
under=IGNORE_MODE,
|
|
83
|
+
call=self.record_float_error,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def record_float_error(self, error_name: str, _error_flag: int) -> None:
|
|
87
|
+
"""
|
|
88
|
+
Remember a floating point error, as numpy reports it during the block.
|
|
89
|
+
|
|
90
|
+
.. versionadded:: 0.1.0
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
error_name
|
|
95
|
+
The name numpy gives to the error.
|
|
96
|
+
_error_flag
|
|
97
|
+
The numpy code of the error, not used.
|
|
98
|
+
"""
|
|
99
|
+
self.met_errors.add(error_name)
|
|
100
|
+
|
|
101
|
+
def __enter__(self) -> None:
|
|
102
|
+
"""
|
|
103
|
+
Start recording the errors.
|
|
104
|
+
|
|
105
|
+
.. versionadded:: 0.1.0
|
|
106
|
+
"""
|
|
107
|
+
self.numpy_settings.__enter__()
|
|
108
|
+
|
|
109
|
+
def __exit__(
|
|
110
|
+
self,
|
|
111
|
+
error_type: type[BaseException] | None,
|
|
112
|
+
error: BaseException | None,
|
|
113
|
+
traceback: TracebackType | None,
|
|
114
|
+
) -> None:
|
|
115
|
+
"""
|
|
116
|
+
Stop recording the errors, and warn once per kind of error unless the block raised one.
|
|
117
|
+
|
|
118
|
+
.. versionadded:: 0.1.0
|
|
119
|
+
|
|
120
|
+
Parameters
|
|
121
|
+
----------
|
|
122
|
+
error_type
|
|
123
|
+
The type of the error raised by the block, or None.
|
|
124
|
+
error
|
|
125
|
+
The error raised by the block, or None.
|
|
126
|
+
traceback
|
|
127
|
+
Its traceback, or None.
|
|
128
|
+
|
|
129
|
+
Warns
|
|
130
|
+
-----
|
|
131
|
+
CalculationWarning
|
|
132
|
+
Once per kind of error met in the block.
|
|
133
|
+
"""
|
|
134
|
+
self.numpy_settings.__exit__(error_type, error, traceback)
|
|
135
|
+
if error_type is not None:
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
for error_name, message_format in self.messages.items():
|
|
139
|
+
if error_name in self.met_errors:
|
|
140
|
+
message = message_format.format(operation_name=self.operation_name)
|
|
141
|
+
warnings.warn(message, CalculationWarning, skip_file_prefixes=INTERNAL_FILES)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class TimeErrorWarnings(FloatErrorWarnings):
|
|
145
|
+
"""
|
|
146
|
+
Context giving the numpy floating point errors of a calculation on times, whose values become missing.
|
|
147
|
+
|
|
148
|
+
.. versionadded:: 0.1.0
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
operation_name
|
|
153
|
+
The operator shown in the message, such as ``/``.
|
|
154
|
+
|
|
155
|
+
Examples
|
|
156
|
+
--------
|
|
157
|
+
>>> import numpy
|
|
158
|
+
>>> import warnings
|
|
159
|
+
>>> from numdaplot.arrays.operations.float_errors import TimeErrorWarnings
|
|
160
|
+
>>> durations = numpy.array([1], dtype="timedelta64[ns]")
|
|
161
|
+
>>> with warnings.catch_warnings(record=True) as caught_warnings:
|
|
162
|
+
... warnings.simplefilter("always")
|
|
163
|
+
... with TimeErrorWarnings("/"):
|
|
164
|
+
... durations / numpy.array([0.0])
|
|
165
|
+
array(['NaT'], dtype='timedelta64[ns]')
|
|
166
|
+
>>> print(caught_warnings[0].message)
|
|
167
|
+
The operation / divides by zero: these values became missing.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
messages = TIME_ERROR_MESSAGES
|