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,35 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Warning emitted when a chart is likely to be hard to read.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_warning import NumdaplotWarning
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ReadabilityWarning(NumdaplotWarning):
|
|
11
|
+
"""
|
|
12
|
+
Emitted when a chart is likely to be hard to read, such as a ``PieChart`` of more than 5 slices.
|
|
13
|
+
|
|
14
|
+
The Plot is still created. The warning suggests a chart that shows the same values more clearly, or a larger
|
|
15
|
+
size when only some of the labels naming the values of a chart can be shown.
|
|
16
|
+
|
|
17
|
+
Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
|
|
18
|
+
``NumdaplotWarning``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
--------
|
|
24
|
+
>>> import numdaplot as ndp
|
|
25
|
+
>>> import warnings
|
|
26
|
+
>>> fruits = ndp.Array.from_list(["apple", "pear", "plum", "fig", "kiwi", "lime"])
|
|
27
|
+
>>> sales = ndp.Array.from_list([30.0, 25.0, 15.0, 12.0, 10.0, 8.0])
|
|
28
|
+
>>> shares = ndp.Table.from_arrays({"fruit": fruits, "sales": sales})
|
|
29
|
+
>>> chart = ndp.PieChart(labels="fruit", values="sales")
|
|
30
|
+
>>> with warnings.catch_warnings(record=True) as caught_warnings:
|
|
31
|
+
... warnings.simplefilter("always")
|
|
32
|
+
... plot = ndp.Plot.pie(shares, chart)
|
|
33
|
+
>>> print(caught_warnings[0].message)
|
|
34
|
+
A PieChart with 6 slices is hard to read. Try ndp.Plot.bar with a BarChart, it may compare them better.
|
|
35
|
+
"""
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when an operation is not available on an Array, a Table or a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
REFUSED_OPERATION_MESSAGE = "{operation} is not available, use {alternative} instead."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RefusedOperationError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a Python operation is not available on an Array, a Table or a Plot, such as ``<`` or ``len``.
|
|
15
|
+
|
|
16
|
+
Calling the constructor of an Array, a Table or a Plot raises it too.
|
|
17
|
+
|
|
18
|
+
The message names the numdaplot method to use instead.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
operation
|
|
25
|
+
Description of the refused operation, naming what it applies to.
|
|
26
|
+
alternative
|
|
27
|
+
Description of what to use instead.
|
|
28
|
+
|
|
29
|
+
Attributes
|
|
30
|
+
----------
|
|
31
|
+
operation
|
|
32
|
+
Description of the refused operation, naming what it applies to.
|
|
33
|
+
alternative
|
|
34
|
+
Description of what to use instead.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> array = ndp.Array.from_list([1, 2])
|
|
40
|
+
>>> try:
|
|
41
|
+
... array < 2
|
|
42
|
+
... except ndp.RefusedOperationError as error:
|
|
43
|
+
... print(error)
|
|
44
|
+
Comparing an Array with < is not available, use select or check with a rule such as ndp.Less instead.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, operation: str, alternative: str) -> None:
|
|
48
|
+
"""
|
|
49
|
+
Build the error message from the operation and the alternative.
|
|
50
|
+
|
|
51
|
+
.. versionadded:: 0.1.0
|
|
52
|
+
|
|
53
|
+
Parameters
|
|
54
|
+
----------
|
|
55
|
+
operation
|
|
56
|
+
Description of the refused operation, naming what it applies to.
|
|
57
|
+
alternative
|
|
58
|
+
Description of what to use instead.
|
|
59
|
+
"""
|
|
60
|
+
message = REFUSED_OPERATION_MESSAGE.format(operation=operation, alternative=alternative)
|
|
61
|
+
super().__init__(message)
|
|
62
|
+
|
|
63
|
+
self.operation = operation
|
|
64
|
+
self.alternative = alternative
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a setting is given to an object that does not accept it.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
REFUSED_SETTING_MESSAGE = "{owner_name} does not accept {setting_name}."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RefusedSettingError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a setting is given to an object that does not accept it.
|
|
15
|
+
|
|
16
|
+
For example, a ``ScatterChart`` always draws a marker, and only PNG images have a resolution.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
setting_name
|
|
23
|
+
The refused setting, such as ``MarkerShape.NONE``.
|
|
24
|
+
owner_name
|
|
25
|
+
What refuses it, such as ``ScatterChart``.
|
|
26
|
+
|
|
27
|
+
Attributes
|
|
28
|
+
----------
|
|
29
|
+
setting_name
|
|
30
|
+
The refused setting, such as ``MarkerShape.NONE``.
|
|
31
|
+
owner_name
|
|
32
|
+
What refuses it, such as ``ScatterChart``.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> try:
|
|
38
|
+
... ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.NONE)
|
|
39
|
+
... except ndp.RefusedSettingError as error:
|
|
40
|
+
... print(error)
|
|
41
|
+
ScatterChart does not accept MarkerShape.NONE.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, setting_name: str, owner_name: str) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Build the error message from the setting and what refuses it.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
setting_name
|
|
53
|
+
The refused setting, such as ``MarkerShape.NONE``.
|
|
54
|
+
owner_name
|
|
55
|
+
What refuses it, such as ``ScatterChart``.
|
|
56
|
+
"""
|
|
57
|
+
message = REFUSED_SETTING_MESSAGE.format(setting_name=setting_name, owner_name=owner_name)
|
|
58
|
+
super().__init__(message)
|
|
59
|
+
self.setting_name = setting_name
|
|
60
|
+
self.owner_name = owner_name
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Date parts that cannot form a date, given to ValueConversionError.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
class RejectedDatePart:
|
|
12
|
+
"""
|
|
13
|
+
A part of a date that is not a whole number, such as the day 3.5.
|
|
14
|
+
|
|
15
|
+
.. versionadded:: 0.1.0
|
|
16
|
+
|
|
17
|
+
Parameters
|
|
18
|
+
----------
|
|
19
|
+
part_name
|
|
20
|
+
``"year"``, ``"month"`` or ``"day"``.
|
|
21
|
+
value
|
|
22
|
+
The rejected number.
|
|
23
|
+
|
|
24
|
+
Examples
|
|
25
|
+
--------
|
|
26
|
+
>>> from numdaplot.errors.rejected_dates import RejectedDatePart
|
|
27
|
+
>>> RejectedDatePart("day", 3.5).value
|
|
28
|
+
3.5
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
part_name: str
|
|
32
|
+
value: float
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class RejectedDate:
|
|
37
|
+
"""
|
|
38
|
+
A year, a month and a day that form no date, such as the 31st of February.
|
|
39
|
+
|
|
40
|
+
.. versionadded:: 0.1.0
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
year
|
|
45
|
+
The year.
|
|
46
|
+
month
|
|
47
|
+
The month.
|
|
48
|
+
day
|
|
49
|
+
The day.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> from numdaplot.errors.rejected_dates import RejectedDate
|
|
54
|
+
>>> RejectedDate(2025, 2, 31).day
|
|
55
|
+
31
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
year: int
|
|
59
|
+
month: int
|
|
60
|
+
day: int
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Key repeated in a Table where a join expects each key once, given to JoinRelationError.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass(frozen=True)
|
|
12
|
+
class RepeatedKey:
|
|
13
|
+
"""
|
|
14
|
+
The first key repeated in a Table, the combination of its values for several key columns.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
key_names
|
|
21
|
+
The names of the key columns.
|
|
22
|
+
key_values
|
|
23
|
+
The value of each key column, in the same order.
|
|
24
|
+
count
|
|
25
|
+
The number of rows having these values.
|
|
26
|
+
|
|
27
|
+
Examples
|
|
28
|
+
--------
|
|
29
|
+
>>> from numdaplot.errors.repeated_key import RepeatedKey
|
|
30
|
+
>>> RepeatedKey(["Num_Acc"], [202500000001], 3).count
|
|
31
|
+
3
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
key_names: list[str]
|
|
35
|
+
key_values: list[Any]
|
|
36
|
+
count: int
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when two shapes do not match.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
10
|
+
|
|
11
|
+
SHAPE_MISMATCH_MESSAGE = "Expected matching shapes, got {left_dimensions} and {right_dimensions}."
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ShapeMismatchError(NumdaplotError):
|
|
15
|
+
"""
|
|
16
|
+
Raised when two shapes do not match.
|
|
17
|
+
|
|
18
|
+
Two Arrays cannot be combined, a replacement does not fit its region, or a reshape targets a shape
|
|
19
|
+
holding another number of values.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
left_dimensions
|
|
26
|
+
Dimensions of the first shape.
|
|
27
|
+
right_dimensions
|
|
28
|
+
Dimensions of the second shape.
|
|
29
|
+
|
|
30
|
+
Attributes
|
|
31
|
+
----------
|
|
32
|
+
left_dimensions
|
|
33
|
+
Dimensions of the first shape, as a list.
|
|
34
|
+
right_dimensions
|
|
35
|
+
Dimensions of the second shape, as a list.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> array = ndp.Array.from_list([1, 2, 3])
|
|
41
|
+
>>> try:
|
|
42
|
+
... array.reshape(ndp.Shape([2, 2]))
|
|
43
|
+
... except ndp.ShapeMismatchError as error:
|
|
44
|
+
... print(error)
|
|
45
|
+
Expected matching shapes, got [3] and [2, 2].
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, left_dimensions: Sequence[int], right_dimensions: Sequence[int]) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Build the error message from the left dimensions and the right dimensions.
|
|
51
|
+
|
|
52
|
+
.. versionadded:: 0.1.0
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
left_dimensions
|
|
57
|
+
Dimensions of the first shape.
|
|
58
|
+
right_dimensions
|
|
59
|
+
Dimensions of the second shape.
|
|
60
|
+
"""
|
|
61
|
+
left_list = list(left_dimensions)
|
|
62
|
+
right_list = list(right_dimensions)
|
|
63
|
+
message = SHAPE_MISMATCH_MESSAGE.format(left_dimensions=left_list, right_dimensions=right_list)
|
|
64
|
+
super().__init__(message)
|
|
65
|
+
|
|
66
|
+
self.left_dimensions = left_list
|
|
67
|
+
self.right_dimensions = right_list
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when dates, datetimes or durations leave the range a count of nanoseconds can hold.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
TIME_OVERFLOW_MESSAGE = "The operation {operation_name} gives values{column_text} outside the range of {range_text}."
|
|
10
|
+
COLUMN_TEXT = " of the column {column_name!r}"
|
|
11
|
+
NO_COLUMN_TEXT = ""
|
|
12
|
+
TYPE_RANGES = {
|
|
13
|
+
"DATE": "DATE, from 1677 to 2262 in a calculation",
|
|
14
|
+
"DATETIME": "DATETIME, from 1677 to 2262",
|
|
15
|
+
"DURATION": "DURATION, about 292 years before or after zero",
|
|
16
|
+
"TIME": "TIME, from 00:00 to 23:59:59.999999",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TimeOverflowError(NumdaplotError):
|
|
21
|
+
"""
|
|
22
|
+
Raised when a value does not fit the nanoseconds counting datetimes and durations.
|
|
23
|
+
|
|
24
|
+
Without it, the value would become a wrong date or duration without any notice. A ``DATE`` is stored
|
|
25
|
+
in days and can be outside this range, but a calculation on it cannot.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
operation_name
|
|
32
|
+
The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
|
|
33
|
+
type_name
|
|
34
|
+
Name of the ``ndp.Type`` member that cannot hold the result: ``DATE``, ``DATETIME``, ``DURATION`` or ``TIME``.
|
|
35
|
+
|
|
36
|
+
Attributes
|
|
37
|
+
----------
|
|
38
|
+
operation_name
|
|
39
|
+
The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
|
|
40
|
+
type_name
|
|
41
|
+
Name of the ``ndp.Type`` member that cannot hold the result.
|
|
42
|
+
column_name
|
|
43
|
+
Name of the Table column holding the values, or ``None`` for values given to an Array.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> from datetime import timedelta
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> try:
|
|
50
|
+
... ndp.Array.from_list([timedelta(days=1)]) * 200000
|
|
51
|
+
... except ndp.TimeOverflowError as error:
|
|
52
|
+
... print(error)
|
|
53
|
+
The operation * gives values outside the range of DURATION, about 292 years before or after zero.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, operation_name: str, type_name: str) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Build the error message from the operation and the type names.
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.1.0
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
operation_name
|
|
65
|
+
The operator or the function, such as ``*``, ``from_list`` or ``ToDuration``.
|
|
66
|
+
type_name
|
|
67
|
+
Name of the ``ndp.Type`` member that cannot hold the result.
|
|
68
|
+
"""
|
|
69
|
+
self.operation_name = operation_name
|
|
70
|
+
self.type_name = type_name
|
|
71
|
+
self.column_name: str | None = None
|
|
72
|
+
message = self.write_message(NO_COLUMN_TEXT)
|
|
73
|
+
super().__init__(message)
|
|
74
|
+
|
|
75
|
+
def write_message(self, column_text: str) -> str:
|
|
76
|
+
"""
|
|
77
|
+
Return the message, with the range of the type.
|
|
78
|
+
|
|
79
|
+
.. versionadded:: 0.1.0
|
|
80
|
+
|
|
81
|
+
Parameters
|
|
82
|
+
----------
|
|
83
|
+
column_text
|
|
84
|
+
The words naming the column after the values, or an empty text.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
str
|
|
89
|
+
The message.
|
|
90
|
+
|
|
91
|
+
Examples
|
|
92
|
+
--------
|
|
93
|
+
>>> import numdaplot as ndp
|
|
94
|
+
>>> ndp.TimeOverflowError("+", "DATETIME").write_message("")
|
|
95
|
+
'The operation + gives values outside the range of DATETIME, from 1677 to 2262.'
|
|
96
|
+
"""
|
|
97
|
+
range_text = TYPE_RANGES[self.type_name]
|
|
98
|
+
message = TIME_OVERFLOW_MESSAGE.format(
|
|
99
|
+
operation_name=self.operation_name,
|
|
100
|
+
column_text=column_text,
|
|
101
|
+
range_text=range_text,
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
return message
|
|
105
|
+
|
|
106
|
+
def name_column(self, column_name: str) -> None:
|
|
107
|
+
"""
|
|
108
|
+
Name the Table column holding the values in the message, unless a column is already named.
|
|
109
|
+
|
|
110
|
+
.. versionadded:: 0.1.0
|
|
111
|
+
|
|
112
|
+
Parameters
|
|
113
|
+
----------
|
|
114
|
+
column_name
|
|
115
|
+
The name of the column.
|
|
116
|
+
|
|
117
|
+
Examples
|
|
118
|
+
--------
|
|
119
|
+
>>> import numdaplot as ndp
|
|
120
|
+
>>> error = ndp.TimeOverflowError("convert", "DATETIME")
|
|
121
|
+
>>> error.name_column("day")
|
|
122
|
+
>>> print(error)
|
|
123
|
+
The operation convert gives values of the column 'day' outside the range of DATETIME, from 1677 to 2262.
|
|
124
|
+
"""
|
|
125
|
+
if self.column_name is not None:
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
self.column_name = column_name
|
|
129
|
+
column_text = COLUMN_TEXT.format(column_name=column_name)
|
|
130
|
+
message = self.write_message(column_text)
|
|
131
|
+
self.args = (message,)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when datetimes with a time zone meet datetimes without one, or of another time zone.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
TIME_ZONE_MISMATCH_MESSAGE = "{operation} needs datetimes {state} a time zone."
|
|
10
|
+
TIME_ZONE_PAIR_MESSAGE = "{operation} needs datetimes in one time zone, got {zone_names}."
|
|
11
|
+
ZONE_NAME_SEPARATOR = " and "
|
|
12
|
+
WITH_TIME_ZONE = "with"
|
|
13
|
+
WITHOUT_TIME_ZONE = "without"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TimeZoneMismatchError(NumdaplotError):
|
|
17
|
+
"""
|
|
18
|
+
Raised when datetimes with a time zone meet datetimes without one, or datetimes of another time zone.
|
|
19
|
+
|
|
20
|
+
For example, a rule compares a datetime column with a time zone to a datetime without one,
|
|
21
|
+
or ``TimeZoneMode.SHIFT`` is asked for datetimes that have no time zone.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
operation
|
|
28
|
+
What was attempted, such as ``"Shifting to another time zone"``.
|
|
29
|
+
expects_time_zone
|
|
30
|
+
True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
|
|
31
|
+
zone_names
|
|
32
|
+
The two time zones met, such as ``["Europe/Paris", "UTC"]``. When omitted, one side has no time zone.
|
|
33
|
+
|
|
34
|
+
Attributes
|
|
35
|
+
----------
|
|
36
|
+
operation
|
|
37
|
+
What was attempted.
|
|
38
|
+
expects_time_zone
|
|
39
|
+
True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
|
|
40
|
+
zone_names
|
|
41
|
+
The two time zones met, or None.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> from datetime import datetime
|
|
46
|
+
>>> import numdaplot as ndp
|
|
47
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 1, 2, 10, 30)])})
|
|
48
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.SHIFT, zone=ndp.TimeZone("Europe/Paris"))
|
|
49
|
+
>>> try:
|
|
50
|
+
... times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
51
|
+
... except ndp.TimeZoneMismatchError as error:
|
|
52
|
+
... print(error)
|
|
53
|
+
Shifting to another time zone needs datetimes with a time zone.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, operation: str, expects_time_zone: bool, zone_names: list[str] | None = None) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Build the error message from the operation and the time zone state it needs, or the two zones met.
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.1.0
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
operation
|
|
65
|
+
What was attempted.
|
|
66
|
+
expects_time_zone
|
|
67
|
+
True when the operation needs datetimes with a time zone, False when it needs datetimes without one.
|
|
68
|
+
zone_names
|
|
69
|
+
The two time zones met. When omitted, one side has no time zone.
|
|
70
|
+
"""
|
|
71
|
+
state = WITHOUT_TIME_ZONE
|
|
72
|
+
if expects_time_zone:
|
|
73
|
+
state = WITH_TIME_ZONE
|
|
74
|
+
|
|
75
|
+
message = TIME_ZONE_MISMATCH_MESSAGE.format(operation=operation, state=state)
|
|
76
|
+
if zone_names is not None:
|
|
77
|
+
joined_names = ZONE_NAME_SEPARATOR.join(zone_names)
|
|
78
|
+
message = TIME_ZONE_PAIR_MESSAGE.format(operation=operation, zone_names=joined_names)
|
|
79
|
+
|
|
80
|
+
super().__init__(message)
|
|
81
|
+
self.operation = operation
|
|
82
|
+
self.expects_time_zone = expects_time_zone
|
|
83
|
+
self.zone_names = zone_names
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a time zone name is not a known IANA name.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
UNKNOWN_TIME_ZONE_MESSAGE = "Unknown time zone {name!r}, expected an IANA name such as 'Europe/Paris' or 'UTC'."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UnknownTimeZoneError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a time zone name is not a known IANA name, such as ``"Paris"`` or ``"+01:00"``.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
name
|
|
21
|
+
The rejected name.
|
|
22
|
+
|
|
23
|
+
Attributes
|
|
24
|
+
----------
|
|
25
|
+
name
|
|
26
|
+
The rejected name.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numdaplot as ndp
|
|
31
|
+
>>> try:
|
|
32
|
+
... ndp.TimeZone("Paris")
|
|
33
|
+
... except ndp.UnknownTimeZoneError as error:
|
|
34
|
+
... print(error)
|
|
35
|
+
Unknown time zone 'Paris', expected an IANA name such as 'Europe/Paris' or 'UTC'.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, name: str) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Build the error message from the rejected name.
|
|
41
|
+
|
|
42
|
+
.. versionadded:: 0.1.0
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
name
|
|
47
|
+
The rejected name.
|
|
48
|
+
"""
|
|
49
|
+
message = UNKNOWN_TIME_ZONE_MESSAGE.format(name=name)
|
|
50
|
+
super().__init__(message)
|
|
51
|
+
self.name = name
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a value has no new value in a ValueMapping, or is in no bracket of Brackets.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
VALUE_MAPPING_NAME = "ValueMapping"
|
|
10
|
+
BRACKETS_NAME = "Brackets"
|
|
11
|
+
UNMATCHED_MESSAGES = {
|
|
12
|
+
VALUE_MAPPING_NAME: (
|
|
13
|
+
"The value {value!r} has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing."
|
|
14
|
+
),
|
|
15
|
+
BRACKETS_NAME: (
|
|
16
|
+
"The value {value!r} is in no bracket. Open the first or the last bracket, or give others=Unmatched.MISSING "
|
|
17
|
+
"to make it missing."
|
|
18
|
+
),
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UnmatchedValueError(NumdaplotError):
|
|
23
|
+
"""
|
|
24
|
+
Raised when a value has no new value in a ``ValueMapping``, or is in no bracket of ``Brackets``.
|
|
25
|
+
|
|
26
|
+
Both raise it while their ``others`` is ``Unmatched.ERROR``.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
value
|
|
33
|
+
The first value without new value or bracket.
|
|
34
|
+
setting_name
|
|
35
|
+
``"ValueMapping"`` by default, or ``"Brackets"``: the setting that found no match, which chooses the advice.
|
|
36
|
+
|
|
37
|
+
Attributes
|
|
38
|
+
----------
|
|
39
|
+
value
|
|
40
|
+
The first value without new value or bracket.
|
|
41
|
+
setting_name
|
|
42
|
+
The setting that found no match.
|
|
43
|
+
|
|
44
|
+
Examples
|
|
45
|
+
--------
|
|
46
|
+
>>> import numdaplot as ndp
|
|
47
|
+
>>> sexes = ndp.Array.from_list([1, 2, 3])
|
|
48
|
+
>>> try:
|
|
49
|
+
... sexes.apply(ndp.ValueMapping(changes=[ndp.ValueChange(1, "Homme"), ndp.ValueChange(2, "Femme")]))
|
|
50
|
+
... except ndp.UnmatchedValueError as error:
|
|
51
|
+
... print(error)
|
|
52
|
+
The value 3 has no ValueChange. Add one, or give others=Unmatched.MISSING to make it missing.
|
|
53
|
+
>>> ages = ndp.Table.from_arrays({"age": ndp.Array.from_list([5, 105])})
|
|
54
|
+
>>> brackets = ndp.Brackets(limits=[0, 18, 100])
|
|
55
|
+
>>> try:
|
|
56
|
+
... ages.convert(ndp.Conversion(column="age", dtype=ndp.Type.CATEGORY, format=brackets))
|
|
57
|
+
... except ndp.UnmatchedValueError as error:
|
|
58
|
+
... print(error)
|
|
59
|
+
The value 105 is in no bracket. Open the first or the last bracket,
|
|
60
|
+
or give others=Unmatched.MISSING to make it missing.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(self, value: object, setting_name: str = VALUE_MAPPING_NAME) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Build the error message from the value and the setting that found no match.
|
|
66
|
+
|
|
67
|
+
.. versionadded:: 0.1.0
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
value
|
|
72
|
+
The first value without new value or bracket.
|
|
73
|
+
setting_name
|
|
74
|
+
The setting that found no match, ``"ValueMapping"`` by default.
|
|
75
|
+
"""
|
|
76
|
+
message_template = UNMATCHED_MESSAGES[setting_name]
|
|
77
|
+
message = message_template.format(value=value)
|
|
78
|
+
super().__init__(message)
|
|
79
|
+
|
|
80
|
+
self.value = value
|
|
81
|
+
self.setting_name = setting_name
|