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,290 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Texts of datetimes and durations shown for an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, Literal, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.data_types.time_of_day import read_times, write_time
|
|
13
|
+
|
|
14
|
+
type DatetimeUnit = Literal["s", "ms", "us", "ns"]
|
|
15
|
+
DATETIME_UNITS = tuple[DatetimeUnit, ...](("s", "ms", "us", "ns"))
|
|
16
|
+
ISO_TIME_SEPARATOR = "T"
|
|
17
|
+
TIME_SEPARATOR = " "
|
|
18
|
+
NOT_A_TIME_TEXT = "NaT"
|
|
19
|
+
NANOSECONDS_PER_SECOND = 1_000_000_000
|
|
20
|
+
SECONDS_PER_MINUTE = 60
|
|
21
|
+
SECONDS_PER_HOUR = 3_600
|
|
22
|
+
SECONDS_PER_DAY = 86_400
|
|
23
|
+
NANOSECOND_DIGITS = 9
|
|
24
|
+
CLOCK_DIGITS = 2
|
|
25
|
+
DAYS_SUFFIX = " days "
|
|
26
|
+
CLOCK_SEPARATOR = ":"
|
|
27
|
+
FRACTION_SEPARATOR = "."
|
|
28
|
+
NEGATIVE_CLOCK_SIGN = "+"
|
|
29
|
+
NANOSECOND_DTYPE = "timedelta64[ns]"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def format_datetimes(values: NDArray[numpy.datetime64]) -> NDArray[numpy.str_]:
|
|
33
|
+
"""
|
|
34
|
+
Return the text of each datetime, such as ``"2026-01-02 10:30:00"``.
|
|
35
|
+
|
|
36
|
+
Fractions of a second are written only when a value has one, with the same number of digits for every value.
|
|
37
|
+
|
|
38
|
+
.. versionadded:: 0.1.0
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
values
|
|
43
|
+
The values of a datetime Array.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
NDArray[numpy.str_]
|
|
48
|
+
One text per value, of the same shape, ``NaT`` for a missing value.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numpy
|
|
53
|
+
>>> from numdaplot.arrays.conversion.time_text import format_datetimes
|
|
54
|
+
>>> format_datetimes(numpy.array(["2026-01-02T10:30:00.25", "NaT"], dtype="datetime64[ns]")).tolist()
|
|
55
|
+
['2026-01-02 10:30:00.250', 'NaT']
|
|
56
|
+
"""
|
|
57
|
+
unit = find_datetime_unit(values)
|
|
58
|
+
iso_texts = numpy.datetime_as_string(values, unit=unit)
|
|
59
|
+
spaced_texts = numpy.strings.replace(iso_texts, ISO_TIME_SEPARATOR, TIME_SEPARATOR)
|
|
60
|
+
missing = numpy.isnat(values)
|
|
61
|
+
datetime_texts = numpy.where(missing, NOT_A_TIME_TEXT, spaced_texts)
|
|
62
|
+
|
|
63
|
+
return datetime_texts
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def find_datetime_unit(values: NDArray[numpy.datetime64]) -> DatetimeUnit:
|
|
67
|
+
"""
|
|
68
|
+
Return the shortest unit, from the second to the nanosecond, that writes every datetime exactly.
|
|
69
|
+
|
|
70
|
+
.. versionadded:: 0.1.0
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
values
|
|
75
|
+
The values of a datetime Array.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
DatetimeUnit
|
|
80
|
+
A numpy unit code: ``"s"``, ``"ms"``, ``"us"`` or ``"ns"``.
|
|
81
|
+
|
|
82
|
+
Examples
|
|
83
|
+
--------
|
|
84
|
+
>>> import numpy
|
|
85
|
+
>>> from numdaplot.arrays.conversion.time_text import find_datetime_unit
|
|
86
|
+
>>> find_datetime_unit(numpy.array(["2026-01-02T10:30:00.25"], dtype="datetime64[ns]"))
|
|
87
|
+
'ms'
|
|
88
|
+
"""
|
|
89
|
+
present = ~numpy.isnat(values)
|
|
90
|
+
present_values = values[present]
|
|
91
|
+
|
|
92
|
+
for unit in DATETIME_UNITS:
|
|
93
|
+
unit_dtype = numpy.dtype(f"datetime64[{unit}]")
|
|
94
|
+
truncated_values = present_values.astype(unit_dtype)
|
|
95
|
+
is_exact = bool(numpy.all(truncated_values == present_values))
|
|
96
|
+
if is_exact:
|
|
97
|
+
return unit
|
|
98
|
+
|
|
99
|
+
finest_unit = DATETIME_UNITS[-1]
|
|
100
|
+
|
|
101
|
+
return finest_unit
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def format_durations(values: NDArray[numpy.timedelta64]) -> NDArray[numpy.str_]:
|
|
105
|
+
"""
|
|
106
|
+
Return the text of each duration as pandas writes it, such as ``"1 days 12:00:00"``.
|
|
107
|
+
|
|
108
|
+
A negative duration counts whole days down, then the time up: 12 hours less is ``"-1 days +12:00:00"``.
|
|
109
|
+
Fractions of a second are written with nine digits, only for the values that have one.
|
|
110
|
+
|
|
111
|
+
.. versionadded:: 0.1.0
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
values
|
|
116
|
+
The values of a duration Array.
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
NDArray[numpy.str_]
|
|
121
|
+
One text per value, of the same shape, ``NaT`` for a missing value.
|
|
122
|
+
|
|
123
|
+
Examples
|
|
124
|
+
--------
|
|
125
|
+
>>> import numpy
|
|
126
|
+
>>> from numdaplot.arrays.conversion.time_text import format_durations
|
|
127
|
+
>>> format_durations(numpy.array([36, -12], dtype="timedelta64[h]")).tolist()
|
|
128
|
+
['1 days 12:00:00', '-1 days +12:00:00']
|
|
129
|
+
"""
|
|
130
|
+
nanosecond_values = values.astype(NANOSECOND_DTYPE)
|
|
131
|
+
missing = numpy.isnat(nanosecond_values)
|
|
132
|
+
nanoseconds = nanosecond_values.view(numpy.int64)
|
|
133
|
+
whole_seconds, fractions = numpy.divmod(nanoseconds, NANOSECONDS_PER_SECOND)
|
|
134
|
+
days, day_seconds = numpy.divmod(whole_seconds, SECONDS_PER_DAY)
|
|
135
|
+
hours, hour_seconds = numpy.divmod(day_seconds, SECONDS_PER_HOUR)
|
|
136
|
+
minutes, seconds = numpy.divmod(hour_seconds, SECONDS_PER_MINUTE)
|
|
137
|
+
day_numbers = days.astype(str)
|
|
138
|
+
day_texts = join_texts(day_numbers, DAYS_SUFFIX)
|
|
139
|
+
negative = days < 0
|
|
140
|
+
negative_day_texts = join_texts(day_texts, NEGATIVE_CLOCK_SIGN)
|
|
141
|
+
signed_day_texts = numpy.where(negative, negative_day_texts, day_texts)
|
|
142
|
+
clock_texts = join_clock_parts([hours, minutes, seconds])
|
|
143
|
+
fraction_texts = format_fractions(fractions)
|
|
144
|
+
whole_texts = join_texts(signed_day_texts, clock_texts)
|
|
145
|
+
duration_texts = join_texts(whole_texts, fraction_texts)
|
|
146
|
+
readable_texts = numpy.where(missing, NOT_A_TIME_TEXT, duration_texts)
|
|
147
|
+
|
|
148
|
+
return readable_texts
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def join_clock_parts(parts: list[NDArray[numpy.int64]]) -> NDArray[numpy.str_]:
|
|
152
|
+
"""
|
|
153
|
+
Return hours, minutes and seconds written with two digits each and joined by ``:``.
|
|
154
|
+
|
|
155
|
+
.. versionadded:: 0.1.0
|
|
156
|
+
|
|
157
|
+
Parameters
|
|
158
|
+
----------
|
|
159
|
+
parts
|
|
160
|
+
The hours, the minutes and the seconds, each with one number per value.
|
|
161
|
+
|
|
162
|
+
Returns
|
|
163
|
+
-------
|
|
164
|
+
NDArray[numpy.str_]
|
|
165
|
+
One text per value, such as ``"12:05:00"``.
|
|
166
|
+
|
|
167
|
+
Examples
|
|
168
|
+
--------
|
|
169
|
+
>>> import numpy
|
|
170
|
+
>>> from numdaplot.arrays.conversion.time_text import join_clock_parts
|
|
171
|
+
>>> join_clock_parts([numpy.array([12]), numpy.array([5]), numpy.array([0])]).tolist()
|
|
172
|
+
['12:05:00']
|
|
173
|
+
"""
|
|
174
|
+
part_texts = list[NDArray[numpy.str_]]()
|
|
175
|
+
|
|
176
|
+
for part in parts:
|
|
177
|
+
number_texts = part.astype(str)
|
|
178
|
+
part_text = numpy.strings.zfill(number_texts, CLOCK_DIGITS)
|
|
179
|
+
part_texts.append(part_text)
|
|
180
|
+
|
|
181
|
+
clock_texts = part_texts[0]
|
|
182
|
+
|
|
183
|
+
for part_text in part_texts[1:]:
|
|
184
|
+
separated_texts = join_texts(clock_texts, CLOCK_SEPARATOR)
|
|
185
|
+
clock_texts = join_texts(separated_texts, part_text)
|
|
186
|
+
|
|
187
|
+
return clock_texts
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def format_fractions(fractions: NDArray[numpy.int64]) -> NDArray[Any]:
|
|
191
|
+
"""
|
|
192
|
+
Return the fraction of a second of each value, written with nine digits, or an empty text when there is none.
|
|
193
|
+
|
|
194
|
+
.. versionadded:: 0.1.0
|
|
195
|
+
|
|
196
|
+
Parameters
|
|
197
|
+
----------
|
|
198
|
+
fractions
|
|
199
|
+
The nanoseconds of each value, from 0 to 999 999 999.
|
|
200
|
+
|
|
201
|
+
Returns
|
|
202
|
+
-------
|
|
203
|
+
NDArray
|
|
204
|
+
One text per value, such as ``".000001500"`` or ``""``.
|
|
205
|
+
|
|
206
|
+
Examples
|
|
207
|
+
--------
|
|
208
|
+
>>> import numpy
|
|
209
|
+
>>> from numdaplot.arrays.conversion.time_text import format_fractions
|
|
210
|
+
>>> format_fractions(numpy.array([0, 1500])).tolist()
|
|
211
|
+
['', '.000001500']
|
|
212
|
+
"""
|
|
213
|
+
number_texts = fractions.astype(str)
|
|
214
|
+
digit_texts = numpy.strings.zfill(number_texts, NANOSECOND_DIGITS)
|
|
215
|
+
fraction_texts = join_texts(FRACTION_SEPARATOR, digit_texts)
|
|
216
|
+
has_fraction = fractions != 0
|
|
217
|
+
shown_fractions = numpy.where(has_fraction, fraction_texts, "")
|
|
218
|
+
|
|
219
|
+
return shown_fractions
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def join_texts(left_texts: NDArray[Any] | str, right_texts: NDArray[Any] | str) -> NDArray[numpy.str_]:
|
|
223
|
+
"""
|
|
224
|
+
Return texts joined value by value.
|
|
225
|
+
|
|
226
|
+
.. versionadded:: 0.1.0
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
left_texts
|
|
231
|
+
Texts, or a single text joined to every value.
|
|
232
|
+
right_texts
|
|
233
|
+
Texts, or a single text joined to every value.
|
|
234
|
+
|
|
235
|
+
Returns
|
|
236
|
+
-------
|
|
237
|
+
NDArray[numpy.str_]
|
|
238
|
+
Each left text followed by its right text.
|
|
239
|
+
|
|
240
|
+
Examples
|
|
241
|
+
--------
|
|
242
|
+
>>> import numpy
|
|
243
|
+
>>> from numdaplot.arrays.conversion.time_text import join_texts
|
|
244
|
+
>>> join_texts(numpy.array(["1", "2"]), " days").tolist()
|
|
245
|
+
['1 days', '2 days']
|
|
246
|
+
"""
|
|
247
|
+
# Some versions of the numpy stubs leave the types of numpy.strings.add partially unknown.
|
|
248
|
+
string_functions = cast(Any, numpy.strings)
|
|
249
|
+
joined_texts = string_functions.add(left_texts, right_texts)
|
|
250
|
+
|
|
251
|
+
return joined_texts
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def format_times(values: NDArray[numpy.timedelta64]) -> NDArray[numpy.str_]:
|
|
255
|
+
"""
|
|
256
|
+
Return times of day stored as the time since midnight as texts, ``NaT`` where missing.
|
|
257
|
+
|
|
258
|
+
.. versionadded:: 0.1.0
|
|
259
|
+
|
|
260
|
+
Parameters
|
|
261
|
+
----------
|
|
262
|
+
values
|
|
263
|
+
Values in ``timedelta64[us]``, of any shape.
|
|
264
|
+
|
|
265
|
+
Returns
|
|
266
|
+
-------
|
|
267
|
+
NDArray[numpy.str_]
|
|
268
|
+
One text per value, of the same shape, such as ``15:35:00``.
|
|
269
|
+
|
|
270
|
+
Examples
|
|
271
|
+
--------
|
|
272
|
+
>>> import numpy
|
|
273
|
+
>>> from numdaplot.arrays.conversion.time_text import format_times
|
|
274
|
+
>>> format_times(numpy.array([56100000000, "NaT"], dtype="timedelta64[us]")).tolist()
|
|
275
|
+
['15:35:00', 'NaT']
|
|
276
|
+
"""
|
|
277
|
+
flat_values = values.ravel()
|
|
278
|
+
times = read_times(flat_values)
|
|
279
|
+
time_texts = list[str]()
|
|
280
|
+
for time_of_day in times:
|
|
281
|
+
time_text = NOT_A_TIME_TEXT
|
|
282
|
+
if time_of_day is not None:
|
|
283
|
+
time_text = write_time(time_of_day)
|
|
284
|
+
|
|
285
|
+
time_texts.append(time_text)
|
|
286
|
+
|
|
287
|
+
text_values = numpy.array(time_texts)
|
|
288
|
+
shaped_texts = text_values.reshape(values.shape)
|
|
289
|
+
|
|
290
|
+
return shaped_texts
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The year, the month and the day of the dates of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.operations.type_requirements import require_family
|
|
13
|
+
from numdaplot.data_types.value_family import ValueFamily
|
|
14
|
+
from numdaplot.errors.shape_mismatch_error import ShapeMismatchError
|
|
15
|
+
from numdaplot.settings.field_types import require_field_types
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from numdaplot.arrays.array import Array
|
|
19
|
+
|
|
20
|
+
DATE_PARTS_OPERATION = "from_date_parts"
|
|
21
|
+
NUMBER_FAMILIES = frozenset({ValueFamily.NUMBER})
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@dataclass(frozen=True, eq=False)
|
|
25
|
+
class DateParts:
|
|
26
|
+
"""
|
|
27
|
+
The year, the month and the day of each date, used by ``Array.from_date_parts``.
|
|
28
|
+
|
|
29
|
+
Each part is an Array of whole numbers, as integers or as decimals such as ``3.0``, all of the same shape. The
|
|
30
|
+
year is taken as written: ``25`` is the year 25.
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.1.0
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
year
|
|
37
|
+
The year of each date, from 1 to 9999.
|
|
38
|
+
month
|
|
39
|
+
The month of each date, from 1 to 12.
|
|
40
|
+
day
|
|
41
|
+
The day of each date, from 1 to the last day of its month.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
InvalidTypeError
|
|
46
|
+
When a setting is not of the type its annotation names.
|
|
47
|
+
IncompatibleTypesError
|
|
48
|
+
When a part does not hold numbers.
|
|
49
|
+
ShapeMismatchError
|
|
50
|
+
When the parts do not have the same shape.
|
|
51
|
+
|
|
52
|
+
Examples
|
|
53
|
+
--------
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> years = ndp.Array.from_list([2025, 2025])
|
|
56
|
+
>>> months = ndp.Array.from_list([3, 12])
|
|
57
|
+
>>> days = ndp.Array.from_list([15, 31])
|
|
58
|
+
>>> ndp.Array.from_date_parts(ndp.DateParts(year=years, month=months, day=days))
|
|
59
|
+
Array(['2025-03-15', '2025-12-31'], dtype=DATE)
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
year: Array
|
|
63
|
+
month: Array
|
|
64
|
+
day: Array
|
|
65
|
+
|
|
66
|
+
def __post_init__(self) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Check that each part holds numbers, and that the parts have the same shape.
|
|
69
|
+
|
|
70
|
+
.. versionadded:: 0.1.0
|
|
71
|
+
|
|
72
|
+
Raises
|
|
73
|
+
------
|
|
74
|
+
InvalidTypeError
|
|
75
|
+
When a setting is not of the type its annotation names.
|
|
76
|
+
IncompatibleTypesError
|
|
77
|
+
When a part does not hold numbers.
|
|
78
|
+
ShapeMismatchError
|
|
79
|
+
When the parts do not have the same shape.
|
|
80
|
+
"""
|
|
81
|
+
require_field_types(self)
|
|
82
|
+
|
|
83
|
+
year_dimensions = self.year.shape.dimensions
|
|
84
|
+
for part in (self.year, self.month, self.day):
|
|
85
|
+
part_values = part.to_numpy()
|
|
86
|
+
require_family(part_values, NUMBER_FAMILIES, DATE_PARTS_OPERATION)
|
|
87
|
+
part_dimensions = part.shape.dimensions
|
|
88
|
+
if part_dimensions != year_dimensions:
|
|
89
|
+
raise ShapeMismatchError(year_dimensions, part_dimensions)
|