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,669 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion of a Table column to another type.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas
|
|
8
|
+
|
|
9
|
+
from numdaplot.data_types.type import Type
|
|
10
|
+
from numdaplot.data_types.value_family import ValueFamily, find_family
|
|
11
|
+
from numdaplot.dates.custom_date_format import CustomDateFormat
|
|
12
|
+
from numdaplot.dates.date_format import DateFormat
|
|
13
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
14
|
+
from numdaplot.errors.invalid_conversion_error import InvalidConversionError
|
|
15
|
+
from numdaplot.errors.time_overflow_error import TimeOverflowError
|
|
16
|
+
from numdaplot.tables.columns.boolean_conversion import convert_booleans_to_numbers, convert_numbers_to_booleans
|
|
17
|
+
from numdaplot.tables.columns.boolean_rule import BooleanRule
|
|
18
|
+
from numdaplot.tables.columns.bracketed_column import cut_column
|
|
19
|
+
from numdaplot.tables.columns.brackets import Brackets
|
|
20
|
+
from numdaplot.tables.columns.conversion import Conversion
|
|
21
|
+
from numdaplot.tables.columns.date_conversion import (
|
|
22
|
+
convert_moments,
|
|
23
|
+
find_format_name,
|
|
24
|
+
has_date,
|
|
25
|
+
has_time,
|
|
26
|
+
parse_dates,
|
|
27
|
+
write_dates,
|
|
28
|
+
write_durations,
|
|
29
|
+
)
|
|
30
|
+
from numdaplot.tables.columns.number_conversion import convert_numbers, parse_numbers
|
|
31
|
+
from numdaplot.tables.columns.text_conversion import parse_booleans
|
|
32
|
+
from numdaplot.tables.columns.time_conversion import keep_time_of_day, parse_times, write_times
|
|
33
|
+
from numdaplot.tables.columns.time_zone_conversion import change_time_zone
|
|
34
|
+
from numdaplot.tables.frames.column import Column
|
|
35
|
+
from numdaplot.tables.frames.column_values import find_column_type
|
|
36
|
+
from numdaplot.tables.frames.frame_normalization import convert_to_type
|
|
37
|
+
|
|
38
|
+
CONVERT_OPERATION = "convert"
|
|
39
|
+
WRITABLE_FAMILIES = frozenset({ValueFamily.NUMBER, ValueFamily.BOOL, ValueFamily.TEXT})
|
|
40
|
+
WRITTEN_TYPES = frozenset({Type.TEXT, Type.CATEGORY})
|
|
41
|
+
FORMAT_SETTING = "format"
|
|
42
|
+
TIMEZONE_SETTING = "timezone"
|
|
43
|
+
BOOLEANS_SETTING = "booleans"
|
|
44
|
+
DEFAULT_BOOLEAN_RULE = BooleanRule.ZERO_ONE
|
|
45
|
+
NUMBERS_TO_NUMBERS = (ValueFamily.NUMBER, ValueFamily.NUMBER)
|
|
46
|
+
TEXTS_TO_NUMBERS = (ValueFamily.TEXT, ValueFamily.NUMBER)
|
|
47
|
+
TEXTS_TO_BOOLEANS = (ValueFamily.TEXT, ValueFamily.BOOL)
|
|
48
|
+
BOOLEANS_TO_NUMBERS = (ValueFamily.BOOL, ValueFamily.NUMBER)
|
|
49
|
+
NUMBERS_TO_BOOLEANS = (ValueFamily.NUMBER, ValueFamily.BOOL)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def convert_column(column: Column, conversion: Conversion) -> Column:
|
|
53
|
+
"""
|
|
54
|
+
Return a Table column converted to another type, missing values staying missing.
|
|
55
|
+
|
|
56
|
+
.. versionadded:: 0.1.0
|
|
57
|
+
|
|
58
|
+
Parameters
|
|
59
|
+
----------
|
|
60
|
+
column
|
|
61
|
+
A Table column.
|
|
62
|
+
conversion
|
|
63
|
+
The new type, and the date format, the time zone change or the rule reading numbers as booleans.
|
|
64
|
+
|
|
65
|
+
Returns
|
|
66
|
+
-------
|
|
67
|
+
Column
|
|
68
|
+
The converted column, or a copy when it already has the type. Numbers, booleans and categories
|
|
69
|
+
become texts as Python writes them, such as ``2.5`` or ``True``.
|
|
70
|
+
|
|
71
|
+
Raises
|
|
72
|
+
------
|
|
73
|
+
InvalidConversionError
|
|
74
|
+
When the format, the time zone change or the boolean rule does not apply to the conversion.
|
|
75
|
+
InvalidLimitsError
|
|
76
|
+
When brackets cut integers and a bracket between two limits holds no integer.
|
|
77
|
+
UnmatchedValueError
|
|
78
|
+
When a number is in no bracket and the brackets keep ``others=Unmatched.ERROR``.
|
|
79
|
+
IncompatibleTypesError
|
|
80
|
+
When the conversion is not accepted, such as a boolean to a date, or a number to a date.
|
|
81
|
+
ValueConversionError
|
|
82
|
+
When a value cannot be stored in the new type without losing information.
|
|
83
|
+
TimeOverflowError
|
|
84
|
+
When a date read or converted is outside what the new type can hold.
|
|
85
|
+
TimeZoneMismatchError
|
|
86
|
+
When the time zone change does not apply to whether the datetimes have a zone.
|
|
87
|
+
|
|
88
|
+
Examples
|
|
89
|
+
--------
|
|
90
|
+
>>> import pandas
|
|
91
|
+
>>> import numdaplot as ndp
|
|
92
|
+
>>> from numdaplot.tables.columns.converted_column import convert_column
|
|
93
|
+
>>> texts = pandas.Series(["1", None, "3"], dtype="string")
|
|
94
|
+
>>> convert_column(texts, ndp.Conversion(column="count", dtype=ndp.Type.INT64)).tolist()
|
|
95
|
+
[1, <NA>, 3]
|
|
96
|
+
"""
|
|
97
|
+
source_type = find_column_type(column)
|
|
98
|
+
require_conversion_settings(source_type, conversion)
|
|
99
|
+
if conversion.timezone is not None:
|
|
100
|
+
zone_column = change_time_zone(column, conversion.timezone)
|
|
101
|
+
return zone_column
|
|
102
|
+
|
|
103
|
+
if isinstance(conversion.format, Brackets):
|
|
104
|
+
bracketed_column = cut_column(column, conversion.format)
|
|
105
|
+
return bracketed_column
|
|
106
|
+
|
|
107
|
+
if source_type == conversion.dtype:
|
|
108
|
+
column_copy = column.copy()
|
|
109
|
+
return column_copy
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
time_column = convert_time_column(column, source_type, conversion.dtype, conversion.format)
|
|
113
|
+
except pandas.errors.OutOfBoundsDatetime as error:
|
|
114
|
+
raise TimeOverflowError(CONVERT_OPERATION, conversion.dtype.name) from error
|
|
115
|
+
|
|
116
|
+
if time_column is not None:
|
|
117
|
+
return time_column
|
|
118
|
+
|
|
119
|
+
plain_column = convert_plain_column(column, source_type, conversion)
|
|
120
|
+
|
|
121
|
+
return plain_column
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def require_conversion_settings(source_type: Type, conversion: Conversion) -> None:
|
|
125
|
+
"""
|
|
126
|
+
Check that the format, the time zone change and the boolean rule of a conversion apply to its types.
|
|
127
|
+
|
|
128
|
+
.. versionadded:: 0.1.0
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
source_type
|
|
133
|
+
The type of the converted column.
|
|
134
|
+
conversion
|
|
135
|
+
The new type and the settings.
|
|
136
|
+
|
|
137
|
+
Raises
|
|
138
|
+
------
|
|
139
|
+
InvalidConversionError
|
|
140
|
+
When a time zone change is given to another conversion than datetimes to datetimes, a format to another
|
|
141
|
+
conversion than texts to dates or dates to texts, a format with a time to dates, or a boolean rule to another
|
|
142
|
+
conversion than numbers to booleans.
|
|
143
|
+
|
|
144
|
+
Examples
|
|
145
|
+
--------
|
|
146
|
+
>>> import numdaplot as ndp
|
|
147
|
+
>>> from numdaplot.tables.columns.converted_column import require_conversion_settings
|
|
148
|
+
>>> day_and_time = ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.DAY_MONTH_YEAR_TIME)
|
|
149
|
+
>>> try:
|
|
150
|
+
... require_conversion_settings(ndp.Type.TEXT, day_and_time)
|
|
151
|
+
... except ndp.InvalidConversionError as error:
|
|
152
|
+
... print(error)
|
|
153
|
+
The format DAY_MONTH_YEAR_TIME has a time, which DATE cannot hold.
|
|
154
|
+
Convert the column to DATETIME first, then to DATE.
|
|
155
|
+
"""
|
|
156
|
+
require_time_zone_setting(source_type, conversion)
|
|
157
|
+
require_format_setting(source_type, conversion)
|
|
158
|
+
require_booleans_setting(source_type, conversion)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def require_time_zone_setting(source_type: Type, conversion: Conversion) -> None:
|
|
162
|
+
"""
|
|
163
|
+
Check that a time zone change, when given, is given to a conversion of datetimes to datetimes.
|
|
164
|
+
|
|
165
|
+
.. versionadded:: 0.1.0
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
source_type
|
|
170
|
+
The type of the converted column.
|
|
171
|
+
conversion
|
|
172
|
+
The new type and the settings.
|
|
173
|
+
|
|
174
|
+
Raises
|
|
175
|
+
------
|
|
176
|
+
InvalidConversionError
|
|
177
|
+
When a time zone change is given to another conversion.
|
|
178
|
+
|
|
179
|
+
Examples
|
|
180
|
+
--------
|
|
181
|
+
>>> import numdaplot as ndp
|
|
182
|
+
>>> from numdaplot.tables.columns.converted_column import require_time_zone_setting
|
|
183
|
+
>>> to_paris = ndp.TimeZoneChange(zone=ndp.TimeZone("Europe/Paris"), mode=ndp.TimeZoneMode.ATTRIBUTE)
|
|
184
|
+
>>> zone_change = ndp.Conversion(column="day", dtype=ndp.Type.DATETIME, timezone=to_paris)
|
|
185
|
+
>>> try:
|
|
186
|
+
... require_time_zone_setting(ndp.Type.TEXT, zone_change)
|
|
187
|
+
... except ndp.InvalidConversionError as error:
|
|
188
|
+
... print(error)
|
|
189
|
+
The setting timezone does not apply to a conversion from TEXT to DATETIME.
|
|
190
|
+
"""
|
|
191
|
+
if conversion.timezone is None:
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
target_type = conversion.dtype
|
|
195
|
+
changes_datetimes = source_type == Type.DATETIME and target_type == Type.DATETIME
|
|
196
|
+
if not changes_datetimes:
|
|
197
|
+
raise InvalidConversionError(TIMEZONE_SETTING, source_type.name, target_type.name)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
def require_format_setting(source_type: Type, conversion: Conversion) -> None:
|
|
201
|
+
"""
|
|
202
|
+
Check that a date format, when given, is given to a conversion of texts to dates or of dates to texts.
|
|
203
|
+
|
|
204
|
+
.. versionadded:: 0.1.0
|
|
205
|
+
|
|
206
|
+
Parameters
|
|
207
|
+
----------
|
|
208
|
+
source_type
|
|
209
|
+
The type of the converted column.
|
|
210
|
+
conversion
|
|
211
|
+
The new type and the settings.
|
|
212
|
+
|
|
213
|
+
Raises
|
|
214
|
+
------
|
|
215
|
+
InvalidConversionError
|
|
216
|
+
When a format is given to another conversion, or a format with a time to dates.
|
|
217
|
+
|
|
218
|
+
Examples
|
|
219
|
+
--------
|
|
220
|
+
>>> import numdaplot as ndp
|
|
221
|
+
>>> from numdaplot.tables.columns.converted_column import require_format_setting
|
|
222
|
+
>>> day_first = ndp.DateFormat.DAY_MONTH_YEAR
|
|
223
|
+
>>> price_texts = ndp.Conversion(column="price", dtype=ndp.Type.TEXT, format=day_first)
|
|
224
|
+
>>> try:
|
|
225
|
+
... require_format_setting(ndp.Type.FLOAT64, price_texts)
|
|
226
|
+
... except ndp.InvalidConversionError as error:
|
|
227
|
+
... print(error)
|
|
228
|
+
The setting format does not apply to a conversion from FLOAT64 to TEXT.
|
|
229
|
+
"""
|
|
230
|
+
if conversion.format is None:
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
if isinstance(conversion.format, Brackets):
|
|
234
|
+
require_brackets_setting(source_type, conversion.dtype)
|
|
235
|
+
return
|
|
236
|
+
|
|
237
|
+
converts_times = Type.TIME in (source_type, conversion.dtype)
|
|
238
|
+
if converts_times:
|
|
239
|
+
require_time_format_setting(source_type, conversion.dtype, conversion.format)
|
|
240
|
+
return
|
|
241
|
+
|
|
242
|
+
target_type = conversion.dtype
|
|
243
|
+
source_family = find_family(source_type)
|
|
244
|
+
target_family = find_family(target_type)
|
|
245
|
+
reads_dates = source_family == ValueFamily.TEXT and target_family == ValueFamily.MOMENT
|
|
246
|
+
writes_dates = source_family == ValueFamily.MOMENT and target_type in WRITTEN_TYPES
|
|
247
|
+
date_type = source_type
|
|
248
|
+
if reads_dates:
|
|
249
|
+
date_type = target_type
|
|
250
|
+
|
|
251
|
+
format_has_time = has_time(conversion.format)
|
|
252
|
+
format_has_date = has_date(conversion.format)
|
|
253
|
+
misses_time = date_type == Type.DATE and format_has_time
|
|
254
|
+
uses_format = reads_dates or writes_dates
|
|
255
|
+
if not uses_format or not format_has_date:
|
|
256
|
+
raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
|
|
257
|
+
|
|
258
|
+
if misses_time:
|
|
259
|
+
format_name = find_format_name(target_type, conversion.format)
|
|
260
|
+
raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name, format_name)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def require_time_format_setting(
|
|
264
|
+
source_type: Type, target_type: Type, time_format: DateFormat | CustomDateFormat
|
|
265
|
+
) -> None:
|
|
266
|
+
"""
|
|
267
|
+
Check that a format given to a conversion of times of day reads or writes them, and holds no date.
|
|
268
|
+
|
|
269
|
+
.. versionadded:: 0.1.0
|
|
270
|
+
|
|
271
|
+
Parameters
|
|
272
|
+
----------
|
|
273
|
+
source_type
|
|
274
|
+
The type of the converted column.
|
|
275
|
+
target_type
|
|
276
|
+
The new type, ``TIME`` or the type a ``TIME`` column is converted to.
|
|
277
|
+
time_format
|
|
278
|
+
The format given.
|
|
279
|
+
|
|
280
|
+
Raises
|
|
281
|
+
------
|
|
282
|
+
InvalidConversionError
|
|
283
|
+
When the conversion neither reads texts as times nor writes times as texts, or the format holds a date.
|
|
284
|
+
|
|
285
|
+
Examples
|
|
286
|
+
--------
|
|
287
|
+
>>> import numdaplot as ndp
|
|
288
|
+
>>> from numdaplot.tables.columns.converted_column import require_time_format_setting
|
|
289
|
+
>>> try:
|
|
290
|
+
... require_time_format_setting(ndp.Type.TEXT, ndp.Type.TIME, ndp.DateFormat.DAY_MONTH_YEAR)
|
|
291
|
+
... except ndp.InvalidConversionError as error:
|
|
292
|
+
... print(error)
|
|
293
|
+
The format DAY_MONTH_YEAR has a date, which TIME cannot hold.
|
|
294
|
+
Give a CustomDateFormat of a time only, such as "%H:%M".
|
|
295
|
+
"""
|
|
296
|
+
source_family = find_family(source_type)
|
|
297
|
+
reads_times = source_family == ValueFamily.TEXT and target_type == Type.TIME
|
|
298
|
+
writes_times = source_type == Type.TIME and target_type in WRITTEN_TYPES
|
|
299
|
+
uses_format = reads_times or writes_times
|
|
300
|
+
if not uses_format:
|
|
301
|
+
raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
|
|
302
|
+
|
|
303
|
+
format_has_date = has_date(time_format)
|
|
304
|
+
if format_has_date:
|
|
305
|
+
format_name = find_format_name(target_type, time_format)
|
|
306
|
+
raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name, format_name)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def require_brackets_setting(source_type: Type, target_type: Type) -> None:
|
|
310
|
+
"""
|
|
311
|
+
Check that brackets are given to a conversion of numbers to categories.
|
|
312
|
+
|
|
313
|
+
.. versionadded:: 0.1.0
|
|
314
|
+
|
|
315
|
+
Parameters
|
|
316
|
+
----------
|
|
317
|
+
source_type
|
|
318
|
+
The type of the converted column.
|
|
319
|
+
target_type
|
|
320
|
+
The new type.
|
|
321
|
+
|
|
322
|
+
Raises
|
|
323
|
+
------
|
|
324
|
+
InvalidConversionError
|
|
325
|
+
When the column does not hold numbers, or the new type is not ``CATEGORY``.
|
|
326
|
+
|
|
327
|
+
Examples
|
|
328
|
+
--------
|
|
329
|
+
>>> import numdaplot as ndp
|
|
330
|
+
>>> from numdaplot.tables.columns.converted_column import require_brackets_setting
|
|
331
|
+
>>> try:
|
|
332
|
+
... require_brackets_setting(ndp.Type.TEXT, ndp.Type.CATEGORY)
|
|
333
|
+
... except ndp.InvalidConversionError as error:
|
|
334
|
+
... print(error)
|
|
335
|
+
The setting format does not apply to a conversion from TEXT to CATEGORY.
|
|
336
|
+
"""
|
|
337
|
+
source_family = find_family(source_type)
|
|
338
|
+
cuts_numbers = source_family == ValueFamily.NUMBER and target_type == Type.CATEGORY
|
|
339
|
+
if not cuts_numbers:
|
|
340
|
+
raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
def require_booleans_setting(source_type: Type, conversion: Conversion) -> None:
|
|
344
|
+
"""
|
|
345
|
+
Check that a boolean rule, when given, is given to a conversion of numbers to booleans.
|
|
346
|
+
|
|
347
|
+
.. versionadded:: 0.1.0
|
|
348
|
+
|
|
349
|
+
Parameters
|
|
350
|
+
----------
|
|
351
|
+
source_type
|
|
352
|
+
The type of the converted column.
|
|
353
|
+
conversion
|
|
354
|
+
The new type and the settings.
|
|
355
|
+
|
|
356
|
+
Raises
|
|
357
|
+
------
|
|
358
|
+
InvalidConversionError
|
|
359
|
+
When a boolean rule is given to another conversion.
|
|
360
|
+
|
|
361
|
+
Examples
|
|
362
|
+
--------
|
|
363
|
+
>>> import numdaplot as ndp
|
|
364
|
+
>>> from numdaplot.tables.columns.converted_column import require_booleans_setting
|
|
365
|
+
>>> rule = ndp.BooleanRule.NONZERO_TRUE
|
|
366
|
+
>>> try:
|
|
367
|
+
... require_booleans_setting(ndp.Type.TEXT, ndp.Conversion(column="paid", dtype=ndp.Type.BOOL, booleans=rule))
|
|
368
|
+
... except ndp.InvalidConversionError as error:
|
|
369
|
+
... print(error)
|
|
370
|
+
The setting booleans does not apply to a conversion from TEXT to BOOL.
|
|
371
|
+
"""
|
|
372
|
+
if conversion.booleans is None:
|
|
373
|
+
return
|
|
374
|
+
|
|
375
|
+
target_type = conversion.dtype
|
|
376
|
+
source_family = find_family(source_type)
|
|
377
|
+
reads_numbers = source_family == ValueFamily.NUMBER and target_type == Type.BOOL
|
|
378
|
+
if not reads_numbers:
|
|
379
|
+
raise InvalidConversionError(BOOLEANS_SETTING, source_type.name, target_type.name)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def convert_time_column(
|
|
383
|
+
column: Column, source_type: Type, target_type: Type, date_format: DateFormat | CustomDateFormat | None
|
|
384
|
+
) -> Column | None:
|
|
385
|
+
"""
|
|
386
|
+
Return a column converted between texts, dates, datetimes and durations.
|
|
387
|
+
|
|
388
|
+
.. versionadded:: 0.1.0
|
|
389
|
+
|
|
390
|
+
Parameters
|
|
391
|
+
----------
|
|
392
|
+
column
|
|
393
|
+
A Table column of another type than the target.
|
|
394
|
+
source_type
|
|
395
|
+
The type of the column.
|
|
396
|
+
target_type
|
|
397
|
+
The new type.
|
|
398
|
+
date_format
|
|
399
|
+
How dates are written as texts, the default format when None.
|
|
400
|
+
|
|
401
|
+
Returns
|
|
402
|
+
-------
|
|
403
|
+
Column or None
|
|
404
|
+
The converted column, or ``None`` when the conversion involves no date, datetime or duration.
|
|
405
|
+
|
|
406
|
+
Raises
|
|
407
|
+
------
|
|
408
|
+
ValueConversionError
|
|
409
|
+
At the first text that is not a date in the format.
|
|
410
|
+
TimeOverflowError
|
|
411
|
+
When a text holds a real date that the version of pandas in use cannot read.
|
|
412
|
+
OutOfBoundsDatetime
|
|
413
|
+
When pandas cannot store a date as ``DATETIME``, outside the range of nanoseconds.
|
|
414
|
+
|
|
415
|
+
Examples
|
|
416
|
+
--------
|
|
417
|
+
>>> import pandas
|
|
418
|
+
>>> import numdaplot as ndp
|
|
419
|
+
>>> from numdaplot.tables.columns.converted_column import convert_time_column
|
|
420
|
+
>>> texts = pandas.Series(["2026-12-31"], dtype="string")
|
|
421
|
+
>>> convert_time_column(texts, ndp.Type.TEXT, ndp.Type.DATE, None).tolist()
|
|
422
|
+
[Timestamp('2026-12-31 00:00:00')]
|
|
423
|
+
"""
|
|
424
|
+
converts_times = Type.TIME in (source_type, target_type)
|
|
425
|
+
if converts_times:
|
|
426
|
+
time_column = convert_times(column, source_type, target_type, date_format)
|
|
427
|
+
return time_column
|
|
428
|
+
|
|
429
|
+
source_family = find_family(source_type)
|
|
430
|
+
target_family = find_family(target_type)
|
|
431
|
+
if source_family == ValueFamily.TEXT and target_family == ValueFamily.MOMENT:
|
|
432
|
+
dates = parse_dates(column, target_type, date_format)
|
|
433
|
+
return dates
|
|
434
|
+
|
|
435
|
+
if source_family == ValueFamily.MOMENT and target_family == ValueFamily.MOMENT:
|
|
436
|
+
moments = convert_moments(column, target_type)
|
|
437
|
+
return moments
|
|
438
|
+
|
|
439
|
+
is_written = target_type in WRITTEN_TYPES
|
|
440
|
+
if not is_written:
|
|
441
|
+
return None
|
|
442
|
+
|
|
443
|
+
if source_family == ValueFamily.MOMENT:
|
|
444
|
+
date_texts = write_dates(column, date_format)
|
|
445
|
+
written_dates = convert_to_type(date_texts, target_type)
|
|
446
|
+
return written_dates
|
|
447
|
+
|
|
448
|
+
if source_family == ValueFamily.DURATION:
|
|
449
|
+
duration_texts = write_durations(column)
|
|
450
|
+
written_durations = convert_to_type(duration_texts, target_type)
|
|
451
|
+
return written_durations
|
|
452
|
+
|
|
453
|
+
return None
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
def convert_times(
|
|
457
|
+
column: Column, source_type: Type, target_type: Type, time_format: DateFormat | CustomDateFormat | None
|
|
458
|
+
) -> Column | None:
|
|
459
|
+
"""
|
|
460
|
+
Return a column converted from texts or datetimes to times of day, or from times of day to texts or categories.
|
|
461
|
+
|
|
462
|
+
.. versionadded:: 0.1.0
|
|
463
|
+
|
|
464
|
+
Parameters
|
|
465
|
+
----------
|
|
466
|
+
column
|
|
467
|
+
A Table column of another type than the target, one of the two types being ``TIME``.
|
|
468
|
+
source_type
|
|
469
|
+
The type of the column.
|
|
470
|
+
target_type
|
|
471
|
+
The new type.
|
|
472
|
+
time_format
|
|
473
|
+
A pattern of a time without date, already checked, or None for the default format.
|
|
474
|
+
|
|
475
|
+
Returns
|
|
476
|
+
-------
|
|
477
|
+
Column or None
|
|
478
|
+
The converted column, or ``None`` for a conversion of times of day that is not accepted.
|
|
479
|
+
|
|
480
|
+
Raises
|
|
481
|
+
------
|
|
482
|
+
ValueConversionError
|
|
483
|
+
At the first text that is not a time in the format.
|
|
484
|
+
|
|
485
|
+
Examples
|
|
486
|
+
--------
|
|
487
|
+
>>> import pandas
|
|
488
|
+
>>> import numdaplot as ndp
|
|
489
|
+
>>> from numdaplot.tables.columns.converted_column import convert_times
|
|
490
|
+
>>> moments = pandas.Series(pandas.to_datetime(["2026-03-14 15:35"]))
|
|
491
|
+
>>> convert_times(moments, ndp.Type.DATETIME, ndp.Type.TIME, None).tolist()
|
|
492
|
+
[Timedelta('0 days 15:35:00')]
|
|
493
|
+
"""
|
|
494
|
+
custom_format = time_format if isinstance(time_format, CustomDateFormat) else None
|
|
495
|
+
source_family = find_family(source_type)
|
|
496
|
+
if source_family == ValueFamily.TEXT and target_type == Type.TIME:
|
|
497
|
+
read_times = parse_times(column, custom_format)
|
|
498
|
+
return read_times
|
|
499
|
+
|
|
500
|
+
if source_type == Type.DATETIME and target_type == Type.TIME:
|
|
501
|
+
day_times = keep_time_of_day(column)
|
|
502
|
+
return day_times
|
|
503
|
+
|
|
504
|
+
if source_type == Type.TIME and target_type in WRITTEN_TYPES:
|
|
505
|
+
time_texts = write_times(column, custom_format)
|
|
506
|
+
written_times = convert_to_type(time_texts, target_type)
|
|
507
|
+
return written_times
|
|
508
|
+
|
|
509
|
+
return None
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
def convert_plain_column(column: Column, source_type: Type, conversion: Conversion) -> Column:
|
|
513
|
+
"""
|
|
514
|
+
Return a column converted between numbers, booleans, texts and categories.
|
|
515
|
+
|
|
516
|
+
.. versionadded:: 0.1.0
|
|
517
|
+
|
|
518
|
+
Parameters
|
|
519
|
+
----------
|
|
520
|
+
column
|
|
521
|
+
A Table column of another type than the target.
|
|
522
|
+
source_type
|
|
523
|
+
The type of the column.
|
|
524
|
+
conversion
|
|
525
|
+
The new type and the rule reading numbers as booleans.
|
|
526
|
+
|
|
527
|
+
Returns
|
|
528
|
+
-------
|
|
529
|
+
Column
|
|
530
|
+
The converted column.
|
|
531
|
+
|
|
532
|
+
Raises
|
|
533
|
+
------
|
|
534
|
+
IncompatibleTypesError
|
|
535
|
+
When the conversion is not accepted, such as a boolean to a date.
|
|
536
|
+
ValueConversionError
|
|
537
|
+
When a value cannot be stored in the new type without losing information.
|
|
538
|
+
|
|
539
|
+
Examples
|
|
540
|
+
--------
|
|
541
|
+
>>> import pandas
|
|
542
|
+
>>> import numdaplot as ndp
|
|
543
|
+
>>> from numdaplot.tables.columns.converted_column import convert_plain_column
|
|
544
|
+
>>> to_text = ndp.Conversion(column="price", dtype=ndp.Type.TEXT)
|
|
545
|
+
>>> convert_plain_column(pandas.Series([1.5]), ndp.Type.FLOAT64, to_text).tolist()
|
|
546
|
+
['1.5']
|
|
547
|
+
"""
|
|
548
|
+
target_type = conversion.dtype
|
|
549
|
+
if target_type in WRITTEN_TYPES:
|
|
550
|
+
written_column = write_plain_column(column, source_type, target_type)
|
|
551
|
+
return written_column
|
|
552
|
+
|
|
553
|
+
read_column = read_plain_column(column, source_type, conversion)
|
|
554
|
+
|
|
555
|
+
return read_column
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def write_plain_column(column: Column, source_type: Type, target_type: Type) -> Column:
|
|
559
|
+
"""
|
|
560
|
+
Return a column of numbers, booleans, texts or categories written as texts or categories.
|
|
561
|
+
|
|
562
|
+
.. versionadded:: 0.1.0
|
|
563
|
+
|
|
564
|
+
Parameters
|
|
565
|
+
----------
|
|
566
|
+
column
|
|
567
|
+
A Table column of another type than the target.
|
|
568
|
+
source_type
|
|
569
|
+
The type of the column.
|
|
570
|
+
target_type
|
|
571
|
+
``TEXT`` or ``CATEGORY``.
|
|
572
|
+
|
|
573
|
+
Returns
|
|
574
|
+
-------
|
|
575
|
+
Column
|
|
576
|
+
The column written as Python writes each value, such as ``2.5`` or ``True``.
|
|
577
|
+
|
|
578
|
+
Raises
|
|
579
|
+
------
|
|
580
|
+
IncompatibleTypesError
|
|
581
|
+
When the column holds other values than numbers, booleans, texts or categories.
|
|
582
|
+
|
|
583
|
+
Examples
|
|
584
|
+
--------
|
|
585
|
+
>>> import pandas
|
|
586
|
+
>>> import numdaplot as ndp
|
|
587
|
+
>>> from numdaplot.tables.columns.converted_column import write_plain_column
|
|
588
|
+
>>> write_plain_column(pandas.Series([True]), ndp.Type.BOOL, ndp.Type.CATEGORY).tolist()
|
|
589
|
+
['True']
|
|
590
|
+
"""
|
|
591
|
+
source_family = find_family(source_type)
|
|
592
|
+
if source_family not in WRITABLE_FAMILIES:
|
|
593
|
+
type_names = [source_type.name, target_type.name]
|
|
594
|
+
raise IncompatibleTypesError(CONVERT_OPERATION, type_names)
|
|
595
|
+
|
|
596
|
+
text_column = convert_to_type(column, Type.TEXT)
|
|
597
|
+
if target_type == Type.CATEGORY:
|
|
598
|
+
category_column = convert_to_type(text_column, Type.CATEGORY)
|
|
599
|
+
return category_column
|
|
600
|
+
|
|
601
|
+
return text_column
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
def read_plain_column(column: Column, source_type: Type, conversion: Conversion) -> Column:
|
|
605
|
+
"""
|
|
606
|
+
Return a column of numbers, booleans, texts or categories converted to numbers or booleans.
|
|
607
|
+
|
|
608
|
+
.. versionadded:: 0.1.0
|
|
609
|
+
|
|
610
|
+
Parameters
|
|
611
|
+
----------
|
|
612
|
+
column
|
|
613
|
+
A Table column of another type than the target.
|
|
614
|
+
source_type
|
|
615
|
+
The type of the column.
|
|
616
|
+
conversion
|
|
617
|
+
The new type, a number type or ``BOOL``, and the rule reading numbers as booleans.
|
|
618
|
+
|
|
619
|
+
Returns
|
|
620
|
+
-------
|
|
621
|
+
Column
|
|
622
|
+
The converted column.
|
|
623
|
+
|
|
624
|
+
Raises
|
|
625
|
+
------
|
|
626
|
+
IncompatibleTypesError
|
|
627
|
+
When the conversion is not accepted, such as a boolean to a date.
|
|
628
|
+
ValueConversionError
|
|
629
|
+
When a value cannot be stored in the new type without losing information.
|
|
630
|
+
|
|
631
|
+
Examples
|
|
632
|
+
--------
|
|
633
|
+
>>> import pandas
|
|
634
|
+
>>> import numdaplot as ndp
|
|
635
|
+
>>> from numdaplot.tables.columns.converted_column import read_plain_column
|
|
636
|
+
>>> to_integers = ndp.Conversion(column="paid", dtype=ndp.Type.INT64)
|
|
637
|
+
>>> read_plain_column(pandas.Series([True, False]), ndp.Type.BOOL, to_integers).tolist()
|
|
638
|
+
[1, 0]
|
|
639
|
+
"""
|
|
640
|
+
target_type = conversion.dtype
|
|
641
|
+
source_family = find_family(source_type)
|
|
642
|
+
target_family = find_family(target_type)
|
|
643
|
+
family_pair = (source_family, target_family)
|
|
644
|
+
if family_pair == NUMBERS_TO_NUMBERS:
|
|
645
|
+
number_column = convert_numbers(column, target_type)
|
|
646
|
+
return number_column
|
|
647
|
+
|
|
648
|
+
if family_pair == TEXTS_TO_NUMBERS:
|
|
649
|
+
parsed_column = parse_numbers(column, target_type)
|
|
650
|
+
return parsed_column
|
|
651
|
+
|
|
652
|
+
if family_pair == TEXTS_TO_BOOLEANS:
|
|
653
|
+
boolean_column = parse_booleans(column)
|
|
654
|
+
return boolean_column
|
|
655
|
+
|
|
656
|
+
if family_pair == BOOLEANS_TO_NUMBERS:
|
|
657
|
+
boolean_numbers = convert_booleans_to_numbers(column, target_type)
|
|
658
|
+
return boolean_numbers
|
|
659
|
+
|
|
660
|
+
if family_pair == NUMBERS_TO_BOOLEANS:
|
|
661
|
+
boolean_rule = conversion.booleans
|
|
662
|
+
if boolean_rule is None:
|
|
663
|
+
boolean_rule = DEFAULT_BOOLEAN_RULE
|
|
664
|
+
|
|
665
|
+
number_booleans = convert_numbers_to_booleans(column, boolean_rule)
|
|
666
|
+
return number_booleans
|
|
667
|
+
|
|
668
|
+
type_names = [source_type.name, target_type.name]
|
|
669
|
+
raise IncompatibleTypesError(CONVERT_OPERATION, type_names)
|