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,321 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Columns stored by a Table, shared by every group of Table methods.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Never, Self
|
|
8
|
+
|
|
9
|
+
import pandas
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.type import Type
|
|
12
|
+
from numdaplot.dates.time_zone import TimeZone
|
|
13
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
14
|
+
from numdaplot.tables.columns.column_names import require_known_columns
|
|
15
|
+
from numdaplot.tables.files.column_names import ColumnNames
|
|
16
|
+
from numdaplot.tables.frames.cleaned_names import clean_frame_names
|
|
17
|
+
from numdaplot.tables.frames.column import Column
|
|
18
|
+
from numdaplot.tables.frames.column_values import find_column_type
|
|
19
|
+
from numdaplot.tables.frames.frame_normalization import normalize_frame
|
|
20
|
+
from numdaplot.tables.frames.time_columns import convert_outside_durations
|
|
21
|
+
from numdaplot.tables.frames.time_zones import find_column_time_zone
|
|
22
|
+
|
|
23
|
+
CONSTRUCTOR_OPERATION = "Creating a Table with ndp.Table(...)"
|
|
24
|
+
CONSTRUCTOR_ALTERNATIVE = "ndp.Table.from_arrays, from_pandas or a file method such as from_csv"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TableData:
|
|
28
|
+
"""
|
|
29
|
+
Columns stored by a Table, shared by every group of Table methods.
|
|
30
|
+
|
|
31
|
+
Use ``ndp.Table`` and its ``from_*`` methods; this base class only holds the columns.
|
|
32
|
+
|
|
33
|
+
.. versionadded:: 0.1.0
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
_frame: pandas.DataFrame
|
|
37
|
+
|
|
38
|
+
def __init__(self, *arguments: Never, **keyword_arguments: Never) -> None:
|
|
39
|
+
"""
|
|
40
|
+
Refuse the creation of a Table by its constructor: the ``from_*`` methods create Tables.
|
|
41
|
+
|
|
42
|
+
.. versionadded:: 0.1.0
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
arguments
|
|
47
|
+
Any value, refused.
|
|
48
|
+
keyword_arguments
|
|
49
|
+
Any named value, refused.
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
RefusedOperationError
|
|
54
|
+
Always, naming the ``from_*`` methods.
|
|
55
|
+
"""
|
|
56
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
def _create(cls, frame: pandas.DataFrame) -> Self:
|
|
60
|
+
"""
|
|
61
|
+
Return a new Table storing normalized columns without copy.
|
|
62
|
+
|
|
63
|
+
.. versionadded:: 0.1.0
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
frame
|
|
68
|
+
The columns, already stored with the dtypes given by ``to_pandas_dtype`` and numbered from 0,
|
|
69
|
+
never changed afterwards.
|
|
70
|
+
|
|
71
|
+
Returns
|
|
72
|
+
-------
|
|
73
|
+
Self
|
|
74
|
+
The new Table.
|
|
75
|
+
"""
|
|
76
|
+
created_table = cls.__new__(cls)
|
|
77
|
+
created_table._frame = frame
|
|
78
|
+
|
|
79
|
+
return created_table
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def row_count(self) -> int:
|
|
83
|
+
"""
|
|
84
|
+
Number of rows.
|
|
85
|
+
|
|
86
|
+
.. versionadded:: 0.1.0
|
|
87
|
+
|
|
88
|
+
Examples
|
|
89
|
+
--------
|
|
90
|
+
>>> import numdaplot as ndp
|
|
91
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5, 8.0])}).row_count
|
|
92
|
+
2
|
|
93
|
+
"""
|
|
94
|
+
row_count = len(self._frame)
|
|
95
|
+
|
|
96
|
+
return row_count
|
|
97
|
+
|
|
98
|
+
@property
|
|
99
|
+
def column_count(self) -> int:
|
|
100
|
+
"""
|
|
101
|
+
Number of columns.
|
|
102
|
+
|
|
103
|
+
.. versionadded:: 0.1.0
|
|
104
|
+
|
|
105
|
+
Examples
|
|
106
|
+
--------
|
|
107
|
+
>>> import numdaplot as ndp
|
|
108
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5, 8.0])}).column_count
|
|
109
|
+
1
|
|
110
|
+
"""
|
|
111
|
+
column_count = len(self._frame.columns)
|
|
112
|
+
|
|
113
|
+
return column_count
|
|
114
|
+
|
|
115
|
+
@property
|
|
116
|
+
def column_names(self) -> list[str]:
|
|
117
|
+
"""
|
|
118
|
+
Names of the columns, in order. Changing the returned list never changes the Table.
|
|
119
|
+
|
|
120
|
+
.. versionadded:: 0.1.0
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
>>> import numdaplot as ndp
|
|
125
|
+
>>> cities = ndp.Array.from_list(["Paris"])
|
|
126
|
+
>>> prices = ndp.Array.from_list([1.5])
|
|
127
|
+
>>> ndp.Table.from_arrays({"city": cities, "price": prices}).column_names
|
|
128
|
+
['city', 'price']
|
|
129
|
+
"""
|
|
130
|
+
column_names = [str(column_name) for column_name in self._frame.columns]
|
|
131
|
+
|
|
132
|
+
return column_names
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def column_types(self) -> dict[str, Type]:
|
|
136
|
+
"""
|
|
137
|
+
Type of each column, by column name, in the order of the columns.
|
|
138
|
+
|
|
139
|
+
.. versionadded:: 0.1.0
|
|
140
|
+
|
|
141
|
+
Examples
|
|
142
|
+
--------
|
|
143
|
+
>>> import numdaplot as ndp
|
|
144
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).column_types
|
|
145
|
+
{'price': <Type.FLOAT64: 10>}
|
|
146
|
+
"""
|
|
147
|
+
column_types = dict[str, Type]()
|
|
148
|
+
|
|
149
|
+
for column_name in self.column_names:
|
|
150
|
+
column = self._frame[column_name]
|
|
151
|
+
column_type = find_column_type(column)
|
|
152
|
+
column_types[column_name] = column_type
|
|
153
|
+
|
|
154
|
+
return column_types
|
|
155
|
+
|
|
156
|
+
@property
|
|
157
|
+
def column_time_zones(self) -> dict[str, TimeZone | None]:
|
|
158
|
+
"""
|
|
159
|
+
Time zone of each datetime column, by column name, ``None`` for a datetime column without zone.
|
|
160
|
+
|
|
161
|
+
Columns of other types are not listed.
|
|
162
|
+
|
|
163
|
+
.. versionadded:: 0.1.0
|
|
164
|
+
|
|
165
|
+
Examples
|
|
166
|
+
--------
|
|
167
|
+
>>> from datetime import datetime
|
|
168
|
+
>>> import numdaplot as ndp
|
|
169
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
170
|
+
>>> times.column_time_zones
|
|
171
|
+
{'time': None}
|
|
172
|
+
"""
|
|
173
|
+
column_time_zones = dict[str, TimeZone | None]()
|
|
174
|
+
|
|
175
|
+
for column_name in self.column_names:
|
|
176
|
+
column = self._frame[column_name]
|
|
177
|
+
column_type = find_column_type(column)
|
|
178
|
+
if column_type == Type.DATETIME:
|
|
179
|
+
column_time_zones[column_name] = find_column_time_zone(column)
|
|
180
|
+
|
|
181
|
+
return column_time_zones
|
|
182
|
+
|
|
183
|
+
@classmethod
|
|
184
|
+
def _from_frame(cls, frame: pandas.DataFrame) -> Self:
|
|
185
|
+
"""
|
|
186
|
+
Return a new Table holding the normalized copy of any pandas DataFrame.
|
|
187
|
+
|
|
188
|
+
.. versionadded:: 0.1.0
|
|
189
|
+
|
|
190
|
+
Parameters
|
|
191
|
+
----------
|
|
192
|
+
frame
|
|
193
|
+
Any pandas DataFrame, which is not changed.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
Self
|
|
198
|
+
The new Table.
|
|
199
|
+
|
|
200
|
+
Raises
|
|
201
|
+
------
|
|
202
|
+
InvalidColumnNameError, DuplicateColumnError, UnsupportedIndexError, UnsupportedTypeError
|
|
203
|
+
When the pandas DataFrame cannot become a Table, as in ``normalize_frame``.
|
|
204
|
+
"""
|
|
205
|
+
normalized_frame = normalize_frame(frame)
|
|
206
|
+
table = cls._create(normalized_frame)
|
|
207
|
+
|
|
208
|
+
return table
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def _from_read_frame(cls, frame: pandas.DataFrame, column_names: ColumnNames) -> Self:
|
|
212
|
+
"""
|
|
213
|
+
Return a new Table holding a DataFrame read from a file or given by the user, its names cleaned when asked.
|
|
214
|
+
|
|
215
|
+
.. versionadded:: 0.1.0
|
|
216
|
+
|
|
217
|
+
Parameters
|
|
218
|
+
----------
|
|
219
|
+
frame
|
|
220
|
+
A pandas DataFrame read from outside numdaplot, which is not changed.
|
|
221
|
+
column_names
|
|
222
|
+
Whether the spaces, tabs and line breaks at the start and the end of each name are removed.
|
|
223
|
+
|
|
224
|
+
Returns
|
|
225
|
+
-------
|
|
226
|
+
Self
|
|
227
|
+
The new Table.
|
|
228
|
+
|
|
229
|
+
Raises
|
|
230
|
+
------
|
|
231
|
+
DuplicateColumnError
|
|
232
|
+
When two names become the same once cleaned, or a name appears twice.
|
|
233
|
+
InvalidColumnNameError, UnsupportedIndexError, UnsupportedTypeError
|
|
234
|
+
When the pandas DataFrame cannot become a Table, as in ``normalize_frame``.
|
|
235
|
+
"""
|
|
236
|
+
cleaned_frame = clean_frame_names(frame, column_names)
|
|
237
|
+
duration_frame = convert_outside_durations(cleaned_frame)
|
|
238
|
+
table = cls._from_frame(duration_frame)
|
|
239
|
+
|
|
240
|
+
return table
|
|
241
|
+
|
|
242
|
+
def _wrap(self, frame: pandas.DataFrame) -> Self:
|
|
243
|
+
"""
|
|
244
|
+
Return a new Table of the same class holding other normalized columns.
|
|
245
|
+
|
|
246
|
+
.. versionadded:: 0.1.0
|
|
247
|
+
|
|
248
|
+
Parameters
|
|
249
|
+
----------
|
|
250
|
+
frame
|
|
251
|
+
The columns of the new Table, stored without copy.
|
|
252
|
+
|
|
253
|
+
Returns
|
|
254
|
+
-------
|
|
255
|
+
Self
|
|
256
|
+
The new Table.
|
|
257
|
+
"""
|
|
258
|
+
table_class = type(self)
|
|
259
|
+
wrapped_table = table_class._create(frame)
|
|
260
|
+
|
|
261
|
+
return wrapped_table
|
|
262
|
+
|
|
263
|
+
def _read_column(self, column_name: str) -> Column:
|
|
264
|
+
"""
|
|
265
|
+
Return a column of the Table.
|
|
266
|
+
|
|
267
|
+
.. versionadded:: 0.1.0
|
|
268
|
+
|
|
269
|
+
Parameters
|
|
270
|
+
----------
|
|
271
|
+
column_name
|
|
272
|
+
The name of the column.
|
|
273
|
+
|
|
274
|
+
Returns
|
|
275
|
+
-------
|
|
276
|
+
Column
|
|
277
|
+
The stored column, which must not be changed.
|
|
278
|
+
|
|
279
|
+
Raises
|
|
280
|
+
------
|
|
281
|
+
ColumnNotFoundError
|
|
282
|
+
When no column has this name.
|
|
283
|
+
"""
|
|
284
|
+
requested_names = [column_name]
|
|
285
|
+
require_known_columns(requested_names, self.column_names)
|
|
286
|
+
column = self._frame[column_name]
|
|
287
|
+
|
|
288
|
+
return column
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def read_stored_frame(table: TableData) -> pandas.DataFrame:
|
|
292
|
+
"""
|
|
293
|
+
Return the columns a Table stores, without copy, for the code of numdaplot that reads them.
|
|
294
|
+
|
|
295
|
+
Unlike ``Table.to_pandas``, times of day stay stored as the time since midnight.
|
|
296
|
+
|
|
297
|
+
.. versionadded:: 0.1.0
|
|
298
|
+
|
|
299
|
+
Parameters
|
|
300
|
+
----------
|
|
301
|
+
table
|
|
302
|
+
A Table.
|
|
303
|
+
|
|
304
|
+
Returns
|
|
305
|
+
-------
|
|
306
|
+
pandas.DataFrame
|
|
307
|
+
The stored columns, which must not be changed.
|
|
308
|
+
|
|
309
|
+
Examples
|
|
310
|
+
--------
|
|
311
|
+
>>> from datetime import time
|
|
312
|
+
>>> import numdaplot as ndp
|
|
313
|
+
>>> from numdaplot.tables.table_data import read_stored_frame
|
|
314
|
+
>>> hours = ndp.Table.from_arrays({"hour": ndp.Array.from_list([time(0, 1)])})
|
|
315
|
+
>>> read_stored_frame(hours).dtypes.tolist()
|
|
316
|
+
[dtype('<m8[us]')]
|
|
317
|
+
"""
|
|
318
|
+
# The function lives next to the class to read its stored columns on behalf of the rest of numdaplot.
|
|
319
|
+
stored_frame = table._frame # pyright: ignore[reportPrivateUsage]
|
|
320
|
+
|
|
321
|
+
return stored_frame
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Display of a few rows of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
8
|
+
from numdaplot.tables.preview.notebook_display import show_frame
|
|
9
|
+
from numdaplot.tables.preview.preview import Preview
|
|
10
|
+
from numdaplot.tables.preview.preview_rows import choose_preview_rows
|
|
11
|
+
from numdaplot.tables.table_data import TableData
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TableDisplay(TableData):
|
|
15
|
+
"""
|
|
16
|
+
Display of a few rows of a Table with ``preview``.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@checked_arguments
|
|
22
|
+
def preview(self, preview: Preview | None = None) -> None:
|
|
23
|
+
"""
|
|
24
|
+
Show a few rows, with their row numbers and the type of each column under its name.
|
|
25
|
+
|
|
26
|
+
In a Jupyter notebook the rows are shown as an HTML table, elsewhere as text. Every column is shown unless
|
|
27
|
+
the settings ask for a compact display. Nothing is returned.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
preview
|
|
34
|
+
How many rows, which ones, and how the columns are shown: the first 5, with every column, when omitted.
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
Raises
|
|
38
|
+
------
|
|
39
|
+
InvalidTypeError
|
|
40
|
+
When an argument is not of the type its annotation names.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([10.0, 20.0, 30.0])})
|
|
46
|
+
>>> table.preview(ndp.Preview(count=2, side=ndp.Side.END))
|
|
47
|
+
price
|
|
48
|
+
FLOAT64
|
|
49
|
+
1 20.0
|
|
50
|
+
2 30.0
|
|
51
|
+
"""
|
|
52
|
+
if preview is None:
|
|
53
|
+
preview = Preview()
|
|
54
|
+
|
|
55
|
+
preview_frame = choose_preview_rows(self._frame, preview)
|
|
56
|
+
show_frame(preview_frame, preview.columns)
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Join of a Table with another Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
10
|
+
from numdaplot.tables.joining.join import Join
|
|
11
|
+
from numdaplot.tables.joining.joined_frame import join_frames
|
|
12
|
+
from numdaplot.tables.table_data import TableData
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TableJoining(TableData):
|
|
16
|
+
"""
|
|
17
|
+
Join of a Table with another Table on the values of key columns, with ``join``.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@checked_arguments
|
|
23
|
+
def join(self, join: Join) -> Self:
|
|
24
|
+
"""
|
|
25
|
+
Return the rows of this Table and of another Table put side by side where their keys match.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
join
|
|
32
|
+
The other Table, the key columns, the rows kept, how the columns both Tables have are told apart, and
|
|
33
|
+
how many times each key may appear.
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
Self
|
|
38
|
+
A new Table: the keys, then the other columns of this Table, then those of the other Table. The rows of
|
|
39
|
+
this Table come first, in their order, each once per match, then the unmatched rows of the other Table
|
|
40
|
+
kept by the mode. Missing values fill the columns of a Table that has no matching row, each column
|
|
41
|
+
keeping its type.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
InvalidTypeError
|
|
46
|
+
When an argument is not of the type its annotation names.
|
|
47
|
+
ColumnNotFoundError
|
|
48
|
+
When a key is missing from one of the Tables.
|
|
49
|
+
IncompatibleTypesError
|
|
50
|
+
When the two columns of a key are of different families, of different types with ``KeyTypes.SAME_TYPE``,
|
|
51
|
+
or a date and a datetime: convert one of them first.
|
|
52
|
+
TimeZoneMismatchError
|
|
53
|
+
When the two columns of a key hold datetimes of different time zones, or with and without one: change
|
|
54
|
+
them first with ``TimeZoneChange``.
|
|
55
|
+
JoinRelationError
|
|
56
|
+
When a key is repeated in a Table where the ``relation`` of the join expects it once.
|
|
57
|
+
DuplicateColumnError
|
|
58
|
+
When both Tables have a column besides the keys and the join has no ``suffixes``, or a suffixed name is
|
|
59
|
+
already the name of another column.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> import numdaplot as ndp
|
|
64
|
+
>>> accidents = ndp.Table.from_arrays(
|
|
65
|
+
... {"Num_Acc": ndp.Array.from_list([101, 102]), "dep": ndp.Array.from_list(["75", "69"])}
|
|
66
|
+
... )
|
|
67
|
+
>>> users = ndp.Table.from_arrays(
|
|
68
|
+
... {"Num_Acc": ndp.Array.from_list([101, 101, 103]), "grav": ndp.Array.from_list([1, 3, 2])}
|
|
69
|
+
... )
|
|
70
|
+
>>> accidents.join(ndp.Join(other=users, keys=["Num_Acc"], mode=ndp.JoinMode.LEFT))
|
|
71
|
+
Num_Acc dep grav
|
|
72
|
+
INT64 TEXT INT64
|
|
73
|
+
0 101 75 1
|
|
74
|
+
1 101 75 3
|
|
75
|
+
2 102 69 <NA>
|
|
76
|
+
"""
|
|
77
|
+
joined_frame = join_frames(self._frame, join)
|
|
78
|
+
joined_table = self._wrap(joined_frame)
|
|
79
|
+
|
|
80
|
+
return joined_table
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Order and uniqueness of the rows of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
10
|
+
from numdaplot.tables.duplicates.deduplicated_frame import drop_duplicate_rows
|
|
11
|
+
from numdaplot.tables.duplicates.deduplication import Deduplication
|
|
12
|
+
from numdaplot.tables.sorting.sorted_frame import sort_frame
|
|
13
|
+
from numdaplot.tables.sorting.sorting import Sorting
|
|
14
|
+
from numdaplot.tables.table_data import TableData
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class TableLayout(TableData):
|
|
18
|
+
"""
|
|
19
|
+
Order and uniqueness of the rows of a Table with ``sort`` and ``drop_duplicates``.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
@checked_arguments
|
|
25
|
+
def sort(self, sorting: Sorting) -> Self:
|
|
26
|
+
"""
|
|
27
|
+
Return the rows sorted by one or several columns.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
sorting
|
|
34
|
+
The sort keys, each with its order and the place of its missing values.
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
Self
|
|
39
|
+
A new Table, rows numbered from 0. Rows equal on every key keep their order.
|
|
40
|
+
|
|
41
|
+
Raises
|
|
42
|
+
------
|
|
43
|
+
InvalidTypeError
|
|
44
|
+
When an argument is not of the type its annotation names.
|
|
45
|
+
ColumnNotFoundError
|
|
46
|
+
When a key names a column the Table does not have.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numdaplot as ndp
|
|
51
|
+
>>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([20.0, 10.0, 30.0])})
|
|
52
|
+
>>> table.sort(ndp.Sorting(keys=[ndp.SortKey(column="price", order=ndp.Order.DESCENDING)]))
|
|
53
|
+
price
|
|
54
|
+
FLOAT64
|
|
55
|
+
0 30.0
|
|
56
|
+
1 20.0
|
|
57
|
+
2 10.0
|
|
58
|
+
"""
|
|
59
|
+
sorted_frame = sort_frame(self._frame, sorting)
|
|
60
|
+
sorted_table = self._wrap(sorted_frame)
|
|
61
|
+
|
|
62
|
+
return sorted_table
|
|
63
|
+
|
|
64
|
+
@checked_arguments
|
|
65
|
+
def drop_duplicates(self, deduplication: Deduplication | None = None) -> Self:
|
|
66
|
+
"""
|
|
67
|
+
Return the Table without its duplicated rows.
|
|
68
|
+
|
|
69
|
+
.. versionadded:: 0.1.0
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
deduplication
|
|
74
|
+
The compared columns, every column when omitted, and the row kept in each group.
|
|
75
|
+
Two missing values are equal.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
Self
|
|
80
|
+
A new Table, remaining rows in their order, numbered from 0.
|
|
81
|
+
|
|
82
|
+
Raises
|
|
83
|
+
------
|
|
84
|
+
InvalidTypeError
|
|
85
|
+
When an argument is not of the type its annotation names.
|
|
86
|
+
ColumnNotFoundError
|
|
87
|
+
When a compared column does not exist.
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
--------
|
|
91
|
+
>>> import numdaplot as ndp
|
|
92
|
+
>>> table = ndp.Table.from_arrays({"city": ndp.Array.from_list(["Pau", "Lyon", "Pau"])})
|
|
93
|
+
>>> table.drop_duplicates()
|
|
94
|
+
city
|
|
95
|
+
TEXT
|
|
96
|
+
0 Pau
|
|
97
|
+
1 Lyon
|
|
98
|
+
"""
|
|
99
|
+
if deduplication is None:
|
|
100
|
+
deduplication = Deduplication()
|
|
101
|
+
|
|
102
|
+
remaining_frame = drop_duplicate_rows(self._frame, deduplication)
|
|
103
|
+
remaining_table = self._wrap(remaining_frame)
|
|
104
|
+
|
|
105
|
+
return remaining_table
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Missing values of a Table: count, summary and removal.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from numdaplot.positions.axis import Axis
|
|
10
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
11
|
+
from numdaplot.tables.missing.missing_count import MissingCount
|
|
12
|
+
from numdaplot.tables.missing.missing_counts import count_frame_missing
|
|
13
|
+
from numdaplot.tables.missing.missing_drop import MissingDrop
|
|
14
|
+
from numdaplot.tables.missing.missing_removal import drop_frame_missing
|
|
15
|
+
from numdaplot.tables.missing.missing_summary import summarize_missing
|
|
16
|
+
from numdaplot.tables.preview.notebook_display import show_pandas_frame
|
|
17
|
+
from numdaplot.tables.table_data import TableData
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class TableMissing(TableData):
|
|
21
|
+
"""
|
|
22
|
+
Missing values of a Table with ``count_missing``, ``preview_missing`` and ``drop_missing``.
|
|
23
|
+
|
|
24
|
+
.. versionadded:: 0.1.0
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
@checked_arguments
|
|
28
|
+
def count_missing(self, missing_count: MissingCount | None = None, axis: Axis | None = None) -> Self:
|
|
29
|
+
"""
|
|
30
|
+
Return the number or the ratio of missing values, for the whole Table, each row or each column.
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.1.0
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
missing_count
|
|
37
|
+
The measure, the number of missing values when omitted.
|
|
38
|
+
axis
|
|
39
|
+
One count per row with ``Axis.EACH_ROW``, one per column with ``Axis.EACH_COLUMN``, a single count for
|
|
40
|
+
the whole Table when omitted.
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
Self
|
|
45
|
+
A new Table with a ``missing_count`` column, or ``missing_ratio`` for ``Measure.RATIO``:
|
|
46
|
+
one row for the whole Table, read with ``to_value``, one row per row, or one row per column after
|
|
47
|
+
a ``column`` column naming it. A ratio is missing when there is no value to count.
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
InvalidTypeError
|
|
53
|
+
When an argument is not of the type its annotation names.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import numdaplot as ndp
|
|
58
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Nice"])
|
|
59
|
+
>>> prices = ndp.Array.from_list([120.0, None, None, 90.0])
|
|
60
|
+
>>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
61
|
+
>>> table.count_missing().to_value()
|
|
62
|
+
2
|
|
63
|
+
>>> table.count_missing(ndp.MissingCount(measure=ndp.Measure.RATIO), axis=ndp.Axis.EACH_COLUMN)
|
|
64
|
+
column missing_ratio
|
|
65
|
+
TEXT FLOAT64
|
|
66
|
+
0 city 0.0
|
|
67
|
+
1 price 0.5
|
|
68
|
+
"""
|
|
69
|
+
if missing_count is None:
|
|
70
|
+
missing_count = MissingCount()
|
|
71
|
+
|
|
72
|
+
count_frame = count_frame_missing(self._frame, missing_count, axis)
|
|
73
|
+
count_table = self._wrap(count_frame)
|
|
74
|
+
|
|
75
|
+
return count_table
|
|
76
|
+
|
|
77
|
+
def preview_missing(self) -> None:
|
|
78
|
+
"""
|
|
79
|
+
Show the number and the percentage of missing values of each column, then of the whole Table.
|
|
80
|
+
|
|
81
|
+
In a Jupyter notebook the summary is shown as an HTML table, elsewhere as text. Nothing is returned:
|
|
82
|
+
use ``count_missing`` to compute with these numbers.
|
|
83
|
+
|
|
84
|
+
.. versionadded:: 0.1.0
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> import numdaplot as ndp
|
|
89
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
90
|
+
>>> prices = ndp.Array.from_list([120.0, None, 150.0])
|
|
91
|
+
>>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
92
|
+
>>> table.preview_missing()
|
|
93
|
+
column type missing_count missing_ratio
|
|
94
|
+
0 city TEXT 0 0.0 %
|
|
95
|
+
1 price FLOAT64 1 33.3 %
|
|
96
|
+
2 (all columns) 1 16.7 %
|
|
97
|
+
"""
|
|
98
|
+
summary = summarize_missing(self._frame)
|
|
99
|
+
show_pandas_frame(summary)
|
|
100
|
+
|
|
101
|
+
@checked_arguments
|
|
102
|
+
def drop_missing(self, missing_drop: MissingDrop | None = None, axis: Axis = Axis.EACH_ROW) -> Self:
|
|
103
|
+
"""
|
|
104
|
+
Return the Table without its rows, or its columns, holding missing values.
|
|
105
|
+
|
|
106
|
+
.. versionadded:: 0.1.0
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
----------
|
|
110
|
+
missing_drop
|
|
111
|
+
The columns looked at and how many missing values are needed: a single one in any column when
|
|
112
|
+
omitted.
|
|
113
|
+
axis
|
|
114
|
+
``Axis.EACH_ROW`` by default to remove rows, ``Axis.EACH_COLUMN`` to remove columns.
|
|
115
|
+
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
Self
|
|
119
|
+
A new Table, remaining rows in their order and numbered from 0, or remaining columns in their order.
|
|
120
|
+
|
|
121
|
+
Raises
|
|
122
|
+
------
|
|
123
|
+
InvalidTypeError
|
|
124
|
+
When an argument is not of the type its annotation names.
|
|
125
|
+
ColumnNotFoundError
|
|
126
|
+
When a looked at column does not exist.
|
|
127
|
+
|
|
128
|
+
Examples
|
|
129
|
+
--------
|
|
130
|
+
>>> import numdaplot as ndp
|
|
131
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
132
|
+
>>> prices = ndp.Array.from_list([120.0, None, 150.0])
|
|
133
|
+
>>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
134
|
+
>>> table.drop_missing()
|
|
135
|
+
city price
|
|
136
|
+
TEXT FLOAT64
|
|
137
|
+
0 Paris 120.0
|
|
138
|
+
1 Pau 150.0
|
|
139
|
+
"""
|
|
140
|
+
if missing_drop is None:
|
|
141
|
+
missing_drop = MissingDrop()
|
|
142
|
+
|
|
143
|
+
remaining_frame = drop_frame_missing(self._frame, missing_drop, axis)
|
|
144
|
+
remaining_table = self._wrap(remaining_frame)
|
|
145
|
+
|
|
146
|
+
return remaining_table
|