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,207 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion between ``ndp.Type`` and numpy dtypes, used by Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.library import Library
|
|
12
|
+
from numdaplot.data_types.type import Type
|
|
13
|
+
from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
|
|
14
|
+
|
|
15
|
+
# Some versions of the numpy stubs leave out the missing value marker of StringDType.
|
|
16
|
+
STRING_DTYPE_CLASS = cast(Any, numpy.dtypes.StringDType)
|
|
17
|
+
TEXT_DTYPE = STRING_DTYPE_CLASS(na_object=numpy.nan)
|
|
18
|
+
NUMPY_DTYPE_CODES = {
|
|
19
|
+
Type.INT8: "int8",
|
|
20
|
+
Type.INT16: "int16",
|
|
21
|
+
Type.INT32: "int32",
|
|
22
|
+
Type.INT64: "int64",
|
|
23
|
+
Type.UINT8: "uint8",
|
|
24
|
+
Type.UINT16: "uint16",
|
|
25
|
+
Type.UINT32: "uint32",
|
|
26
|
+
Type.UINT64: "uint64",
|
|
27
|
+
Type.FLOAT32: "float32",
|
|
28
|
+
Type.FLOAT64: "float64",
|
|
29
|
+
Type.BOOL: "bool",
|
|
30
|
+
Type.DATE: "datetime64[D]",
|
|
31
|
+
Type.DATETIME: "datetime64[ns]",
|
|
32
|
+
Type.DURATION: "timedelta64[ns]",
|
|
33
|
+
Type.TIME: "timedelta64[us]",
|
|
34
|
+
}
|
|
35
|
+
NAMED_NUMPY_TYPES = (
|
|
36
|
+
Type.INT8,
|
|
37
|
+
Type.INT16,
|
|
38
|
+
Type.INT32,
|
|
39
|
+
Type.INT64,
|
|
40
|
+
Type.UINT8,
|
|
41
|
+
Type.UINT16,
|
|
42
|
+
Type.UINT32,
|
|
43
|
+
Type.UINT64,
|
|
44
|
+
Type.FLOAT32,
|
|
45
|
+
Type.FLOAT64,
|
|
46
|
+
Type.BOOL,
|
|
47
|
+
)
|
|
48
|
+
TYPES_BY_DTYPE_NAME = {NUMPY_DTYPE_CODES[data_type]: data_type for data_type in NAMED_NUMPY_TYPES}
|
|
49
|
+
TEXT_KINDS = frozenset({"U", "T"})
|
|
50
|
+
DATETIME_KIND = "M"
|
|
51
|
+
DURATION_KIND = "m"
|
|
52
|
+
DAY_UNIT = "D"
|
|
53
|
+
TIME_UNIT = "us"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def to_numpy_dtype(data_type: Type) -> numpy.dtype[Any]:
|
|
57
|
+
"""
|
|
58
|
+
Return the numpy dtype that stores the values of a numdaplot type.
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.1.0
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
data_type
|
|
65
|
+
The numdaplot type to convert.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
numpy.dtype
|
|
70
|
+
The matching numpy dtype. ``TEXT`` gives the variable-length ``StringDType`` with NaN as missing value,
|
|
71
|
+
``DATE`` gives ``datetime64[D]`` and ``DATETIME`` gives ``datetime64[ns]``.
|
|
72
|
+
|
|
73
|
+
Raises
|
|
74
|
+
------
|
|
75
|
+
UnsupportedTypeError
|
|
76
|
+
When the type has no numpy equivalent, which is the case of ``CATEGORY``.
|
|
77
|
+
|
|
78
|
+
Examples
|
|
79
|
+
--------
|
|
80
|
+
>>> import numdaplot as ndp
|
|
81
|
+
>>> from numdaplot.data_types.numpy_mapping import to_numpy_dtype
|
|
82
|
+
>>> to_numpy_dtype(ndp.Type.INT32)
|
|
83
|
+
dtype('int32')
|
|
84
|
+
"""
|
|
85
|
+
if data_type == Type.TEXT:
|
|
86
|
+
return TEXT_DTYPE
|
|
87
|
+
|
|
88
|
+
if data_type not in NUMPY_DTYPE_CODES:
|
|
89
|
+
raise UnsupportedTypeError(data_type.name, Library.NUMPY)
|
|
90
|
+
|
|
91
|
+
dtype_code = NUMPY_DTYPE_CODES[data_type]
|
|
92
|
+
numpy_dtype = numpy.dtype(dtype_code)
|
|
93
|
+
|
|
94
|
+
return numpy_dtype
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def from_numpy_dtype(numpy_dtype: numpy.dtype[Any]) -> Type:
|
|
98
|
+
"""
|
|
99
|
+
Return the numdaplot type that matches a numpy dtype.
|
|
100
|
+
|
|
101
|
+
.. versionadded:: 0.1.0
|
|
102
|
+
|
|
103
|
+
Parameters
|
|
104
|
+
----------
|
|
105
|
+
numpy_dtype
|
|
106
|
+
The numpy dtype to convert. Fixed-length (``<U5``) and variable-length strings both give ``TEXT``.
|
|
107
|
+
``timedelta64[us]`` gives ``TIME``, the time since midnight, and every other ``timedelta64`` unit gives
|
|
108
|
+
``DURATION``.
|
|
109
|
+
|
|
110
|
+
Returns
|
|
111
|
+
-------
|
|
112
|
+
Type
|
|
113
|
+
The matching numdaplot type.
|
|
114
|
+
|
|
115
|
+
Raises
|
|
116
|
+
------
|
|
117
|
+
UnsupportedTypeError
|
|
118
|
+
When numdaplot has no equivalent type, for example complex numbers or Python objects.
|
|
119
|
+
|
|
120
|
+
Examples
|
|
121
|
+
--------
|
|
122
|
+
>>> import numpy
|
|
123
|
+
>>> from numdaplot.data_types.numpy_mapping import from_numpy_dtype
|
|
124
|
+
>>> from_numpy_dtype(numpy.dtype("datetime64[D]"))
|
|
125
|
+
<Type.DATE: 14>
|
|
126
|
+
"""
|
|
127
|
+
dtype_name = numpy_dtype.name
|
|
128
|
+
if dtype_name in TYPES_BY_DTYPE_NAME:
|
|
129
|
+
named_type = TYPES_BY_DTYPE_NAME[dtype_name]
|
|
130
|
+
return named_type
|
|
131
|
+
|
|
132
|
+
dtype_kind = numpy_dtype.kind
|
|
133
|
+
if dtype_kind in TEXT_KINDS:
|
|
134
|
+
return Type.TEXT
|
|
135
|
+
|
|
136
|
+
if dtype_kind == DURATION_KIND:
|
|
137
|
+
duration_type = find_duration_type(numpy_dtype)
|
|
138
|
+
return duration_type
|
|
139
|
+
|
|
140
|
+
if dtype_kind == DATETIME_KIND:
|
|
141
|
+
datetime_type = find_datetime_type(numpy_dtype)
|
|
142
|
+
return datetime_type
|
|
143
|
+
|
|
144
|
+
type_name = str(numpy_dtype)
|
|
145
|
+
raise UnsupportedTypeError(type_name, Library.NUMPY)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def find_duration_type(numpy_dtype: numpy.dtype[Any]) -> Type:
|
|
149
|
+
"""
|
|
150
|
+
Return the numdaplot type of a ``timedelta64`` dtype.
|
|
151
|
+
|
|
152
|
+
numdaplot stores a time of day as the time since midnight in microseconds, and every duration in another unit.
|
|
153
|
+
|
|
154
|
+
.. versionadded:: 0.1.0
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
numpy_dtype
|
|
159
|
+
A ``timedelta64`` dtype.
|
|
160
|
+
|
|
161
|
+
Returns
|
|
162
|
+
-------
|
|
163
|
+
Type
|
|
164
|
+
``TIME`` for microseconds, ``DURATION`` otherwise.
|
|
165
|
+
|
|
166
|
+
Examples
|
|
167
|
+
--------
|
|
168
|
+
>>> import numpy
|
|
169
|
+
>>> from numdaplot.data_types.numpy_mapping import find_duration_type
|
|
170
|
+
>>> find_duration_type(numpy.dtype("timedelta64[us]")), find_duration_type(numpy.dtype("timedelta64[s]"))
|
|
171
|
+
(<Type.TIME: 17>, <Type.DURATION: 16>)
|
|
172
|
+
"""
|
|
173
|
+
unit, _ = numpy.datetime_data(numpy_dtype)
|
|
174
|
+
if unit == TIME_UNIT:
|
|
175
|
+
return Type.TIME
|
|
176
|
+
|
|
177
|
+
return Type.DURATION
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def find_datetime_type(numpy_dtype: numpy.dtype[Any]) -> Type:
|
|
181
|
+
"""
|
|
182
|
+
Return the numdaplot type of a ``datetime64`` dtype, according to its unit.
|
|
183
|
+
|
|
184
|
+
.. versionadded:: 0.1.0
|
|
185
|
+
|
|
186
|
+
Parameters
|
|
187
|
+
----------
|
|
188
|
+
numpy_dtype
|
|
189
|
+
A ``datetime64`` dtype.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
Type
|
|
194
|
+
``DATE`` when the unit is the day, ``DATETIME`` for any other unit.
|
|
195
|
+
|
|
196
|
+
Examples
|
|
197
|
+
--------
|
|
198
|
+
>>> import numpy
|
|
199
|
+
>>> from numdaplot.data_types.numpy_mapping import find_datetime_type
|
|
200
|
+
>>> find_datetime_type(numpy.dtype("datetime64[s]"))
|
|
201
|
+
<Type.DATETIME: 15>
|
|
202
|
+
"""
|
|
203
|
+
datetime_unit, _ = numpy.datetime_data(numpy_dtype)
|
|
204
|
+
if datetime_unit == DAY_UNIT:
|
|
205
|
+
return Type.DATE
|
|
206
|
+
|
|
207
|
+
return Type.DATETIME
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion between ``ndp.Type`` and the pandas dtypes that store Table columns.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from pandas import DatetimeTZDtype
|
|
11
|
+
from pandas.api.extensions import ExtensionDtype
|
|
12
|
+
from pandas.api.types import pandas_dtype
|
|
13
|
+
|
|
14
|
+
from numdaplot.data_types.library import Library
|
|
15
|
+
from numdaplot.data_types.type import Type
|
|
16
|
+
from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
|
|
17
|
+
|
|
18
|
+
PANDAS_DTYPE_CODES = {
|
|
19
|
+
Type.INT8: "Int8",
|
|
20
|
+
Type.INT16: "Int16",
|
|
21
|
+
Type.INT32: "Int32",
|
|
22
|
+
Type.INT64: "Int64",
|
|
23
|
+
Type.UINT8: "UInt8",
|
|
24
|
+
Type.UINT16: "UInt16",
|
|
25
|
+
Type.UINT32: "UInt32",
|
|
26
|
+
Type.UINT64: "UInt64",
|
|
27
|
+
Type.FLOAT32: "float32",
|
|
28
|
+
Type.FLOAT64: "float64",
|
|
29
|
+
Type.BOOL: "boolean",
|
|
30
|
+
Type.TEXT: "string",
|
|
31
|
+
Type.CATEGORY: "category",
|
|
32
|
+
Type.DATE: "datetime64[s]",
|
|
33
|
+
Type.DATETIME: "datetime64[ns]",
|
|
34
|
+
Type.DURATION: "timedelta64[ns]",
|
|
35
|
+
Type.TIME: "timedelta64[us]",
|
|
36
|
+
}
|
|
37
|
+
NANOSECOND_UNIT = "ns"
|
|
38
|
+
TYPES_BY_PANDAS_NAME = {dtype_code: data_type for data_type, dtype_code in PANDAS_DTYPE_CODES.items()}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def to_pandas_dtype(data_type: Type) -> numpy.dtype[Any] | ExtensionDtype:
|
|
42
|
+
"""
|
|
43
|
+
Return the pandas dtype that stores a Table column of a numdaplot type.
|
|
44
|
+
|
|
45
|
+
Integers, booleans and text use the pandas types that accept missing values (``pd.NA``),
|
|
46
|
+
so a column keeps its type when it has holes. Decimals keep NaN as missing value.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
data_type
|
|
53
|
+
The numdaplot type to convert.
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
numpy.dtype or ExtensionDtype
|
|
58
|
+
The matching pandas dtype. ``DATE`` is stored as ``datetime64[s]``,
|
|
59
|
+
since pandas has no dtype for a day without time.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> import numdaplot as ndp
|
|
64
|
+
>>> from numdaplot.data_types.pandas_mapping import to_pandas_dtype
|
|
65
|
+
>>> to_pandas_dtype(ndp.Type.INT64)
|
|
66
|
+
Int64Dtype()
|
|
67
|
+
"""
|
|
68
|
+
dtype_code = PANDAS_DTYPE_CODES[data_type]
|
|
69
|
+
matching_dtype = pandas_dtype(dtype_code)
|
|
70
|
+
|
|
71
|
+
return matching_dtype
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def from_pandas_dtype(pandas_type: object) -> Type:
|
|
75
|
+
"""
|
|
76
|
+
Return the numdaplot type of a Table column stored with a pandas dtype.
|
|
77
|
+
|
|
78
|
+
.. versionadded:: 0.1.0
|
|
79
|
+
|
|
80
|
+
Parameters
|
|
81
|
+
----------
|
|
82
|
+
pandas_type
|
|
83
|
+
The dtype of a Table column, one of the dtypes given by ``to_pandas_dtype``.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
Type
|
|
88
|
+
The matching numdaplot type. Datetimes with a time zone, counted in nanoseconds, give ``DATETIME``.
|
|
89
|
+
|
|
90
|
+
Raises
|
|
91
|
+
------
|
|
92
|
+
UnsupportedTypeError
|
|
93
|
+
When the dtype is not one that stores a Table column, such as ``object`` or ``complex128``.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import pandas
|
|
98
|
+
>>> from numdaplot.data_types.pandas_mapping import from_pandas_dtype
|
|
99
|
+
>>> from_pandas_dtype(pandas.Int64Dtype())
|
|
100
|
+
<Type.INT64: 4>
|
|
101
|
+
>>> from_pandas_dtype(pandas.DatetimeTZDtype("ns", "Europe/Paris"))
|
|
102
|
+
<Type.DATETIME: 15>
|
|
103
|
+
"""
|
|
104
|
+
is_nanosecond_zone = isinstance(pandas_type, DatetimeTZDtype) and pandas_type.unit == NANOSECOND_UNIT
|
|
105
|
+
if is_nanosecond_zone:
|
|
106
|
+
return Type.DATETIME
|
|
107
|
+
|
|
108
|
+
dtype_name = str(pandas_type)
|
|
109
|
+
if dtype_name not in TYPES_BY_PANDAS_NAME:
|
|
110
|
+
raise UnsupportedTypeError(dtype_name, Library.PANDAS)
|
|
111
|
+
|
|
112
|
+
matching_type = TYPES_BY_PANDAS_NAME[dtype_name]
|
|
113
|
+
|
|
114
|
+
return matching_type
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion between Python times of day and the time since midnight that stores them.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from datetime import time, timedelta
|
|
9
|
+
from typing import Any, cast
|
|
10
|
+
|
|
11
|
+
import numpy
|
|
12
|
+
from numpy.typing import NDArray
|
|
13
|
+
|
|
14
|
+
TIME_DTYPE = numpy.dtype("timedelta64[us]")
|
|
15
|
+
PYTHON_OBJECT_DTYPE = numpy.dtype(object)
|
|
16
|
+
MISSING_TIME = numpy.timedelta64("NaT", "us")
|
|
17
|
+
MICROSECONDS_PER_SECOND = 1_000_000
|
|
18
|
+
SECONDS_PER_MINUTE = 60
|
|
19
|
+
MINUTES_PER_HOUR = 60
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def to_time_since_midnight(time_of_day: time) -> timedelta:
|
|
23
|
+
"""
|
|
24
|
+
Return the time elapsed since midnight at a time of day.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
time_of_day
|
|
31
|
+
A time without time zone.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
timedelta
|
|
36
|
+
The duration from midnight to the time.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> from datetime import time
|
|
41
|
+
>>> from numdaplot.data_types.time_of_day import to_time_since_midnight
|
|
42
|
+
>>> to_time_since_midnight(time(15, 35, 0, 250000))
|
|
43
|
+
datetime.timedelta(seconds=56100, microseconds=250000)
|
|
44
|
+
"""
|
|
45
|
+
since_midnight = timedelta(
|
|
46
|
+
hours=time_of_day.hour,
|
|
47
|
+
minutes=time_of_day.minute,
|
|
48
|
+
seconds=time_of_day.second,
|
|
49
|
+
microseconds=time_of_day.microsecond,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
return since_midnight
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def to_time_of_day(microseconds: int) -> time:
|
|
56
|
+
"""
|
|
57
|
+
Return the time of day reached a number of microseconds after midnight.
|
|
58
|
+
|
|
59
|
+
.. versionadded:: 0.1.0
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
microseconds
|
|
64
|
+
The microseconds since midnight, less than one day.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
time
|
|
69
|
+
The time of day.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> from numdaplot.data_types.time_of_day import to_time_of_day
|
|
74
|
+
>>> to_time_of_day(56100250000)
|
|
75
|
+
datetime.time(15, 35, 0, 250000)
|
|
76
|
+
"""
|
|
77
|
+
total_seconds, microsecond = divmod(microseconds, MICROSECONDS_PER_SECOND)
|
|
78
|
+
total_minutes, second = divmod(total_seconds, SECONDS_PER_MINUTE)
|
|
79
|
+
hour, minute = divmod(total_minutes, MINUTES_PER_HOUR)
|
|
80
|
+
time_of_day = time(hour, minute, second, microsecond)
|
|
81
|
+
|
|
82
|
+
return time_of_day
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def store_times(times: Sequence[object]) -> NDArray[numpy.timedelta64]:
|
|
86
|
+
"""
|
|
87
|
+
Return times of day as the time since midnight in microseconds, NaT where missing.
|
|
88
|
+
|
|
89
|
+
.. versionadded:: 0.1.0
|
|
90
|
+
|
|
91
|
+
Parameters
|
|
92
|
+
----------
|
|
93
|
+
times
|
|
94
|
+
Python times of day, and None or NaT for a missing value.
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
NDArray[numpy.timedelta64]
|
|
99
|
+
The values in ``timedelta64[us]``.
|
|
100
|
+
|
|
101
|
+
Examples
|
|
102
|
+
--------
|
|
103
|
+
>>> from datetime import time
|
|
104
|
+
>>> from numdaplot.data_types.time_of_day import store_times
|
|
105
|
+
>>> store_times([time(0, 0, 1), None])
|
|
106
|
+
array([1000000, 'NaT'], dtype='timedelta64[us]')
|
|
107
|
+
"""
|
|
108
|
+
durations = list[object]()
|
|
109
|
+
for value in times:
|
|
110
|
+
duration: object = MISSING_TIME
|
|
111
|
+
if isinstance(value, time):
|
|
112
|
+
duration = to_time_since_midnight(value)
|
|
113
|
+
|
|
114
|
+
durations.append(duration)
|
|
115
|
+
|
|
116
|
+
stored_times = numpy.array(durations, dtype=TIME_DTYPE)
|
|
117
|
+
|
|
118
|
+
return stored_times
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def read_times(values: NDArray[Any]) -> list[time | None]:
|
|
122
|
+
"""
|
|
123
|
+
Return the Python times of day of values stored as the time since midnight, None where missing.
|
|
124
|
+
|
|
125
|
+
.. versionadded:: 0.1.0
|
|
126
|
+
|
|
127
|
+
Parameters
|
|
128
|
+
----------
|
|
129
|
+
values
|
|
130
|
+
Values in ``timedelta64[us]``, in one dimension.
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
list[time | None]
|
|
135
|
+
One time of day per value.
|
|
136
|
+
|
|
137
|
+
Examples
|
|
138
|
+
--------
|
|
139
|
+
>>> import numpy
|
|
140
|
+
>>> from numdaplot.data_types.time_of_day import read_times
|
|
141
|
+
>>> read_times(numpy.array([56100000000, "NaT"], dtype="timedelta64[us]"))
|
|
142
|
+
[datetime.time(15, 35), None]
|
|
143
|
+
"""
|
|
144
|
+
missing = numpy.isnat(values)
|
|
145
|
+
missing_flags = cast(list[bool], missing.tolist())
|
|
146
|
+
whole_values = values.astype(numpy.int64)
|
|
147
|
+
microsecond_list = cast(list[int], whole_values.tolist())
|
|
148
|
+
times = list[time | None]()
|
|
149
|
+
for microseconds, is_missing in zip(microsecond_list, missing_flags, strict=True):
|
|
150
|
+
if is_missing:
|
|
151
|
+
times.append(None)
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
time_of_day = to_time_of_day(microseconds)
|
|
155
|
+
times.append(time_of_day)
|
|
156
|
+
|
|
157
|
+
return times
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def write_time(time_of_day: time) -> str:
|
|
161
|
+
"""
|
|
162
|
+
Return a time of day as a text, with its microseconds only when it has some.
|
|
163
|
+
|
|
164
|
+
.. versionadded:: 0.1.0
|
|
165
|
+
|
|
166
|
+
Parameters
|
|
167
|
+
----------
|
|
168
|
+
time_of_day
|
|
169
|
+
A time of day.
|
|
170
|
+
|
|
171
|
+
Returns
|
|
172
|
+
-------
|
|
173
|
+
str
|
|
174
|
+
``15:35:00``, or ``15:35:00.250000`` with microseconds.
|
|
175
|
+
|
|
176
|
+
Examples
|
|
177
|
+
--------
|
|
178
|
+
>>> from datetime import time
|
|
179
|
+
>>> from numdaplot.data_types.time_of_day import write_time
|
|
180
|
+
>>> write_time(time(15, 35)), write_time(time(15, 35, 0, 250000))
|
|
181
|
+
('15:35:00', '15:35:00.250000')
|
|
182
|
+
"""
|
|
183
|
+
time_text = time_of_day.isoformat()
|
|
184
|
+
|
|
185
|
+
return time_text
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def read_time_objects(values: NDArray[Any]) -> NDArray[Any]:
|
|
189
|
+
"""
|
|
190
|
+
Return values stored as the time since midnight as Python times of day, in the same shape.
|
|
191
|
+
|
|
192
|
+
.. versionadded:: 0.1.0
|
|
193
|
+
|
|
194
|
+
Parameters
|
|
195
|
+
----------
|
|
196
|
+
values
|
|
197
|
+
Values in ``timedelta64[us]``, of any shape.
|
|
198
|
+
|
|
199
|
+
Returns
|
|
200
|
+
-------
|
|
201
|
+
NDArray
|
|
202
|
+
An object array of ``datetime.time``, None where missing.
|
|
203
|
+
|
|
204
|
+
Examples
|
|
205
|
+
--------
|
|
206
|
+
>>> import numpy
|
|
207
|
+
>>> from numdaplot.data_types.time_of_day import read_time_objects
|
|
208
|
+
>>> read_time_objects(numpy.array([[60000000]], dtype="timedelta64[us]"))
|
|
209
|
+
array([[datetime.time(0, 1)]], dtype=object)
|
|
210
|
+
"""
|
|
211
|
+
flat_values = values.ravel()
|
|
212
|
+
times = read_times(flat_values)
|
|
213
|
+
time_count = len(times)
|
|
214
|
+
# Some versions of the numpy stubs refuse Python objects as the values of an object array.
|
|
215
|
+
time_objects = cast(Any, numpy.empty(time_count, dtype=PYTHON_OBJECT_DTYPE))
|
|
216
|
+
time_objects[:] = times
|
|
217
|
+
shaped_objects = time_objects.reshape(values.shape)
|
|
218
|
+
|
|
219
|
+
return shaped_objects
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def holds_only_times(values: NDArray[Any]) -> bool:
|
|
223
|
+
"""
|
|
224
|
+
Return whether an object array holds Python times of day and missing values only, with at least one time.
|
|
225
|
+
|
|
226
|
+
.. versionadded:: 0.1.0
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
values
|
|
231
|
+
A numpy array of any type.
|
|
232
|
+
|
|
233
|
+
Returns
|
|
234
|
+
-------
|
|
235
|
+
bool
|
|
236
|
+
True for an object array of ``datetime.time`` without time zone and None.
|
|
237
|
+
|
|
238
|
+
Examples
|
|
239
|
+
--------
|
|
240
|
+
>>> from datetime import time
|
|
241
|
+
>>> import numpy
|
|
242
|
+
>>> from numdaplot.data_types.time_of_day import holds_only_times
|
|
243
|
+
>>> holds_only_times(numpy.array([time(8), None], dtype=object)), holds_only_times(numpy.array([1, 2]))
|
|
244
|
+
(True, False)
|
|
245
|
+
"""
|
|
246
|
+
if values.dtype != PYTHON_OBJECT_DTYPE:
|
|
247
|
+
return False
|
|
248
|
+
|
|
249
|
+
has_time = False
|
|
250
|
+
for value in values.ravel():
|
|
251
|
+
if value is None:
|
|
252
|
+
continue
|
|
253
|
+
|
|
254
|
+
is_naive_time = isinstance(value, time) and value.tzinfo is None
|
|
255
|
+
if not is_naive_time:
|
|
256
|
+
return False
|
|
257
|
+
|
|
258
|
+
has_time = True
|
|
259
|
+
|
|
260
|
+
return has_time
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def store_time_objects(values: NDArray[Any]) -> NDArray[numpy.timedelta64]:
|
|
264
|
+
"""
|
|
265
|
+
Return an object array of Python times of day as the time since midnight, in the same shape.
|
|
266
|
+
|
|
267
|
+
.. versionadded:: 0.1.0
|
|
268
|
+
|
|
269
|
+
Parameters
|
|
270
|
+
----------
|
|
271
|
+
values
|
|
272
|
+
An object array of ``datetime.time`` and None.
|
|
273
|
+
|
|
274
|
+
Returns
|
|
275
|
+
-------
|
|
276
|
+
NDArray[numpy.timedelta64]
|
|
277
|
+
The values in ``timedelta64[us]``, NaT where missing.
|
|
278
|
+
|
|
279
|
+
Examples
|
|
280
|
+
--------
|
|
281
|
+
>>> from datetime import time
|
|
282
|
+
>>> import numpy
|
|
283
|
+
>>> from numdaplot.data_types.time_of_day import store_time_objects
|
|
284
|
+
>>> store_time_objects(numpy.array([time(0, 0, 1), None], dtype=object))
|
|
285
|
+
array([1000000, 'NaT'], dtype='timedelta64[us]')
|
|
286
|
+
"""
|
|
287
|
+
flat_values = values.ravel()
|
|
288
|
+
value_list = flat_values.tolist()
|
|
289
|
+
stored_times = store_times(value_list)
|
|
290
|
+
shaped_times = stored_times.reshape(values.shape)
|
|
291
|
+
|
|
292
|
+
return shaped_times
|