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,224 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Types of the values stored in an Array or in a Table column.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Type(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Type of the values stored in an Array or in a Table column.
|
|
13
|
+
|
|
14
|
+
Integers wrap around silently when a result exceeds their range, as in numpy:
|
|
15
|
+
with ``INT8``, ``127 + 1`` gives ``-128``. Prefer ``INT64`` unless memory matters.
|
|
16
|
+
|
|
17
|
+
.. versionadded:: 0.1.0
|
|
18
|
+
|
|
19
|
+
Examples
|
|
20
|
+
--------
|
|
21
|
+
>>> import numdaplot as ndp
|
|
22
|
+
>>> ndp.Array.from_list([1, 2], dtype=ndp.Type.FLOAT32)
|
|
23
|
+
Array([1., 2.], dtype=FLOAT32)
|
|
24
|
+
>>> ndp.Array.from_list([1.5, 2.0]).dtype
|
|
25
|
+
<Type.FLOAT64: 10>
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
INT8 = auto()
|
|
29
|
+
"""
|
|
30
|
+
Signed integer from -128 to 127, 1 byte per value.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT8)
|
|
36
|
+
Array([ 1, -2], dtype=INT8)
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
INT16 = auto()
|
|
40
|
+
"""
|
|
41
|
+
Signed integer from -32 768 to 32 767, 2 bytes per value.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT16)
|
|
47
|
+
Array([ 1, -2], dtype=INT16)
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
INT32 = auto()
|
|
51
|
+
"""
|
|
52
|
+
Signed integer of about +/- 2 billion, 4 bytes per value.
|
|
53
|
+
|
|
54
|
+
Examples
|
|
55
|
+
--------
|
|
56
|
+
>>> import numdaplot as ndp
|
|
57
|
+
>>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT32)
|
|
58
|
+
Array([ 1, -2], dtype=INT32)
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
INT64 = auto()
|
|
62
|
+
"""
|
|
63
|
+
Signed integer of about +/- 9.2 * 10**18, 8 bytes per value.
|
|
64
|
+
|
|
65
|
+
Examples
|
|
66
|
+
--------
|
|
67
|
+
>>> import numdaplot as ndp
|
|
68
|
+
>>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT64)
|
|
69
|
+
Array([ 1, -2], dtype=INT64)
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
UINT8 = auto()
|
|
73
|
+
"""
|
|
74
|
+
Unsigned integer from 0 to 255, 1 byte per value.
|
|
75
|
+
|
|
76
|
+
Examples
|
|
77
|
+
--------
|
|
78
|
+
>>> import numdaplot as ndp
|
|
79
|
+
>>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT8)
|
|
80
|
+
Array([1, 2], dtype=UINT8)
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
UINT16 = auto()
|
|
84
|
+
"""
|
|
85
|
+
Unsigned integer from 0 to 65 535, 2 bytes per value.
|
|
86
|
+
|
|
87
|
+
Examples
|
|
88
|
+
--------
|
|
89
|
+
>>> import numdaplot as ndp
|
|
90
|
+
>>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT16)
|
|
91
|
+
Array([1, 2], dtype=UINT16)
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
UINT32 = auto()
|
|
95
|
+
"""
|
|
96
|
+
Unsigned integer from 0 to about 4 billion, 4 bytes per value.
|
|
97
|
+
|
|
98
|
+
Examples
|
|
99
|
+
--------
|
|
100
|
+
>>> import numdaplot as ndp
|
|
101
|
+
>>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT32)
|
|
102
|
+
Array([1, 2], dtype=UINT32)
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
UINT64 = auto()
|
|
106
|
+
"""
|
|
107
|
+
Unsigned integer from 0 to about 1.8 * 10**19, 8 bytes per value.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> import numdaplot as ndp
|
|
112
|
+
>>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT64)
|
|
113
|
+
Array([1, 2], dtype=UINT64)
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
FLOAT32 = auto()
|
|
117
|
+
"""
|
|
118
|
+
Decimal number with about 7 significant digits, 4 bytes per value.
|
|
119
|
+
|
|
120
|
+
Examples
|
|
121
|
+
--------
|
|
122
|
+
>>> import numdaplot as ndp
|
|
123
|
+
>>> ndp.Array.from_list([1.5, 2.0], dtype=ndp.Type.FLOAT32)
|
|
124
|
+
Array([1.5, 2. ], dtype=FLOAT32)
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
FLOAT64 = auto()
|
|
128
|
+
"""
|
|
129
|
+
Decimal number with about 16 significant digits, 8 bytes per value. Default decimal type.
|
|
130
|
+
|
|
131
|
+
Examples
|
|
132
|
+
--------
|
|
133
|
+
>>> import numdaplot as ndp
|
|
134
|
+
>>> ndp.Array.from_list([1.5, None], dtype=ndp.Type.FLOAT64)
|
|
135
|
+
Array([1.5, nan], dtype=FLOAT64)
|
|
136
|
+
"""
|
|
137
|
+
|
|
138
|
+
BOOL = auto()
|
|
139
|
+
"""
|
|
140
|
+
True or false.
|
|
141
|
+
|
|
142
|
+
Examples
|
|
143
|
+
--------
|
|
144
|
+
>>> import numdaplot as ndp
|
|
145
|
+
>>> ndp.Array.from_list([True, False], dtype=ndp.Type.BOOL)
|
|
146
|
+
Array([ True, False], dtype=BOOL)
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
TEXT = auto()
|
|
150
|
+
"""
|
|
151
|
+
Text of any length.
|
|
152
|
+
|
|
153
|
+
Examples
|
|
154
|
+
--------
|
|
155
|
+
>>> import numdaplot as ndp
|
|
156
|
+
>>> ndp.Array.from_list(["Paris", "Lyon"], dtype=ndp.Type.TEXT)
|
|
157
|
+
Array(['Paris', 'Lyon'], dtype=TEXT)
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
CATEGORY = auto()
|
|
161
|
+
"""
|
|
162
|
+
Text taking a few repeated values, stored once per distinct value. Table columns only.
|
|
163
|
+
|
|
164
|
+
Examples
|
|
165
|
+
--------
|
|
166
|
+
>>> import numdaplot as ndp
|
|
167
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
168
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
169
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
170
|
+
>>> categories = sales.convert(ndp.Conversion(column="city", dtype=ndp.Type.CATEGORY))
|
|
171
|
+
>>> categories.column_types["city"]
|
|
172
|
+
<Type.CATEGORY: 13>
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
DATE = auto()
|
|
176
|
+
"""
|
|
177
|
+
A day, without time. Stored in days, but a calculation on it stays within 1677 to 2262, as ``DATETIME``.
|
|
178
|
+
|
|
179
|
+
Examples
|
|
180
|
+
--------
|
|
181
|
+
>>> from datetime import date
|
|
182
|
+
>>> import numdaplot as ndp
|
|
183
|
+
>>> ndp.Array.from_list([date(2026, 1, 31)]).dtype
|
|
184
|
+
<Type.DATE: 14>
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
DATETIME = auto()
|
|
188
|
+
"""
|
|
189
|
+
A day and a time, with or without time zone, from 1677 to 2262.
|
|
190
|
+
|
|
191
|
+
Examples
|
|
192
|
+
--------
|
|
193
|
+
>>> from datetime import datetime
|
|
194
|
+
>>> import numdaplot as ndp
|
|
195
|
+
>>> ndp.Array.from_list([datetime(2026, 1, 31, 8, 30)]).dtype
|
|
196
|
+
<Type.DATETIME: 15>
|
|
197
|
+
"""
|
|
198
|
+
|
|
199
|
+
DURATION = auto()
|
|
200
|
+
"""
|
|
201
|
+
A gap between two dates or datetimes, of about 292 years at most, before or after zero.
|
|
202
|
+
|
|
203
|
+
Examples
|
|
204
|
+
--------
|
|
205
|
+
>>> from datetime import timedelta
|
|
206
|
+
>>> import numdaplot as ndp
|
|
207
|
+
>>> ndp.Array.from_list([timedelta(hours=2)]).dtype
|
|
208
|
+
<Type.DURATION: 16>
|
|
209
|
+
"""
|
|
210
|
+
|
|
211
|
+
TIME = auto()
|
|
212
|
+
"""
|
|
213
|
+
A time of day, from 00:00 to 23:59:59.999999, without date nor time zone. Stored as the time since midnight.
|
|
214
|
+
|
|
215
|
+
Two times give a ``DURATION`` when subtracted, a duration moves a time within its day, and a time added to a
|
|
216
|
+
``DATE`` gives a ``DATETIME``. Its hour, minute and second are read with ``DatePart``.
|
|
217
|
+
|
|
218
|
+
Examples
|
|
219
|
+
--------
|
|
220
|
+
>>> from datetime import time
|
|
221
|
+
>>> import numdaplot as ndp
|
|
222
|
+
>>> ndp.Array.from_list([time(15, 35)]).dtype
|
|
223
|
+
<Type.TIME: 17>
|
|
224
|
+
"""
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Families of types whose values can be compared and combined together.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
from numdaplot.data_types.type import Type
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ValueFamily(Enum):
|
|
13
|
+
"""
|
|
14
|
+
Family of types whose values can be compared and combined together.
|
|
15
|
+
|
|
16
|
+
An ``INT64`` and a ``FLOAT64`` are both numbers, while a number and a text cannot be compared.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Examples
|
|
21
|
+
--------
|
|
22
|
+
>>> import numdaplot as ndp
|
|
23
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
24
|
+
>>> find_family(ndp.Type.UINT8) == find_family(ndp.Type.FLOAT64)
|
|
25
|
+
True
|
|
26
|
+
>>> find_family(ndp.Type.CATEGORY)
|
|
27
|
+
<ValueFamily.TEXT: 3>
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
NUMBER = auto()
|
|
31
|
+
"""
|
|
32
|
+
Signed and unsigned integers, and decimals.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
38
|
+
>>> find_family(ndp.Type.UINT8)
|
|
39
|
+
<ValueFamily.NUMBER: 1>
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
BOOL = auto()
|
|
43
|
+
"""
|
|
44
|
+
True or false.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
50
|
+
>>> find_family(ndp.Type.BOOL)
|
|
51
|
+
<ValueFamily.BOOL: 2>
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
TEXT = auto()
|
|
55
|
+
"""
|
|
56
|
+
Texts and categories.
|
|
57
|
+
|
|
58
|
+
Examples
|
|
59
|
+
--------
|
|
60
|
+
>>> import numdaplot as ndp
|
|
61
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
62
|
+
>>> find_family(ndp.Type.TEXT)
|
|
63
|
+
<ValueFamily.TEXT: 3>
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
MOMENT = auto()
|
|
67
|
+
"""
|
|
68
|
+
Dates and datetimes.
|
|
69
|
+
|
|
70
|
+
Examples
|
|
71
|
+
--------
|
|
72
|
+
>>> import numdaplot as ndp
|
|
73
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
74
|
+
>>> find_family(ndp.Type.DATE)
|
|
75
|
+
<ValueFamily.MOMENT: 4>
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
DURATION = auto()
|
|
79
|
+
"""
|
|
80
|
+
Gaps between two moments.
|
|
81
|
+
|
|
82
|
+
Examples
|
|
83
|
+
--------
|
|
84
|
+
>>> import numdaplot as ndp
|
|
85
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
86
|
+
>>> find_family(ndp.Type.DURATION)
|
|
87
|
+
<ValueFamily.DURATION: 5>
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
TIME = auto()
|
|
91
|
+
"""
|
|
92
|
+
Times of day, compared only with each other.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> import numdaplot as ndp
|
|
97
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
98
|
+
>>> find_family(ndp.Type.TIME)
|
|
99
|
+
<ValueFamily.TIME: 6>
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
FAMILIES_BY_TYPE = {
|
|
104
|
+
Type.INT8: ValueFamily.NUMBER,
|
|
105
|
+
Type.INT16: ValueFamily.NUMBER,
|
|
106
|
+
Type.INT32: ValueFamily.NUMBER,
|
|
107
|
+
Type.INT64: ValueFamily.NUMBER,
|
|
108
|
+
Type.UINT8: ValueFamily.NUMBER,
|
|
109
|
+
Type.UINT16: ValueFamily.NUMBER,
|
|
110
|
+
Type.UINT32: ValueFamily.NUMBER,
|
|
111
|
+
Type.UINT64: ValueFamily.NUMBER,
|
|
112
|
+
Type.FLOAT32: ValueFamily.NUMBER,
|
|
113
|
+
Type.FLOAT64: ValueFamily.NUMBER,
|
|
114
|
+
Type.BOOL: ValueFamily.BOOL,
|
|
115
|
+
Type.TEXT: ValueFamily.TEXT,
|
|
116
|
+
Type.CATEGORY: ValueFamily.TEXT,
|
|
117
|
+
Type.DATE: ValueFamily.MOMENT,
|
|
118
|
+
Type.DATETIME: ValueFamily.MOMENT,
|
|
119
|
+
Type.DURATION: ValueFamily.DURATION,
|
|
120
|
+
Type.TIME: ValueFamily.TIME,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def find_family(data_type: Type) -> ValueFamily:
|
|
125
|
+
"""
|
|
126
|
+
Return the family of a numdaplot type.
|
|
127
|
+
|
|
128
|
+
.. versionadded:: 0.1.0
|
|
129
|
+
|
|
130
|
+
Parameters
|
|
131
|
+
----------
|
|
132
|
+
data_type
|
|
133
|
+
The type to classify.
|
|
134
|
+
|
|
135
|
+
Returns
|
|
136
|
+
-------
|
|
137
|
+
ValueFamily
|
|
138
|
+
The family whose values can be compared with values of this type.
|
|
139
|
+
|
|
140
|
+
Examples
|
|
141
|
+
--------
|
|
142
|
+
>>> import numdaplot as ndp
|
|
143
|
+
>>> from numdaplot.data_types.value_family import find_family
|
|
144
|
+
>>> find_family(ndp.Type.DATETIME)
|
|
145
|
+
<ValueFamily.MOMENT: 4>
|
|
146
|
+
"""
|
|
147
|
+
family = FAMILIES_BY_TYPE[data_type]
|
|
148
|
+
|
|
149
|
+
return family
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Type of single Python values, and the common type of several values.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from datetime import date, datetime, time, timedelta
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.library import Library
|
|
12
|
+
from numdaplot.data_types.type import Type
|
|
13
|
+
from numdaplot.data_types.value_family import find_family
|
|
14
|
+
from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
|
|
15
|
+
from numdaplot.errors.time_zone_mismatch_error import TimeZoneMismatchError
|
|
16
|
+
from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
|
|
17
|
+
|
|
18
|
+
# bool comes before int and datetime before date, since each one is a subclass of the next.
|
|
19
|
+
PYTHON_TYPES = (
|
|
20
|
+
((bool, numpy.bool_), Type.BOOL),
|
|
21
|
+
((int, numpy.integer), Type.INT64),
|
|
22
|
+
((float, numpy.floating), Type.FLOAT64),
|
|
23
|
+
((str,), Type.TEXT),
|
|
24
|
+
((datetime,), Type.DATETIME),
|
|
25
|
+
((date,), Type.DATE),
|
|
26
|
+
((timedelta,), Type.DURATION),
|
|
27
|
+
((time,), Type.TIME),
|
|
28
|
+
)
|
|
29
|
+
ARRAY_OPERATION = "An Array"
|
|
30
|
+
TYPE_WIDTHS = {
|
|
31
|
+
Type.FLOAT64: 1,
|
|
32
|
+
Type.DATETIME: 1,
|
|
33
|
+
}
|
|
34
|
+
NARROWEST_WIDTH = 0
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def find_value_type(value: object) -> Type:
|
|
38
|
+
"""
|
|
39
|
+
Return the numdaplot type of a single Python value.
|
|
40
|
+
|
|
41
|
+
.. versionadded:: 0.1.0
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
value
|
|
46
|
+
A boolean, a number, a text, a date, a datetime, a duration or a time of day.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
Type
|
|
51
|
+
``BOOL``, ``INT64``, ``FLOAT64``, ``TEXT``, ``DATETIME``, ``DATE``, ``DURATION`` or ``TIME``.
|
|
52
|
+
|
|
53
|
+
Raises
|
|
54
|
+
------
|
|
55
|
+
UnsupportedTypeError
|
|
56
|
+
When the value has no numdaplot type, such as a complex number or a tuple.
|
|
57
|
+
TimeZoneMismatchError
|
|
58
|
+
When the value is a datetime or a time of day with a time zone, which an Array cannot hold.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
>>> from numdaplot.data_types.value_type import find_value_type
|
|
63
|
+
>>> find_value_type(2.5)
|
|
64
|
+
<Type.FLOAT64: 10>
|
|
65
|
+
"""
|
|
66
|
+
has_time_zone = isinstance(value, (datetime, time)) and value.tzinfo is not None
|
|
67
|
+
if has_time_zone:
|
|
68
|
+
raise TimeZoneMismatchError(ARRAY_OPERATION, False)
|
|
69
|
+
|
|
70
|
+
for python_types, data_type in PYTHON_TYPES:
|
|
71
|
+
if isinstance(value, python_types):
|
|
72
|
+
return data_type
|
|
73
|
+
|
|
74
|
+
value_class = type(value)
|
|
75
|
+
raise UnsupportedTypeError(value_class.__name__, Library.NUMPY)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def find_type_width(data_type: Type) -> int:
|
|
79
|
+
"""
|
|
80
|
+
Return the width of a type inside its family, the widest type holding every value of the others.
|
|
81
|
+
|
|
82
|
+
.. versionadded:: 0.1.0
|
|
83
|
+
|
|
84
|
+
Parameters
|
|
85
|
+
----------
|
|
86
|
+
data_type
|
|
87
|
+
A type returned by ``find_value_type``.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
int
|
|
92
|
+
1 for ``FLOAT64`` and ``DATETIME``, 0 for every other type.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> import numdaplot as ndp
|
|
97
|
+
>>> from numdaplot.data_types.value_type import find_type_width
|
|
98
|
+
>>> find_type_width(ndp.Type.INT64) < find_type_width(ndp.Type.FLOAT64)
|
|
99
|
+
True
|
|
100
|
+
"""
|
|
101
|
+
width = TYPE_WIDTHS.get(data_type, NARROWEST_WIDTH)
|
|
102
|
+
|
|
103
|
+
return width
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def find_common_type(data_types: list[Type], operation: str) -> Type:
|
|
107
|
+
"""
|
|
108
|
+
Return the type that holds every value of several types of one family.
|
|
109
|
+
|
|
110
|
+
Integers and decimals give ``FLOAT64``, dates and datetimes give ``DATETIME``.
|
|
111
|
+
|
|
112
|
+
.. versionadded:: 0.1.0
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
data_types
|
|
117
|
+
At least one type returned by ``find_value_type``.
|
|
118
|
+
operation
|
|
119
|
+
Name of the operation needing the common type, shown in the error message.
|
|
120
|
+
|
|
121
|
+
Returns
|
|
122
|
+
-------
|
|
123
|
+
Type
|
|
124
|
+
The widest of the given types.
|
|
125
|
+
|
|
126
|
+
Raises
|
|
127
|
+
------
|
|
128
|
+
IncompatibleTypesError
|
|
129
|
+
When the types belong to several families, such as a number and a text.
|
|
130
|
+
|
|
131
|
+
Examples
|
|
132
|
+
--------
|
|
133
|
+
>>> import numdaplot as ndp
|
|
134
|
+
>>> from numdaplot.data_types.value_type import find_common_type
|
|
135
|
+
>>> find_common_type([ndp.Type.INT64, ndp.Type.FLOAT64], "from_list")
|
|
136
|
+
<Type.FLOAT64: 10>
|
|
137
|
+
"""
|
|
138
|
+
distinct_types = set(data_types)
|
|
139
|
+
families = {find_family(data_type) for data_type in distinct_types}
|
|
140
|
+
family_count = len(families)
|
|
141
|
+
if family_count > 1:
|
|
142
|
+
type_names = sorted(data_type.name for data_type in distinct_types)
|
|
143
|
+
raise IncompatibleTypesError(operation, type_names)
|
|
144
|
+
|
|
145
|
+
common_type = max(distinct_types, key=find_type_width)
|
|
146
|
+
|
|
147
|
+
return common_type
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A pattern describing how dates are written as texts.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_date_format_error import InvalidDateFormatError
|
|
10
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
|
|
12
|
+
DATE_CODES = ("%d", "%m", "%Y", "%y", "%b", "%B", "%j")
|
|
13
|
+
TIME_ZONE_CODES = ("%z", "%Z")
|
|
14
|
+
TIME_CODES = ("%H", "%I", "%M", "%S", "%f", "%p")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class CustomDateFormat:
|
|
19
|
+
"""
|
|
20
|
+
A pattern describing how dates, datetimes or times of day are written as texts, used by ``Conversion``.
|
|
21
|
+
|
|
22
|
+
It serves when no ``DateFormat`` fits, and for times of day. The pattern uses the codes of Python
|
|
23
|
+
``datetime.strptime``: ``%d`` day, ``%m`` month, ``%Y`` year,
|
|
24
|
+
``%b`` short month name, ``%B`` full month name, ``%H`` hour, ``%M`` minute, ``%S`` second.
|
|
25
|
+
Month names are in English.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
pattern
|
|
32
|
+
The pattern, such as ``"%d %b %Y"`` for ``"31 Dec 2026"``.
|
|
33
|
+
|
|
34
|
+
Raises
|
|
35
|
+
------
|
|
36
|
+
InvalidTypeError
|
|
37
|
+
When a setting is not of the type its annotation names.
|
|
38
|
+
InvalidDateFormatError
|
|
39
|
+
When the pattern has no date code (day, month, year) nor time code (hour, minute, second), or has a time
|
|
40
|
+
zone code (``%z``, ``%Z``). A pattern without date only reads or writes ``TIME``, and a pattern with a date
|
|
41
|
+
never does.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31 Dec 2026", "1 Feb 2026"])})
|
|
47
|
+
>>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.CustomDateFormat("%d %b %Y")))
|
|
48
|
+
day
|
|
49
|
+
DATE
|
|
50
|
+
0 2026-12-31
|
|
51
|
+
1 2026-02-01
|
|
52
|
+
>>> hours = ndp.Table.from_arrays({"hrmn": ndp.Array.from_list(["1535", "0805"])})
|
|
53
|
+
>>> hours.convert(ndp.Conversion(column="hrmn", dtype=ndp.Type.TIME, format=ndp.CustomDateFormat("%H%M")))
|
|
54
|
+
hrmn
|
|
55
|
+
TIME
|
|
56
|
+
0 15:35:00
|
|
57
|
+
1 08:05:00
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
pattern: str
|
|
61
|
+
|
|
62
|
+
def __post_init__(self) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Check that the pattern reads a date or a time of day, and no time zone.
|
|
65
|
+
|
|
66
|
+
.. versionadded:: 0.1.0
|
|
67
|
+
|
|
68
|
+
Raises
|
|
69
|
+
------
|
|
70
|
+
InvalidTypeError
|
|
71
|
+
When a setting is not of the type its annotation names.
|
|
72
|
+
InvalidDateFormatError
|
|
73
|
+
When the pattern has no date nor time code, or has a time zone code.
|
|
74
|
+
"""
|
|
75
|
+
require_field_types(self)
|
|
76
|
+
|
|
77
|
+
has_date_code = any(date_code in self.pattern for date_code in DATE_CODES)
|
|
78
|
+
has_time_code = any(time_code in self.pattern for time_code in TIME_CODES)
|
|
79
|
+
has_time_zone_code = any(zone_code in self.pattern for zone_code in TIME_ZONE_CODES)
|
|
80
|
+
reads_something = has_date_code or has_time_code
|
|
81
|
+
is_rejected = has_time_zone_code or not reads_something
|
|
82
|
+
if is_rejected:
|
|
83
|
+
raise InvalidDateFormatError(self.pattern)
|