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,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A new name for one column of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.field_types import require_field_types
|
|
10
|
+
from numdaplot.tables.columns.column_names import require_column_name
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class NameChange:
|
|
15
|
+
"""
|
|
16
|
+
A new name for one column of a Table, used by ``Renaming``.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
old_name
|
|
23
|
+
The current name of the column.
|
|
24
|
+
new_name
|
|
25
|
+
Its new name, a non-empty text.
|
|
26
|
+
|
|
27
|
+
Raises
|
|
28
|
+
------
|
|
29
|
+
InvalidTypeError
|
|
30
|
+
When a setting is not of the type its annotation names.
|
|
31
|
+
InvalidColumnNameError
|
|
32
|
+
When ``old_name`` or ``new_name`` is an empty text.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
38
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
39
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
40
|
+
>>> sales.rename(ndp.Renaming(changes=[ndp.NameChange(old_name="city", new_name="town")]))
|
|
41
|
+
town price
|
|
42
|
+
TEXT FLOAT64
|
|
43
|
+
0 Paris 120.0
|
|
44
|
+
1 Lyon 80.0
|
|
45
|
+
2 Paris 150.0
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
old_name: str
|
|
49
|
+
new_name: str
|
|
50
|
+
|
|
51
|
+
def __post_init__(self) -> None:
|
|
52
|
+
"""
|
|
53
|
+
Check that both names are non-empty texts.
|
|
54
|
+
|
|
55
|
+
.. versionadded:: 0.1.0
|
|
56
|
+
|
|
57
|
+
Raises
|
|
58
|
+
------
|
|
59
|
+
InvalidTypeError
|
|
60
|
+
When a setting is not of the type its annotation names.
|
|
61
|
+
InvalidColumnNameError
|
|
62
|
+
When ``old_name`` or ``new_name`` is an empty text.
|
|
63
|
+
"""
|
|
64
|
+
require_field_types(self)
|
|
65
|
+
|
|
66
|
+
require_column_name(self.old_name)
|
|
67
|
+
require_column_name(self.new_name)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A column to add to a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from numdaplot.settings.field_types import require_field_types
|
|
13
|
+
from numdaplot.tables.columns.column_names import require_column_name
|
|
14
|
+
from numdaplot.tables.conflict import Conflict
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from numdaplot.arrays.array import Array
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# eq=False because comparing two new columns would compare their Arrays with ==, which Array refuses.
|
|
21
|
+
@dataclass(frozen=True, eq=False)
|
|
22
|
+
class NewColumn:
|
|
23
|
+
"""
|
|
24
|
+
A column to add to a Table, used by ``Table.add_column``.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
name
|
|
31
|
+
The name of the column, a non-empty text.
|
|
32
|
+
values
|
|
33
|
+
A one-dimensional Array with one value per row of the Table.
|
|
34
|
+
on_conflict
|
|
35
|
+
``ERROR`` by default, refusing a name that already exists, or ``REPLACE`` to replace the existing column, at its
|
|
36
|
+
place.
|
|
37
|
+
|
|
38
|
+
Raises
|
|
39
|
+
------
|
|
40
|
+
InvalidTypeError
|
|
41
|
+
When a setting is not of the type its annotation names.
|
|
42
|
+
InvalidColumnNameError
|
|
43
|
+
When ``name`` is empty.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> import numdaplot as ndp
|
|
48
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
49
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
50
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
51
|
+
>>> taxed_prices = sales.column("price") * 1.2
|
|
52
|
+
>>> sales.add_column(ndp.NewColumn(name="taxed_price", values=taxed_prices))
|
|
53
|
+
city price taxed_price
|
|
54
|
+
TEXT FLOAT64 FLOAT64
|
|
55
|
+
0 Paris 120.0 144.0
|
|
56
|
+
1 Lyon 80.0 96.0
|
|
57
|
+
2 Paris 150.0 180.0
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
name: str
|
|
61
|
+
values: Array
|
|
62
|
+
on_conflict: Conflict = Conflict.ERROR
|
|
63
|
+
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
"""
|
|
66
|
+
Check that the name is a non-empty text.
|
|
67
|
+
|
|
68
|
+
.. versionadded:: 0.1.0
|
|
69
|
+
|
|
70
|
+
Raises
|
|
71
|
+
------
|
|
72
|
+
InvalidTypeError
|
|
73
|
+
When a setting is not of the type its annotation names.
|
|
74
|
+
InvalidColumnNameError
|
|
75
|
+
When ``name`` is empty.
|
|
76
|
+
"""
|
|
77
|
+
require_field_types(self)
|
|
78
|
+
|
|
79
|
+
require_column_name(self.name)
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion of Table columns to number types.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
import pandas
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.data_types.numpy_mapping import to_numpy_dtype
|
|
14
|
+
from numdaplot.data_types.type import Type
|
|
15
|
+
from numdaplot.errors.value_conversion_error import ValueConversionError
|
|
16
|
+
from numdaplot.tables.frames.column import Column
|
|
17
|
+
from numdaplot.tables.frames.column_values import (
|
|
18
|
+
build_column_with_missing,
|
|
19
|
+
find_column_missing,
|
|
20
|
+
find_column_type,
|
|
21
|
+
read_present_values,
|
|
22
|
+
)
|
|
23
|
+
from numdaplot.tables.frames.pandas_decimals import restore_exact_decimals
|
|
24
|
+
|
|
25
|
+
DECIMAL_KIND = "f"
|
|
26
|
+
FAILED_PARSE = "coerce"
|
|
27
|
+
PYTHON_OBJECT_DTYPE = numpy.dtype(object)
|
|
28
|
+
IGNORED_FLOAT_ERROR = "ignore"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def convert_numbers(column: Column, target_type: Type) -> Column:
|
|
32
|
+
"""
|
|
33
|
+
Return a number column converted to another number type.
|
|
34
|
+
|
|
35
|
+
.. versionadded:: 0.1.0
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
column
|
|
40
|
+
A number column.
|
|
41
|
+
target_type
|
|
42
|
+
The new number type.
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
Column
|
|
47
|
+
The converted column. Decimals may be rounded to the precision of a smaller decimal type.
|
|
48
|
+
|
|
49
|
+
Raises
|
|
50
|
+
------
|
|
51
|
+
ValueConversionError
|
|
52
|
+
When a value does not fit: a decimal with a fractional part converted to an integer,
|
|
53
|
+
or a number out of the range of the new type.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import pandas
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> from numdaplot.tables.columns.number_conversion import convert_numbers
|
|
60
|
+
>>> convert_numbers(pandas.Series([2.0, None]), ndp.Type.INT64).tolist()
|
|
61
|
+
[2, <NA>]
|
|
62
|
+
"""
|
|
63
|
+
source_type = find_column_type(column)
|
|
64
|
+
missing = find_column_missing(column)
|
|
65
|
+
present_values = read_present_values(column)
|
|
66
|
+
converted_values = store_numbers(present_values, target_type)
|
|
67
|
+
require_no_lost_value(present_values, converted_values, source_type, target_type)
|
|
68
|
+
converted_column = build_column_with_missing(converted_values, missing)
|
|
69
|
+
|
|
70
|
+
return converted_column
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def parse_numbers(column: Column, target_type: Type) -> Column:
|
|
74
|
+
"""
|
|
75
|
+
Return a text or category column read as numbers.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
column
|
|
82
|
+
A text or category column.
|
|
83
|
+
target_type
|
|
84
|
+
The number type to read the texts as.
|
|
85
|
+
|
|
86
|
+
Returns
|
|
87
|
+
-------
|
|
88
|
+
Column
|
|
89
|
+
The numbers, missing values staying missing.
|
|
90
|
+
|
|
91
|
+
Raises
|
|
92
|
+
------
|
|
93
|
+
ValueConversionError
|
|
94
|
+
At the first text that is not a number, or whose number does not fit the type.
|
|
95
|
+
|
|
96
|
+
Examples
|
|
97
|
+
--------
|
|
98
|
+
>>> import pandas
|
|
99
|
+
>>> import numdaplot as ndp
|
|
100
|
+
>>> from numdaplot.tables.columns.number_conversion import parse_numbers
|
|
101
|
+
>>> parse_numbers(pandas.Series(["2.5", "1e3"], dtype="string"), ndp.Type.FLOAT64).tolist()
|
|
102
|
+
[2.5, 1000.0]
|
|
103
|
+
"""
|
|
104
|
+
source_type = find_column_type(column)
|
|
105
|
+
missing = find_column_missing(column)
|
|
106
|
+
texts = read_present_values(column)
|
|
107
|
+
object_texts = texts.astype(PYTHON_OBJECT_DTYPE)
|
|
108
|
+
parsed_values = pandas.to_numeric(object_texts, errors=FAILED_PARSE)
|
|
109
|
+
read_numbers = numpy.asarray(parsed_values)
|
|
110
|
+
failed = numpy.zeros(texts.shape, dtype=numpy.bool_)
|
|
111
|
+
if read_numbers.dtype.kind == DECIMAL_KIND:
|
|
112
|
+
failed = numpy.isnan(read_numbers)
|
|
113
|
+
|
|
114
|
+
require_no_failed_value(texts, failed, source_type, target_type)
|
|
115
|
+
numbers = restore_exact_decimals(object_texts, read_numbers)
|
|
116
|
+
converted_values = store_numbers(numbers, target_type)
|
|
117
|
+
lost = find_lost_values(numbers, converted_values)
|
|
118
|
+
require_no_failed_value(texts, lost, source_type, target_type)
|
|
119
|
+
parsed_column = build_column_with_missing(converted_values, missing)
|
|
120
|
+
|
|
121
|
+
return parsed_column
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def store_numbers(values: NDArray[Any], target_type: Type) -> NDArray[Any]:
|
|
125
|
+
"""
|
|
126
|
+
Return numbers stored in a number type, even when some do not fit.
|
|
127
|
+
|
|
128
|
+
.. versionadded:: 0.1.0
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
values
|
|
133
|
+
Numbers in a numpy dtype.
|
|
134
|
+
target_type
|
|
135
|
+
The number type to store them as.
|
|
136
|
+
|
|
137
|
+
Returns
|
|
138
|
+
-------
|
|
139
|
+
NDArray
|
|
140
|
+
The stored numbers; check them with ``find_lost_values``.
|
|
141
|
+
|
|
142
|
+
Examples
|
|
143
|
+
--------
|
|
144
|
+
>>> import numpy
|
|
145
|
+
>>> import numdaplot as ndp
|
|
146
|
+
>>> from numdaplot.tables.columns.number_conversion import store_numbers
|
|
147
|
+
>>> store_numbers(numpy.array([2.0]), ndp.Type.INT8)
|
|
148
|
+
array([2], dtype=int8)
|
|
149
|
+
"""
|
|
150
|
+
target_dtype = to_numpy_dtype(target_type)
|
|
151
|
+
with numpy.errstate(invalid=IGNORED_FLOAT_ERROR, over=IGNORED_FLOAT_ERROR):
|
|
152
|
+
stored_values = values.astype(target_dtype)
|
|
153
|
+
|
|
154
|
+
return stored_values
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def find_lost_values(values: NDArray[Any], stored_values: NDArray[Any]) -> NDArray[numpy.bool_]:
|
|
158
|
+
"""
|
|
159
|
+
Return which numbers changed when stored in another number type, beyond the rounding of decimals.
|
|
160
|
+
|
|
161
|
+
.. versionadded:: 0.1.0
|
|
162
|
+
|
|
163
|
+
Parameters
|
|
164
|
+
----------
|
|
165
|
+
values
|
|
166
|
+
The original numbers.
|
|
167
|
+
stored_values
|
|
168
|
+
The same numbers stored in another type.
|
|
169
|
+
|
|
170
|
+
Returns
|
|
171
|
+
-------
|
|
172
|
+
NDArray[numpy.bool_]
|
|
173
|
+
For a decimal type, True where a finite number became infinite. For an integer type,
|
|
174
|
+
True where the stored number differs from the original one.
|
|
175
|
+
|
|
176
|
+
Examples
|
|
177
|
+
--------
|
|
178
|
+
>>> import numpy
|
|
179
|
+
>>> from numdaplot.tables.columns.number_conversion import find_lost_values
|
|
180
|
+
>>> find_lost_values(numpy.array([2.0, 2.5]), numpy.array([2, 2]))
|
|
181
|
+
array([False, True])
|
|
182
|
+
"""
|
|
183
|
+
if stored_values.dtype.kind == DECIMAL_KIND:
|
|
184
|
+
finite = numpy.isfinite(values)
|
|
185
|
+
infinite = numpy.isinf(stored_values)
|
|
186
|
+
overflowed = finite & infinite
|
|
187
|
+
return overflowed
|
|
188
|
+
|
|
189
|
+
with numpy.errstate(invalid=IGNORED_FLOAT_ERROR, over=IGNORED_FLOAT_ERROR):
|
|
190
|
+
restored_values = stored_values.astype(values.dtype)
|
|
191
|
+
|
|
192
|
+
changed = restored_values != values
|
|
193
|
+
|
|
194
|
+
return changed
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def require_no_lost_value(
|
|
198
|
+
values: NDArray[Any], stored_values: NDArray[Any], source_type: Type, target_type: Type
|
|
199
|
+
) -> None:
|
|
200
|
+
"""
|
|
201
|
+
Check that numbers kept their value when stored in another number type.
|
|
202
|
+
|
|
203
|
+
.. versionadded:: 0.1.0
|
|
204
|
+
|
|
205
|
+
Parameters
|
|
206
|
+
----------
|
|
207
|
+
values
|
|
208
|
+
The original numbers.
|
|
209
|
+
stored_values
|
|
210
|
+
The same numbers stored in the new type.
|
|
211
|
+
source_type
|
|
212
|
+
The type of the original numbers.
|
|
213
|
+
target_type
|
|
214
|
+
The new type.
|
|
215
|
+
|
|
216
|
+
Raises
|
|
217
|
+
------
|
|
218
|
+
ValueConversionError
|
|
219
|
+
At the first number that changed.
|
|
220
|
+
|
|
221
|
+
Examples
|
|
222
|
+
--------
|
|
223
|
+
>>> import numpy
|
|
224
|
+
>>> import numdaplot as ndp
|
|
225
|
+
>>> from numdaplot.tables.columns.number_conversion import require_no_lost_value
|
|
226
|
+
>>> try:
|
|
227
|
+
... require_no_lost_value(numpy.array([2.0, 2.5]), numpy.array([2, 2]), ndp.Type.FLOAT64, ndp.Type.INT64)
|
|
228
|
+
... except ndp.ValueConversionError as error:
|
|
229
|
+
... print(error)
|
|
230
|
+
Cannot store the FLOAT64 value 2.5 as INT64 without losing information.
|
|
231
|
+
"""
|
|
232
|
+
lost = find_lost_values(values, stored_values)
|
|
233
|
+
require_no_failed_value(values, lost, source_type, target_type)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def require_no_failed_value(
|
|
237
|
+
values: NDArray[Any], failed: NDArray[numpy.bool_], source_type: Type, target_type: Type
|
|
238
|
+
) -> None:
|
|
239
|
+
"""
|
|
240
|
+
Check that no value failed its conversion.
|
|
241
|
+
|
|
242
|
+
.. versionadded:: 0.1.0
|
|
243
|
+
|
|
244
|
+
Parameters
|
|
245
|
+
----------
|
|
246
|
+
values
|
|
247
|
+
The original values, texts or numbers.
|
|
248
|
+
failed
|
|
249
|
+
True at each value that failed.
|
|
250
|
+
source_type
|
|
251
|
+
The type of the original values.
|
|
252
|
+
target_type
|
|
253
|
+
The new type.
|
|
254
|
+
|
|
255
|
+
Raises
|
|
256
|
+
------
|
|
257
|
+
ValueConversionError
|
|
258
|
+
At the first failed value, which the message shows.
|
|
259
|
+
|
|
260
|
+
Examples
|
|
261
|
+
--------
|
|
262
|
+
>>> import numpy
|
|
263
|
+
>>> import numdaplot as ndp
|
|
264
|
+
>>> from numdaplot.tables.columns.number_conversion import require_no_failed_value
|
|
265
|
+
>>> texts = numpy.array(["12", "abc"])
|
|
266
|
+
>>> failed = numpy.array([False, True])
|
|
267
|
+
>>> try:
|
|
268
|
+
... require_no_failed_value(texts, failed, ndp.Type.TEXT, ndp.Type.INT64)
|
|
269
|
+
... except ndp.ValueConversionError as error:
|
|
270
|
+
... print(error)
|
|
271
|
+
Cannot store the TEXT value 'abc' as INT64 without losing information.
|
|
272
|
+
"""
|
|
273
|
+
has_failure = bool(failed.any())
|
|
274
|
+
if not has_failure:
|
|
275
|
+
return
|
|
276
|
+
|
|
277
|
+
failed_values = values[failed]
|
|
278
|
+
raw_values = failed_values.tolist()
|
|
279
|
+
python_values = cast(list[Any], raw_values)
|
|
280
|
+
rejected_value = python_values[0]
|
|
281
|
+
raise ValueConversionError(source_type.name, target_type.name, rejected_value)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Renaming of the columns of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas
|
|
8
|
+
|
|
9
|
+
from numdaplot.tables.columns.column_names import require_known_columns, require_unique_names
|
|
10
|
+
from numdaplot.tables.columns.renaming import Renaming
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def rename_frame_columns(frame: pandas.DataFrame, renaming: Renaming) -> pandas.DataFrame:
|
|
14
|
+
"""
|
|
15
|
+
Return the columns of a Table with new names, every change applied at once.
|
|
16
|
+
|
|
17
|
+
Two columns can swap their names in a single renaming.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
frame
|
|
24
|
+
The columns of a Table.
|
|
25
|
+
renaming
|
|
26
|
+
The new names.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
pandas.DataFrame
|
|
31
|
+
The same columns, in the same order, renamed.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
ColumnNotFoundError
|
|
36
|
+
When a renamed column does not exist.
|
|
37
|
+
DuplicateColumnError
|
|
38
|
+
When a new name is the name of a column kept as it is.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import pandas
|
|
43
|
+
>>> import numdaplot as ndp
|
|
44
|
+
>>> from numdaplot.tables.columns.renamed_columns import rename_frame_columns
|
|
45
|
+
>>> frame = pandas.DataFrame({"low": [1.0], "high": [9.0]})
|
|
46
|
+
>>> swap = [ndp.NameChange(old_name="low", new_name="high"), ndp.NameChange(old_name="high", new_name="low")]
|
|
47
|
+
>>> rename_frame_columns(frame, ndp.Renaming(changes=swap))
|
|
48
|
+
high low
|
|
49
|
+
0 1.0 9.0
|
|
50
|
+
"""
|
|
51
|
+
column_names = [str(column_name) for column_name in frame.columns]
|
|
52
|
+
old_names = [change.old_name for change in renaming.changes]
|
|
53
|
+
require_known_columns(old_names, column_names)
|
|
54
|
+
new_names_by_old_name = {change.old_name: change.new_name for change in renaming.changes}
|
|
55
|
+
final_names = [new_names_by_old_name.get(column_name, column_name) for column_name in column_names]
|
|
56
|
+
require_unique_names(final_names)
|
|
57
|
+
renamed_frame = frame.copy(deep=False)
|
|
58
|
+
renamed_frame.columns = pandas.Index(final_names)
|
|
59
|
+
|
|
60
|
+
return renamed_frame
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The new names of columns of a Table, applied at once.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.empty_list_error import EmptyListError
|
|
10
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
from numdaplot.tables.columns.column_names import require_unique_names
|
|
12
|
+
from numdaplot.tables.columns.name_change import NameChange
|
|
13
|
+
|
|
14
|
+
CHANGE_ITEM_NAME = "name change"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Renaming:
|
|
19
|
+
"""
|
|
20
|
+
The new names of columns of a Table, applied at once, used by ``Table.rename``.
|
|
21
|
+
|
|
22
|
+
Two columns can swap their names in a single renaming.
|
|
23
|
+
|
|
24
|
+
.. versionadded:: 0.1.0
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
changes
|
|
29
|
+
The ``NameChange`` of each renamed column, at least one. The renaming keeps its own copy of the list.
|
|
30
|
+
|
|
31
|
+
Raises
|
|
32
|
+
------
|
|
33
|
+
InvalidTypeError
|
|
34
|
+
When a setting is not of the type its annotation names.
|
|
35
|
+
EmptyListError
|
|
36
|
+
When ``changes`` is an empty list.
|
|
37
|
+
DuplicateColumnError
|
|
38
|
+
When a column is renamed twice, or two columns receive the same new name.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> low = ndp.Array.from_list([1.0, 2.0])
|
|
44
|
+
>>> high = ndp.Array.from_list([9.0, 8.0])
|
|
45
|
+
>>> bounds = ndp.Table.from_arrays({"low": low, "high": high})
|
|
46
|
+
>>> swap = [ndp.NameChange(old_name="low", new_name="high"), ndp.NameChange(old_name="high", new_name="low")]
|
|
47
|
+
>>> bounds.rename(ndp.Renaming(changes=swap))
|
|
48
|
+
high low
|
|
49
|
+
FLOAT64 FLOAT64
|
|
50
|
+
0 1.0 9.0
|
|
51
|
+
1 2.0 8.0
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
changes: list[NameChange]
|
|
55
|
+
|
|
56
|
+
def __post_init__(self) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Check the list of changes and replace it with a copy that only the renaming holds.
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.1.0
|
|
61
|
+
|
|
62
|
+
Raises
|
|
63
|
+
------
|
|
64
|
+
InvalidTypeError
|
|
65
|
+
When a setting is not of the type its annotation names.
|
|
66
|
+
EmptyListError
|
|
67
|
+
When ``changes`` is an empty list.
|
|
68
|
+
DuplicateColumnError
|
|
69
|
+
When a column is renamed twice, or two columns receive the same new name.
|
|
70
|
+
"""
|
|
71
|
+
require_field_types(self)
|
|
72
|
+
|
|
73
|
+
if self.changes == []:
|
|
74
|
+
raise EmptyListError(CHANGE_ITEM_NAME)
|
|
75
|
+
|
|
76
|
+
old_names = [change.old_name for change in self.changes]
|
|
77
|
+
require_unique_names(old_names)
|
|
78
|
+
new_names = [change.new_name for change in self.changes]
|
|
79
|
+
require_unique_names(new_names)
|
|
80
|
+
changes_copy = list(self.changes)
|
|
81
|
+
object.__setattr__(self, "changes", changes_copy)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion of text columns to booleans.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
|
|
9
|
+
from numdaplot.data_types.type import Type
|
|
10
|
+
from numdaplot.errors.value_conversion_error import ValueConversionError
|
|
11
|
+
from numdaplot.tables.frames.column import Column
|
|
12
|
+
from numdaplot.tables.frames.column_values import (
|
|
13
|
+
build_column_with_missing,
|
|
14
|
+
find_column_missing,
|
|
15
|
+
find_column_type,
|
|
16
|
+
read_present_values,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
TRUE_TEXT = "true"
|
|
20
|
+
FALSE_TEXT = "false"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def parse_booleans(column: Column) -> Column:
|
|
24
|
+
"""
|
|
25
|
+
Return a text or category column read as booleans.
|
|
26
|
+
|
|
27
|
+
``"true"`` and ``"false"`` are accepted whatever their case and the spaces around them.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
column
|
|
34
|
+
A text or category column.
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
Column
|
|
39
|
+
A ``BOOL`` column, missing values staying missing.
|
|
40
|
+
|
|
41
|
+
Raises
|
|
42
|
+
------
|
|
43
|
+
ValueConversionError
|
|
44
|
+
At the first text that is neither ``"true"`` nor ``"false"``.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import pandas
|
|
49
|
+
>>> from numdaplot.tables.columns.text_conversion import parse_booleans
|
|
50
|
+
>>> parse_booleans(pandas.Series(["True", " false ", None], dtype="string")).tolist()
|
|
51
|
+
[True, False, <NA>]
|
|
52
|
+
"""
|
|
53
|
+
source_type = find_column_type(column)
|
|
54
|
+
missing = find_column_missing(column)
|
|
55
|
+
texts = read_present_values(column)
|
|
56
|
+
stripped_texts = numpy.strings.strip(texts)
|
|
57
|
+
lowered_texts = numpy.strings.lower(stripped_texts)
|
|
58
|
+
is_true = lowered_texts == TRUE_TEXT
|
|
59
|
+
is_false = lowered_texts == FALSE_TEXT
|
|
60
|
+
is_known = is_true | is_false
|
|
61
|
+
is_unknown = ~is_known
|
|
62
|
+
has_unknown = bool(is_unknown.any())
|
|
63
|
+
if has_unknown:
|
|
64
|
+
unknown_texts = texts[is_unknown]
|
|
65
|
+
first_unknown_text = unknown_texts[0]
|
|
66
|
+
raise ValueConversionError(source_type.name, Type.BOOL.name, first_unknown_text)
|
|
67
|
+
|
|
68
|
+
boolean_column = build_column_with_missing(is_true, missing)
|
|
69
|
+
|
|
70
|
+
return boolean_column
|