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 an image is saved with an extension numdaplot does not write.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
UNSUPPORTED_IMAGE_FORMAT_MESSAGE = "Cannot save an image as {extension!r}: use .png, .svg or .pdf."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UnsupportedImageFormatError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when the path of an image does not end with ``.png``, ``.svg`` or ``.pdf``.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
extension
|
|
21
|
+
The rejected extension, such as ``.jpg``, or an empty text when the path has none.
|
|
22
|
+
|
|
23
|
+
Attributes
|
|
24
|
+
----------
|
|
25
|
+
extension
|
|
26
|
+
The rejected extension, such as ``.jpg``, or an empty text when the path has none.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import tempfile
|
|
31
|
+
>>> from pathlib import Path
|
|
32
|
+
>>> import numdaplot as ndp
|
|
33
|
+
>>> path = Path(tempfile.mkdtemp()) / "prices.jpg"
|
|
34
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
35
|
+
>>> plot = ndp.Plot.line(prices)
|
|
36
|
+
>>> try:
|
|
37
|
+
... plot.save(path)
|
|
38
|
+
... except ndp.UnsupportedImageFormatError as error:
|
|
39
|
+
... print(error)
|
|
40
|
+
Cannot save an image as '.jpg': use .png, .svg or .pdf.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, extension: str) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Build the error message from the rejected extension.
|
|
46
|
+
|
|
47
|
+
.. versionadded:: 0.1.0
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
extension
|
|
52
|
+
The rejected extension, such as ``.jpg``, or an empty text when the path has none.
|
|
53
|
+
"""
|
|
54
|
+
message = UNSUPPORTED_IMAGE_FORMAT_MESSAGE.format(extension=extension)
|
|
55
|
+
super().__init__(message)
|
|
56
|
+
self.extension = extension
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a pandas DataFrame has an index holding information.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
UNSUPPORTED_INDEX_MESSAGE = (
|
|
10
|
+
"A Table has no index, call reset_index() on the pandas DataFrame first to keep its index as a column."
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class UnsupportedIndexError(NumdaplotError):
|
|
15
|
+
"""
|
|
16
|
+
Raised by ``Table.from_pandas`` when the index of the pandas DataFrame is not the plain row numbers 0, 1, 2...
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Examples
|
|
21
|
+
--------
|
|
22
|
+
>>> import numdaplot as ndp
|
|
23
|
+
>>> import pandas
|
|
24
|
+
>>> frame = pandas.DataFrame({"price": [1, 2]}, index=["Paris", "Lyon"])
|
|
25
|
+
>>> try:
|
|
26
|
+
... ndp.Table.from_pandas(frame)
|
|
27
|
+
... except ndp.UnsupportedIndexError as error:
|
|
28
|
+
... print(error)
|
|
29
|
+
A Table has no index, call reset_index() on the pandas DataFrame first to keep its index as a column.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self) -> None:
|
|
33
|
+
"""
|
|
34
|
+
Build the error message.
|
|
35
|
+
|
|
36
|
+
.. versionadded:: 0.1.0
|
|
37
|
+
"""
|
|
38
|
+
super().__init__(UNSUPPORTED_INDEX_MESSAGE)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a missing value is given for a type that cannot hold one.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
BOOL_TYPE_NAME = "BOOL"
|
|
10
|
+
LIST_MESSAGE = "{type_name} values cannot be missing in an Array. {advice}"
|
|
11
|
+
COLUMN_MESSAGE = (
|
|
12
|
+
"The column {column_name!r} has missing values, which {article} {type_name} Array cannot hold. {advice}"
|
|
13
|
+
)
|
|
14
|
+
ARTICLE_BEFORE_VOWEL = "an"
|
|
15
|
+
ARTICLE = "a"
|
|
16
|
+
VOWELS = "AEIOU"
|
|
17
|
+
LIST_ADVICE = "Remove them."
|
|
18
|
+
LIST_DECIMAL_ADVICE = "Remove them, or give dtype=ndp.Type.FLOAT64."
|
|
19
|
+
COLUMN_ADVICE = "Remove them with drop_missing."
|
|
20
|
+
COLUMN_DECIMAL_ADVICE = "Remove them with drop_missing, or convert the column to FLOAT64."
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class UnsupportedMissingError(NumdaplotError):
|
|
24
|
+
"""
|
|
25
|
+
Raised when a missing value (``None``) is given for a type that cannot hold one in an Array.
|
|
26
|
+
|
|
27
|
+
Only integers and booleans cannot be missing in an Array. A Table accepts their missing values.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
type_name
|
|
34
|
+
Name of the ``ndp.Type`` member that cannot hold a missing value.
|
|
35
|
+
column_name
|
|
36
|
+
Name of the Table column holding the missing values. When omitted, the values were given to an Array.
|
|
37
|
+
advice
|
|
38
|
+
What to do instead, for values given to an Array by an operation that has its own solution. When omitted,
|
|
39
|
+
the advice of ``Array.from_list``.
|
|
40
|
+
|
|
41
|
+
Attributes
|
|
42
|
+
----------
|
|
43
|
+
type_name
|
|
44
|
+
Name of the ``ndp.Type`` member that cannot hold a missing value.
|
|
45
|
+
column_name
|
|
46
|
+
Name of the Table column holding the missing values, or ``None`` for values given to an Array.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numdaplot as ndp
|
|
51
|
+
>>> try:
|
|
52
|
+
... ndp.Array.from_list([1, None])
|
|
53
|
+
... except ndp.UnsupportedMissingError as error:
|
|
54
|
+
... print(error)
|
|
55
|
+
INT64 values cannot be missing in an Array. Remove them, or give dtype=ndp.Type.FLOAT64.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self, type_name: str, column_name: str | None = None, advice: str | None = None) -> None:
|
|
59
|
+
"""
|
|
60
|
+
Build the error message from the type name, the column name and the advice.
|
|
61
|
+
|
|
62
|
+
.. versionadded:: 0.1.0
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
type_name
|
|
67
|
+
Name of the ``ndp.Type`` member that cannot hold a missing value.
|
|
68
|
+
column_name
|
|
69
|
+
Name of the Table column holding the missing values. When omitted, the values were given to an Array.
|
|
70
|
+
advice
|
|
71
|
+
What to do instead, for values given to an Array. When omitted, the advice of ``Array.from_list``.
|
|
72
|
+
"""
|
|
73
|
+
message = write_missing_message(type_name, column_name, advice)
|
|
74
|
+
super().__init__(message)
|
|
75
|
+
|
|
76
|
+
self.type_name = type_name
|
|
77
|
+
self.column_name = column_name
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def write_missing_message(type_name: str, column_name: str | None, advice: str | None = None) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Return the message of the error, with the solutions that apply to the type.
|
|
83
|
+
|
|
84
|
+
Whole numbers can become decimals, which hold missing values. Booleans cannot.
|
|
85
|
+
|
|
86
|
+
.. versionadded:: 0.1.0
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
type_name
|
|
91
|
+
Name of the ``ndp.Type`` member that cannot hold a missing value.
|
|
92
|
+
column_name
|
|
93
|
+
Name of the Table column holding the missing values, or ``None`` for values given to an Array.
|
|
94
|
+
advice
|
|
95
|
+
What to do instead, for values given to an Array. When omitted, the advice of ``Array.from_list``.
|
|
96
|
+
|
|
97
|
+
Returns
|
|
98
|
+
-------
|
|
99
|
+
str
|
|
100
|
+
The message.
|
|
101
|
+
|
|
102
|
+
Examples
|
|
103
|
+
--------
|
|
104
|
+
>>> from numdaplot.errors.unsupported_missing_error import write_missing_message
|
|
105
|
+
>>> write_missing_message("BOOL", None)
|
|
106
|
+
'BOOL values cannot be missing in an Array. Remove them.'
|
|
107
|
+
>>> write_missing_message("BOOL", "paid")
|
|
108
|
+
"The column 'paid' has missing values, which a BOOL Array cannot hold. Remove them with drop_missing."
|
|
109
|
+
"""
|
|
110
|
+
converts_to_decimal = type_name != BOOL_TYPE_NAME
|
|
111
|
+
if column_name is None:
|
|
112
|
+
list_advice = LIST_DECIMAL_ADVICE if converts_to_decimal else LIST_ADVICE
|
|
113
|
+
if advice is not None:
|
|
114
|
+
list_advice = advice
|
|
115
|
+
|
|
116
|
+
list_message = LIST_MESSAGE.format(type_name=type_name, advice=list_advice)
|
|
117
|
+
return list_message
|
|
118
|
+
|
|
119
|
+
column_advice = COLUMN_DECIMAL_ADVICE if converts_to_decimal else COLUMN_ADVICE
|
|
120
|
+
first_letter = type_name[0]
|
|
121
|
+
article = ARTICLE_BEFORE_VOWEL if first_letter in VOWELS else ARTICLE
|
|
122
|
+
column_message = COLUMN_MESSAGE.format(
|
|
123
|
+
column_name=column_name,
|
|
124
|
+
article=article,
|
|
125
|
+
type_name=type_name,
|
|
126
|
+
advice=column_advice,
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
return column_message
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a type has no equivalent between numdaplot and an underlying library.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.data_types.library import Library
|
|
8
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
9
|
+
|
|
10
|
+
UNSUPPORTED_TYPE_MESSAGE = "The type {type_name} has no equivalent between numdaplot and {library_name}."
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class UnsupportedTypeError(NumdaplotError):
|
|
14
|
+
"""
|
|
15
|
+
Raised when a type cannot be converted between numdaplot and numpy or pandas.
|
|
16
|
+
|
|
17
|
+
For example, numpy has no ``CATEGORY`` type, and numdaplot has no complex number type.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
type_name
|
|
24
|
+
Name of the type that cannot be converted.
|
|
25
|
+
library
|
|
26
|
+
Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
|
|
27
|
+
|
|
28
|
+
Attributes
|
|
29
|
+
----------
|
|
30
|
+
type_name
|
|
31
|
+
Name of the type that cannot be converted.
|
|
32
|
+
library
|
|
33
|
+
Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> import numpy
|
|
39
|
+
>>> try:
|
|
40
|
+
... ndp.Array.from_numpy(numpy.array([1 + 2j]))
|
|
41
|
+
... except ndp.UnsupportedTypeError as error:
|
|
42
|
+
... print(error)
|
|
43
|
+
The type complex128 has no equivalent between numdaplot and numpy.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, type_name: str, library: Library) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Build the error message from the type and the library.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
type_name
|
|
55
|
+
Name of the type that cannot be converted.
|
|
56
|
+
library
|
|
57
|
+
Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
|
|
58
|
+
"""
|
|
59
|
+
message = UNSUPPORTED_TYPE_MESSAGE.format(type_name=type_name, library_name=library.value)
|
|
60
|
+
super().__init__(message)
|
|
61
|
+
self.type_name = type_name
|
|
62
|
+
self.library = library
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when values cannot be stored in a type without losing information, or texts cannot be read as dates.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
from numdaplot.errors.rejected_dates import RejectedDate, RejectedDatePart
|
|
9
|
+
|
|
10
|
+
VALUE_CONVERSION_MESSAGE = (
|
|
11
|
+
"Cannot store {source_type_name} values{column_text} as {target_type_name} without losing information."
|
|
12
|
+
)
|
|
13
|
+
REJECTED_VALUE_MESSAGE = (
|
|
14
|
+
"Cannot store the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} "
|
|
15
|
+
"without losing information."
|
|
16
|
+
)
|
|
17
|
+
UNREADABLE_DATE_MESSAGE = (
|
|
18
|
+
"Cannot read the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} with the format "
|
|
19
|
+
"{date_format_name}. Give the format of the column with format=, using DateFormat or CustomDateFormat."
|
|
20
|
+
)
|
|
21
|
+
NOT_WHOLE_PART_MESSAGE = (
|
|
22
|
+
"Cannot use the {source_type_name} value {rejected_value.value!r} as a {rejected_value.part_name}: "
|
|
23
|
+
"date parts must be whole numbers."
|
|
24
|
+
)
|
|
25
|
+
IMPOSSIBLE_DATE_MESSAGE = (
|
|
26
|
+
"Cannot build a {target_type_name} from the year {rejected_value.year}, the month {rejected_value.month} and the "
|
|
27
|
+
"day {rejected_value.day}."
|
|
28
|
+
)
|
|
29
|
+
UNREADABLE_TIME_MESSAGE = (
|
|
30
|
+
"Cannot read the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} with the format "
|
|
31
|
+
"{date_format_name}. Give the format of the column with format=, using a CustomDateFormat of a time only."
|
|
32
|
+
)
|
|
33
|
+
TIME_TYPE_NAME = "TIME"
|
|
34
|
+
COLUMN_TEXT = " of the column {column_name!r}"
|
|
35
|
+
NO_COLUMN_TEXT = ""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ValueConversionError(NumdaplotError):
|
|
39
|
+
"""
|
|
40
|
+
Raised when values cannot be stored in a type without losing information, or texts cannot be read as dates.
|
|
41
|
+
|
|
42
|
+
For example, decimals stored as integers, a text stored as a number, a text that does not follow the date
|
|
43
|
+
format, or date parts that form no date. When the first rejected value is known, the message shows it.
|
|
44
|
+
|
|
45
|
+
.. versionadded:: 0.1.0
|
|
46
|
+
|
|
47
|
+
Parameters
|
|
48
|
+
----------
|
|
49
|
+
source_type_name
|
|
50
|
+
Name of the ``ndp.Type`` member of the given values.
|
|
51
|
+
target_type_name
|
|
52
|
+
Name of the ``ndp.Type`` member they should be stored as, or ``JSON`` for a value JSON cannot write.
|
|
53
|
+
rejected_value
|
|
54
|
+
The first value that cannot be stored. When omitted, the message names no value. A ``RejectedDatePart`` or
|
|
55
|
+
a ``RejectedDate``, with the year, the month and the day, names the date parts that form no date.
|
|
56
|
+
date_format_name
|
|
57
|
+
The name or the pattern of the date format a rejected text was read with. When omitted, or without
|
|
58
|
+
``rejected_value``, the message names no format.
|
|
59
|
+
|
|
60
|
+
Attributes
|
|
61
|
+
----------
|
|
62
|
+
source_type_name
|
|
63
|
+
Name of the ``ndp.Type`` member of the given values.
|
|
64
|
+
target_type_name
|
|
65
|
+
Name of the ``ndp.Type`` member they should be stored as.
|
|
66
|
+
rejected_value
|
|
67
|
+
The first value that cannot be stored, or ``None`` when it is not known.
|
|
68
|
+
date_format_name
|
|
69
|
+
The name or the pattern of the date format a rejected text was read with, ``None`` for other values.
|
|
70
|
+
column_name
|
|
71
|
+
Name of the Table column holding the values, or ``None`` for values given to an Array.
|
|
72
|
+
|
|
73
|
+
Examples
|
|
74
|
+
--------
|
|
75
|
+
>>> import numdaplot as ndp
|
|
76
|
+
>>> try:
|
|
77
|
+
... ndp.Array.from_list([1.5, 2.5], dtype=ndp.Type.INT64)
|
|
78
|
+
... except ndp.ValueConversionError as error:
|
|
79
|
+
... print(error)
|
|
80
|
+
Cannot store FLOAT64 values as INT64 without losing information.
|
|
81
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31/12/2026"])})
|
|
82
|
+
>>> try:
|
|
83
|
+
... days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE))
|
|
84
|
+
... except ndp.ValueConversionError as error:
|
|
85
|
+
... print(error)
|
|
86
|
+
Cannot read the TEXT value '31/12/2026' of the column 'day' as DATE with the format YEAR_MONTH_DAY.
|
|
87
|
+
Give the format of the column with format=, using DateFormat or CustomDateFormat.
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
def __init__(
|
|
91
|
+
self,
|
|
92
|
+
source_type_name: str,
|
|
93
|
+
target_type_name: str,
|
|
94
|
+
rejected_value: object = None,
|
|
95
|
+
date_format_name: str | None = None,
|
|
96
|
+
) -> None:
|
|
97
|
+
"""
|
|
98
|
+
Build the error message from the type names, and the rejected value and the date format when they are known.
|
|
99
|
+
|
|
100
|
+
.. versionadded:: 0.1.0
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
source_type_name
|
|
105
|
+
Name of the ``ndp.Type`` member of the given values.
|
|
106
|
+
target_type_name
|
|
107
|
+
Name of the ``ndp.Type`` member they should be stored as.
|
|
108
|
+
rejected_value
|
|
109
|
+
The first value that cannot be stored. When omitted, the message names no value.
|
|
110
|
+
date_format_name
|
|
111
|
+
The name or the pattern of the date format a rejected text was read with. When omitted, or without
|
|
112
|
+
``rejected_value``, the message names no format.
|
|
113
|
+
"""
|
|
114
|
+
self.source_type_name = source_type_name
|
|
115
|
+
self.target_type_name = target_type_name
|
|
116
|
+
self.rejected_value = rejected_value
|
|
117
|
+
self.date_format_name = date_format_name
|
|
118
|
+
self.column_name: str | None = None
|
|
119
|
+
message = self.write_message(NO_COLUMN_TEXT)
|
|
120
|
+
super().__init__(message)
|
|
121
|
+
|
|
122
|
+
def write_message(self, column_text: str) -> str:
|
|
123
|
+
"""
|
|
124
|
+
Return the message, with the rejected value and the date format when they are known.
|
|
125
|
+
|
|
126
|
+
.. versionadded:: 0.1.0
|
|
127
|
+
|
|
128
|
+
Parameters
|
|
129
|
+
----------
|
|
130
|
+
column_text
|
|
131
|
+
The words naming the column after the values, or an empty text.
|
|
132
|
+
|
|
133
|
+
Returns
|
|
134
|
+
-------
|
|
135
|
+
str
|
|
136
|
+
The message.
|
|
137
|
+
|
|
138
|
+
Examples
|
|
139
|
+
--------
|
|
140
|
+
>>> import numdaplot as ndp
|
|
141
|
+
>>> ndp.ValueConversionError("FLOAT64", "INT64").write_message("")
|
|
142
|
+
'Cannot store FLOAT64 values as INT64 without losing information.'
|
|
143
|
+
"""
|
|
144
|
+
message_format = self.choose_message_format()
|
|
145
|
+
message = message_format.format(
|
|
146
|
+
source_type_name=self.source_type_name,
|
|
147
|
+
target_type_name=self.target_type_name,
|
|
148
|
+
rejected_value=self.rejected_value,
|
|
149
|
+
date_format_name=self.date_format_name,
|
|
150
|
+
column_text=column_text,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return message
|
|
154
|
+
|
|
155
|
+
def choose_message_format(self) -> str:
|
|
156
|
+
"""
|
|
157
|
+
Return the message format fitting what is known of the rejected value.
|
|
158
|
+
|
|
159
|
+
.. versionadded:: 0.1.0
|
|
160
|
+
|
|
161
|
+
Returns
|
|
162
|
+
-------
|
|
163
|
+
str
|
|
164
|
+
The format for date parts, a text read with a date format, a known value, or values in general.
|
|
165
|
+
|
|
166
|
+
Examples
|
|
167
|
+
--------
|
|
168
|
+
>>> import numdaplot as ndp
|
|
169
|
+
>>> from numdaplot.errors.rejected_dates import RejectedDate
|
|
170
|
+
>>> print(ndp.ValueConversionError("INT64", "DATE", RejectedDate(2025, 2, 31)))
|
|
171
|
+
Cannot build a DATE from the year 2025, the month 2 and the day 31.
|
|
172
|
+
"""
|
|
173
|
+
if isinstance(self.rejected_value, RejectedDatePart):
|
|
174
|
+
return NOT_WHOLE_PART_MESSAGE
|
|
175
|
+
|
|
176
|
+
if isinstance(self.rejected_value, RejectedDate):
|
|
177
|
+
return IMPOSSIBLE_DATE_MESSAGE
|
|
178
|
+
|
|
179
|
+
if self.rejected_value is None:
|
|
180
|
+
return VALUE_CONVERSION_MESSAGE
|
|
181
|
+
|
|
182
|
+
if self.date_format_name is None:
|
|
183
|
+
return REJECTED_VALUE_MESSAGE
|
|
184
|
+
|
|
185
|
+
if self.target_type_name == TIME_TYPE_NAME:
|
|
186
|
+
return UNREADABLE_TIME_MESSAGE
|
|
187
|
+
|
|
188
|
+
return UNREADABLE_DATE_MESSAGE
|
|
189
|
+
|
|
190
|
+
def name_column(self, column_name: str) -> None:
|
|
191
|
+
"""
|
|
192
|
+
Name the Table column holding the values in the message, unless a column is already named.
|
|
193
|
+
|
|
194
|
+
.. versionadded:: 0.1.0
|
|
195
|
+
|
|
196
|
+
Parameters
|
|
197
|
+
----------
|
|
198
|
+
column_name
|
|
199
|
+
The name of the column.
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
>>> import numdaplot as ndp
|
|
204
|
+
>>> error = ndp.ValueConversionError("TEXT", "FLOAT64", "abc")
|
|
205
|
+
>>> error.name_column("payment")
|
|
206
|
+
>>> print(error)
|
|
207
|
+
Cannot store the TEXT value 'abc' of the column 'payment' as FLOAT64 without losing information.
|
|
208
|
+
"""
|
|
209
|
+
if self.column_name is not None:
|
|
210
|
+
return
|
|
211
|
+
|
|
212
|
+
self.column_name = column_name
|
|
213
|
+
column_text = COLUMN_TEXT.format(column_name=column_name)
|
|
214
|
+
message = self.write_message(column_text)
|
|
215
|
+
self.args = (message,)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Place of missing values in a sort.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MissingPosition(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Place of missing values in a sort, whatever the order.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([20.0, None, 10.0])
|
|
20
|
+
>>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.FIRST))
|
|
21
|
+
Array([nan, 10., 20.], dtype=FLOAT64)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
FIRST = auto()
|
|
25
|
+
"""
|
|
26
|
+
Missing values come before every other value.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numdaplot as ndp
|
|
31
|
+
>>> prices = ndp.Array.from_list([20.0, None, 10.0])
|
|
32
|
+
>>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.FIRST))
|
|
33
|
+
Array([nan, 10., 20.], dtype=FLOAT64)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
LAST = auto()
|
|
37
|
+
"""
|
|
38
|
+
Missing values come after every other value, as in pandas. Default value.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> prices = ndp.Array.from_list([20.0, None, 10.0])
|
|
44
|
+
>>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.LAST))
|
|
45
|
+
Array([10., 20., nan], dtype=FLOAT64)
|
|
46
|
+
"""
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Direction of a sort.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Order(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Direction of a sort.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([20, 30, 10])
|
|
20
|
+
>>> prices.sort(ndp.ArraySorting(order=ndp.Order.DESCENDING))
|
|
21
|
+
Array([30, 20, 10], dtype=INT64)
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
ASCENDING = auto()
|
|
25
|
+
"""
|
|
26
|
+
From the smallest to the largest value. Default value.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numdaplot as ndp
|
|
31
|
+
>>> prices = ndp.Array.from_list([20, 30, 10])
|
|
32
|
+
>>> prices.sort(ndp.ArraySorting(order=ndp.Order.ASCENDING))
|
|
33
|
+
Array([10, 20, 30], dtype=INT64)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
DESCENDING = auto()
|
|
37
|
+
"""
|
|
38
|
+
From the largest to the smallest value.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> prices = ndp.Array.from_list([20, 30, 10])
|
|
44
|
+
>>> prices.sort(ndp.ArraySorting(order=ndp.Order.DESCENDING))
|
|
45
|
+
Array([30, 20, 10], dtype=INT64)
|
|
46
|
+
"""
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Version of the installed package.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
8
|
+
|
|
9
|
+
PACKAGE_NAME = "numdaplot"
|
|
10
|
+
UNKNOWN_VERSION = "0+unknown"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def find_package_version() -> str:
|
|
14
|
+
"""
|
|
15
|
+
Return the version of numdaplot, as written in the information of the installed package.
|
|
16
|
+
|
|
17
|
+
.. versionadded:: 0.1.0
|
|
18
|
+
|
|
19
|
+
Returns
|
|
20
|
+
-------
|
|
21
|
+
str
|
|
22
|
+
The version, or ``0+unknown`` for a code that runs without being installed.
|
|
23
|
+
|
|
24
|
+
Examples
|
|
25
|
+
--------
|
|
26
|
+
>>> import numdaplot as ndp
|
|
27
|
+
>>> from numdaplot.package_version import find_package_version
|
|
28
|
+
>>> find_package_version() == ndp.__version__
|
|
29
|
+
True
|
|
30
|
+
"""
|
|
31
|
+
try:
|
|
32
|
+
package_version = version(PACKAGE_NAME)
|
|
33
|
+
except PackageNotFoundError:
|
|
34
|
+
return UNKNOWN_VERSION
|
|
35
|
+
|
|
36
|
+
return package_version
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A chart and the values it draws.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.plots.charts.chart import Chart
|
|
10
|
+
from numdaplot.plots.charts.value_axis import ValueAxis
|
|
11
|
+
from numdaplot.plots.data.chart_values import ChartValues
|
|
12
|
+
from numdaplot.plots.data.point_values import PointValues
|
|
13
|
+
from numdaplot.plots.data.sample_values import SampleValues
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True, eq=False)
|
|
17
|
+
class ChartLayer:
|
|
18
|
+
"""
|
|
19
|
+
A chart and the values it draws, read when the Plot is created.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
chart
|
|
26
|
+
The chart settings.
|
|
27
|
+
values
|
|
28
|
+
The positions and the series, or for a ``HistogramChart`` and a ``BoxChart`` the columns and their groups.
|
|
29
|
+
points
|
|
30
|
+
The values coloring and sizing the points of a ``ScatterChart``, None for other charts.
|
|
31
|
+
value_axis
|
|
32
|
+
The vertical axis the chart is measured on, ``ValueAxis.LEFT`` unless added on the right.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
38
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
39
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
40
|
+
>>> ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart")).points is None
|
|
41
|
+
True
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
chart: Chart
|
|
45
|
+
values: ChartValues | SampleValues
|
|
46
|
+
points: PointValues | None = None
|
|
47
|
+
value_axis: ValueAxis = ValueAxis.LEFT
|