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,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a file to read does not exist.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import builtins
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
10
|
+
|
|
11
|
+
FILE_NOT_FOUND_MESSAGE = "No file found at {path}."
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class FileNotFoundError(NumdaplotError, builtins.FileNotFoundError):
|
|
15
|
+
"""
|
|
16
|
+
Raised when a Table is read from a path where there is no file.
|
|
17
|
+
|
|
18
|
+
It is also a Python ``FileNotFoundError``, so code catching the Python error keeps working.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
path
|
|
25
|
+
The path of the file, as given.
|
|
26
|
+
|
|
27
|
+
Attributes
|
|
28
|
+
----------
|
|
29
|
+
path
|
|
30
|
+
The path of the file, as given.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> try:
|
|
36
|
+
... ndp.Table.from_csv("missing.csv")
|
|
37
|
+
... except ndp.FileNotFoundError as error:
|
|
38
|
+
... print(error)
|
|
39
|
+
No file found at missing.csv.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, path: str) -> None:
|
|
43
|
+
"""
|
|
44
|
+
Build the error message from the path.
|
|
45
|
+
|
|
46
|
+
.. versionadded:: 0.1.0
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
path
|
|
51
|
+
The path of the file, as given.
|
|
52
|
+
"""
|
|
53
|
+
message = FILE_NOT_FOUND_MESSAGE.format(path=path)
|
|
54
|
+
super().__init__(message)
|
|
55
|
+
|
|
56
|
+
self.path = path
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a chart cannot be added to a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INCOMPATIBLE_CHARTS_MESSAGE = "A {chart_name} with {chart_positions} cannot be added to a Plot with {plot_positions}."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class IncompatibleChartsError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a chart added to a Plot does not have the kind of values of an axis it shares with the Plot.
|
|
15
|
+
|
|
16
|
+
Its ``x`` values are numbers, dates, texts or times of day while the Plot has another kind, or it measures numbers
|
|
17
|
+
on an axis of times of day, or the reverse.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
chart_name
|
|
24
|
+
Name of the chart class added, such as ``LineChart``.
|
|
25
|
+
chart_positions
|
|
26
|
+
What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
|
|
27
|
+
values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
|
|
28
|
+
plot_positions
|
|
29
|
+
What the Plot has on the shared axis.
|
|
30
|
+
|
|
31
|
+
Attributes
|
|
32
|
+
----------
|
|
33
|
+
chart_name
|
|
34
|
+
Name of the chart class added, such as ``LineChart``.
|
|
35
|
+
chart_positions
|
|
36
|
+
What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
|
|
37
|
+
values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
|
|
38
|
+
plot_positions
|
|
39
|
+
What the Plot has on the shared axis.
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
--------
|
|
43
|
+
>>> from datetime import date
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon"])
|
|
46
|
+
>>> days = ndp.Array.from_list([date(2026, 1, 1), date(2026, 1, 2)])
|
|
47
|
+
>>> sales = ndp.Array.from_list([120.0, 80.0])
|
|
48
|
+
>>> shops = ndp.Table.from_arrays({"city": cities, "day": days, "sales": sales})
|
|
49
|
+
>>> plot = ndp.Plot.bar(shops, ndp.BarChart(x="city", y=["sales"]))
|
|
50
|
+
>>> line = ndp.LineChart(x="day", y=["sales"])
|
|
51
|
+
>>> try:
|
|
52
|
+
... plot.add_line(shops, line)
|
|
53
|
+
... except ndp.IncompatibleChartsError as error:
|
|
54
|
+
... print(error)
|
|
55
|
+
A LineChart with dates cannot be added to a Plot with texts.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self, chart_name: str, chart_positions: str, plot_positions: str) -> None:
|
|
59
|
+
"""
|
|
60
|
+
Build the error message from the chart and what each one has on the shared axis.
|
|
61
|
+
|
|
62
|
+
.. versionadded:: 0.1.0
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
chart_name
|
|
67
|
+
Name of the chart class added, such as ``LineChart``.
|
|
68
|
+
chart_positions
|
|
69
|
+
What the added chart has on the shared axis: ``numbers``, ``dates``, ``texts`` or ``times of day`` as ``x``
|
|
70
|
+
values, or ``numbers on the left axis`` or ``times of day on the left axis`` as values.
|
|
71
|
+
plot_positions
|
|
72
|
+
What the Plot has on the shared axis.
|
|
73
|
+
"""
|
|
74
|
+
message = INCOMPATIBLE_CHARTS_MESSAGE.format(
|
|
75
|
+
chart_name=chart_name, chart_positions=chart_positions, plot_positions=plot_positions
|
|
76
|
+
)
|
|
77
|
+
super().__init__(message)
|
|
78
|
+
self.chart_name = chart_name
|
|
79
|
+
self.chart_positions = chart_positions
|
|
80
|
+
self.plot_positions = plot_positions
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when an operation does not apply to the types of its values.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
TYPE_NAME_SEPARATOR = " and "
|
|
10
|
+
INCOMPATIBLE_TYPES_MESSAGE = "Cannot apply {operation} to {type_names}."
|
|
11
|
+
COLUMN_TYPE_NAME = "the {type_name} column {column_name!r}"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IncompatibleTypesError(NumdaplotError):
|
|
15
|
+
"""
|
|
16
|
+
Raised when an operation, a rule, a statistic or a math function does not apply to the types it receives.
|
|
17
|
+
|
|
18
|
+
For example, a number cannot be added to a text, and ``Contains`` only applies to text.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
operation
|
|
25
|
+
Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
|
|
26
|
+
type_names
|
|
27
|
+
Names of the ``ndp.Type`` members the operation received, in order.
|
|
28
|
+
|
|
29
|
+
Attributes
|
|
30
|
+
----------
|
|
31
|
+
operation
|
|
32
|
+
Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
|
|
33
|
+
type_names
|
|
34
|
+
Names of the ``ndp.Type`` members the operation received, in order.
|
|
35
|
+
column_name
|
|
36
|
+
Name of the Table column holding the first type, or ``None`` for an Array or a type alone.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> import numdaplot as ndp
|
|
41
|
+
>>> array = ndp.Array.from_list([1, 2])
|
|
42
|
+
>>> try:
|
|
43
|
+
... array + "euros"
|
|
44
|
+
... except ndp.IncompatibleTypesError as error:
|
|
45
|
+
... print(error)
|
|
46
|
+
Cannot apply + to INT64 and TEXT.
|
|
47
|
+
>>> sales = ndp.Table.from_arrays({"city": ndp.Array.from_list(["Paris"])})
|
|
48
|
+
>>> mean_city = ndp.Calculation(column="city", function=ndp.Mean())
|
|
49
|
+
>>> try:
|
|
50
|
+
... sales.aggregate(ndp.Aggregation(calculations=[mean_city]))
|
|
51
|
+
... except ndp.IncompatibleTypesError as error:
|
|
52
|
+
... print(error)
|
|
53
|
+
Cannot apply Mean to the TEXT column 'city'.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, operation: str, type_names: list[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
|
|
65
|
+
Name of the operation: an operator such as ``"+"``, or a rule, statistic or function name.
|
|
66
|
+
type_names
|
|
67
|
+
Names of the ``ndp.Type`` members the operation received, in order.
|
|
68
|
+
"""
|
|
69
|
+
joined_type_names = TYPE_NAME_SEPARATOR.join(type_names)
|
|
70
|
+
message = INCOMPATIBLE_TYPES_MESSAGE.format(operation=operation, type_names=joined_type_names)
|
|
71
|
+
super().__init__(message)
|
|
72
|
+
|
|
73
|
+
self.operation = operation
|
|
74
|
+
self.type_names = list(type_names)
|
|
75
|
+
self.column_name: str | None = None
|
|
76
|
+
|
|
77
|
+
def name_column(self, column_name: str) -> None:
|
|
78
|
+
"""
|
|
79
|
+
Name the Table column holding the first type in the message, unless a column is already named.
|
|
80
|
+
|
|
81
|
+
.. versionadded:: 0.1.0
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
column_name
|
|
86
|
+
The name of the column.
|
|
87
|
+
|
|
88
|
+
Examples
|
|
89
|
+
--------
|
|
90
|
+
>>> import numdaplot as ndp
|
|
91
|
+
>>> error = ndp.IncompatibleTypesError("Greater", ["DATETIME", "INT64"])
|
|
92
|
+
>>> error.name_column("day")
|
|
93
|
+
>>> print(error)
|
|
94
|
+
Cannot apply Greater to the DATETIME column 'day' and INT64.
|
|
95
|
+
"""
|
|
96
|
+
if self.column_name is not None:
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
self.column_name = column_name
|
|
100
|
+
first_type_name, *other_type_names = self.type_names
|
|
101
|
+
named_type = COLUMN_TYPE_NAME.format(type_name=first_type_name, column_name=column_name)
|
|
102
|
+
joined_type_names = TYPE_NAME_SEPARATOR.join([named_type, *other_type_names])
|
|
103
|
+
message = INCOMPATIBLE_TYPES_MESSAGE.format(operation=self.operation, type_names=joined_type_names)
|
|
104
|
+
self.args = (message,)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when the result of a calculation does not fit an integer type.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INTEGER_OVERFLOW_MESSAGE = (
|
|
10
|
+
"The operation {operation_name} gives values too large for {type_name}. Convert the values to FLOAT64 first."
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class IntegerOverflowError(NumdaplotError):
|
|
15
|
+
"""
|
|
16
|
+
Raised when an integer result does not fit its type, which would otherwise wrap around to a wrong number.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
operation_name
|
|
23
|
+
The operator or the statistic, such as ``*`` or ``Sum``.
|
|
24
|
+
type_name
|
|
25
|
+
Name of the ``ndp.Type`` member that cannot hold the result.
|
|
26
|
+
|
|
27
|
+
Attributes
|
|
28
|
+
----------
|
|
29
|
+
operation_name
|
|
30
|
+
The operator or the statistic, such as ``*`` or ``Sum``.
|
|
31
|
+
type_name
|
|
32
|
+
Name of the ``ndp.Type`` member that cannot hold the result.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> try:
|
|
38
|
+
... ndp.Array.from_list([2**62]) * 4
|
|
39
|
+
... except ndp.IntegerOverflowError as error:
|
|
40
|
+
... print(error)
|
|
41
|
+
The operation * gives values too large for INT64. Convert the values to FLOAT64 first.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, operation_name: str, type_name: str) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Build the error message from the operation and the type names.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
operation_name
|
|
53
|
+
The operator or the statistic, such as ``*`` or ``Sum``.
|
|
54
|
+
type_name
|
|
55
|
+
Name of the ``ndp.Type`` member that cannot hold the result.
|
|
56
|
+
"""
|
|
57
|
+
message = INTEGER_OVERFLOW_MESSAGE.format(operation_name=operation_name, type_name=type_name)
|
|
58
|
+
super().__init__(message)
|
|
59
|
+
|
|
60
|
+
self.operation_name = operation_name
|
|
61
|
+
self.type_name = type_name
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a logarithm base is not usable.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INVALID_BASE_MESSAGE = "Expected a logarithm base greater than 0 and different from 1, got {base}."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class InvalidBaseError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a logarithm base is lower than or equal to 0, or equal to 1.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
base
|
|
21
|
+
The rejected base.
|
|
22
|
+
|
|
23
|
+
Attributes
|
|
24
|
+
----------
|
|
25
|
+
base
|
|
26
|
+
The rejected base.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numdaplot as ndp
|
|
31
|
+
>>> try:
|
|
32
|
+
... ndp.Logarithm(base=1)
|
|
33
|
+
... except ndp.InvalidBaseError as error:
|
|
34
|
+
... print(error)
|
|
35
|
+
Expected a logarithm base greater than 0 and different from 1, got 1.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, base: float) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Build the error message from the base.
|
|
41
|
+
|
|
42
|
+
.. versionadded:: 0.1.0
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
base
|
|
47
|
+
The rejected base.
|
|
48
|
+
"""
|
|
49
|
+
message = INVALID_BASE_MESSAGE.format(base=base)
|
|
50
|
+
super().__init__(message)
|
|
51
|
+
|
|
52
|
+
self.base = base
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when the bins of a histogram have a width of 0 or less, or a duration beyond a day.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from datetime import timedelta
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
10
|
+
|
|
11
|
+
INVALID_BIN_WIDTH_MESSAGE = "Expected a bin width above 0, got {width}."
|
|
12
|
+
INVALID_BIN_DURATION_MESSAGE = "Expected a bin width above 0 and at most 1 day, got {width}."
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InvalidBinWidthError(NumdaplotError):
|
|
16
|
+
"""
|
|
17
|
+
Raised when a ``BinWidth`` is 0 or negative, or a duration beyond a day.
|
|
18
|
+
|
|
19
|
+
Such a width would never cover the values, or be wider than every time of day.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
width
|
|
26
|
+
The rejected width.
|
|
27
|
+
|
|
28
|
+
Attributes
|
|
29
|
+
----------
|
|
30
|
+
width
|
|
31
|
+
The rejected width.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> try:
|
|
37
|
+
... ndp.BinWidth(-5.0)
|
|
38
|
+
... except ndp.InvalidBinWidthError as error:
|
|
39
|
+
... print(error)
|
|
40
|
+
Expected a bin width above 0, got -5.0.
|
|
41
|
+
>>> from datetime import timedelta
|
|
42
|
+
>>> try:
|
|
43
|
+
... ndp.BinWidth(timedelta(days=2))
|
|
44
|
+
... except ndp.InvalidBinWidthError as error:
|
|
45
|
+
... print(error)
|
|
46
|
+
Expected a bin width above 0 and at most 1 day, got 2 days, 0:00:00.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
def __init__(self, width: float | timedelta) -> None:
|
|
50
|
+
"""
|
|
51
|
+
Build the error message from the width.
|
|
52
|
+
|
|
53
|
+
.. versionadded:: 0.1.0
|
|
54
|
+
|
|
55
|
+
Parameters
|
|
56
|
+
----------
|
|
57
|
+
width
|
|
58
|
+
The rejected width.
|
|
59
|
+
"""
|
|
60
|
+
message_format = INVALID_BIN_WIDTH_MESSAGE
|
|
61
|
+
if isinstance(width, timedelta):
|
|
62
|
+
message_format = INVALID_BIN_DURATION_MESSAGE
|
|
63
|
+
|
|
64
|
+
message = message_format.format(width=width)
|
|
65
|
+
super().__init__(message)
|
|
66
|
+
self.width = width
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when the bounds of an interval are reversed or not comparable.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INVALID_BOUNDS_MESSAGE = "Expected comparable bounds with low <= high, got low={low!r} and high={high!r}."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class InvalidBoundsError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when the low bound is greater than the high bound, or when both cannot be compared.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
low
|
|
21
|
+
The rejected low bound.
|
|
22
|
+
high
|
|
23
|
+
The rejected high bound.
|
|
24
|
+
|
|
25
|
+
Attributes
|
|
26
|
+
----------
|
|
27
|
+
low
|
|
28
|
+
The rejected low bound.
|
|
29
|
+
high
|
|
30
|
+
The rejected high bound.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> try:
|
|
36
|
+
... ndp.Between(low=20, high=10)
|
|
37
|
+
... except ndp.InvalidBoundsError as error:
|
|
38
|
+
... print(error)
|
|
39
|
+
Expected comparable bounds with low <= high, got low=20 and high=10.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, low: object, high: object) -> None:
|
|
43
|
+
"""
|
|
44
|
+
Build the error message from the rejected bounds.
|
|
45
|
+
|
|
46
|
+
.. versionadded:: 0.1.0
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
low
|
|
51
|
+
The rejected low bound.
|
|
52
|
+
high
|
|
53
|
+
The rejected high bound.
|
|
54
|
+
"""
|
|
55
|
+
message = INVALID_BOUNDS_MESSAGE.format(low=low, high=high)
|
|
56
|
+
super().__init__(message)
|
|
57
|
+
self.low = low
|
|
58
|
+
self.high = high
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when the columns given to a chart do not fit the data it draws.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
MISSING_SETTING_MESSAGE = "{chart_name} needs {setting_name} for {data_name}."
|
|
10
|
+
EXTRA_SETTING_MESSAGE = "{chart_name} takes no {setting_name} for {data_name}."
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class InvalidChartDataError(NumdaplotError):
|
|
14
|
+
"""
|
|
15
|
+
Raised when a chart misses a column setting a Table needs, or has one an Array does not use.
|
|
16
|
+
|
|
17
|
+
A Table needs the ``y`` columns of a chart, while an Array draws each of its columns and takes no column name.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
chart_name
|
|
24
|
+
Name of the chart class, such as ``LineChart``.
|
|
25
|
+
setting_name
|
|
26
|
+
Name of the setting, such as ``y``.
|
|
27
|
+
data_name
|
|
28
|
+
The data drawn: ``a Table`` or ``an Array``.
|
|
29
|
+
needs_setting
|
|
30
|
+
True when the setting is missing, False when it is given but not used.
|
|
31
|
+
|
|
32
|
+
Attributes
|
|
33
|
+
----------
|
|
34
|
+
chart_name
|
|
35
|
+
Name of the chart class, such as ``LineChart``.
|
|
36
|
+
setting_name
|
|
37
|
+
Name of the setting, such as ``y``.
|
|
38
|
+
data_name
|
|
39
|
+
The data drawn: ``a Table`` or ``an Array``.
|
|
40
|
+
needs_setting
|
|
41
|
+
True when the setting is missing, False when it is given but not used.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
47
|
+
>>> chart = ndp.LineChart(y=["price"])
|
|
48
|
+
>>> try:
|
|
49
|
+
... ndp.Plot.line(prices, chart)
|
|
50
|
+
... except ndp.InvalidChartDataError as error:
|
|
51
|
+
... print(error)
|
|
52
|
+
LineChart takes no y for an Array.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, chart_name: str, setting_name: str, data_name: str, needs_setting: bool) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Build the error message from the chart, the setting and whether it is missing or extra.
|
|
58
|
+
|
|
59
|
+
.. versionadded:: 0.1.0
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
chart_name
|
|
64
|
+
Name of the chart class, such as ``LineChart``.
|
|
65
|
+
setting_name
|
|
66
|
+
Name of the setting, such as ``y``.
|
|
67
|
+
data_name
|
|
68
|
+
The data drawn: ``a Table`` or ``an Array``.
|
|
69
|
+
needs_setting
|
|
70
|
+
True when the setting is missing, False when it is given but not used.
|
|
71
|
+
"""
|
|
72
|
+
message_template = EXTRA_SETTING_MESSAGE
|
|
73
|
+
if needs_setting:
|
|
74
|
+
message_template = MISSING_SETTING_MESSAGE
|
|
75
|
+
|
|
76
|
+
message = message_template.format(chart_name=chart_name, setting_name=setting_name, data_name=data_name)
|
|
77
|
+
super().__init__(message)
|
|
78
|
+
self.chart_name = chart_name
|
|
79
|
+
self.setting_name = setting_name
|
|
80
|
+
self.data_name = data_name
|
|
81
|
+
self.needs_setting = needs_setting
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a chart does not have one color per series.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INVALID_COLOR_COUNT_MESSAGE = "Expected one color per series, {series_count} series and {color_count} color(s) given."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class InvalidColorCountError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when the colors of a chart are not exactly one per series.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
color_count
|
|
21
|
+
The number of colors given.
|
|
22
|
+
series_count
|
|
23
|
+
The number of series drawn.
|
|
24
|
+
|
|
25
|
+
Attributes
|
|
26
|
+
----------
|
|
27
|
+
color_count
|
|
28
|
+
The number of colors given.
|
|
29
|
+
series_count
|
|
30
|
+
The number of series drawn.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> days = ndp.Array.from_list([1, 2])
|
|
36
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
37
|
+
>>> costs = ndp.Array.from_list([8.0, 9.0])
|
|
38
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
39
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"], colors=[ndp.Color.BLUE])
|
|
40
|
+
>>> try:
|
|
41
|
+
... ndp.Plot.line(sales, chart)
|
|
42
|
+
... except ndp.InvalidColorCountError as error:
|
|
43
|
+
... print(error)
|
|
44
|
+
Expected one color per series, 2 series and 1 color(s) given.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, color_count: int, series_count: int) -> None:
|
|
48
|
+
"""
|
|
49
|
+
Build the error message from the two counts.
|
|
50
|
+
|
|
51
|
+
.. versionadded:: 0.1.0
|
|
52
|
+
|
|
53
|
+
Parameters
|
|
54
|
+
----------
|
|
55
|
+
color_count
|
|
56
|
+
The number of colors given.
|
|
57
|
+
series_count
|
|
58
|
+
The number of series drawn.
|
|
59
|
+
"""
|
|
60
|
+
message = INVALID_COLOR_COUNT_MESSAGE.format(color_count=color_count, series_count=series_count)
|
|
61
|
+
super().__init__(message)
|
|
62
|
+
self.color_count = color_count
|
|
63
|
+
self.series_count = series_count
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a custom color is not written as ``#rrggbb``.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
INVALID_COLOR_MESSAGE = "Expected a color written as #rrggbb, got {text!r}."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class InvalidColorError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when the text of a ``CustomColor`` is not ``#`` followed by six hexadecimal digits.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
text
|
|
21
|
+
The rejected text.
|
|
22
|
+
|
|
23
|
+
Attributes
|
|
24
|
+
----------
|
|
25
|
+
text
|
|
26
|
+
The rejected text.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numdaplot as ndp
|
|
31
|
+
>>> try:
|
|
32
|
+
... ndp.CustomColor("#ff88")
|
|
33
|
+
... except ndp.InvalidColorError as error:
|
|
34
|
+
... print(error)
|
|
35
|
+
Expected a color written as #rrggbb, got '#ff88'.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, text: str) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Build the error message from the rejected text.
|
|
41
|
+
|
|
42
|
+
.. versionadded:: 0.1.0
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
text
|
|
47
|
+
The rejected text.
|
|
48
|
+
"""
|
|
49
|
+
message = INVALID_COLOR_MESSAGE.format(text=text)
|
|
50
|
+
super().__init__(message)
|
|
51
|
+
self.text = text
|