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,257 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Removal of the rows or the columns of a Table holding missing values.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
import pandas
|
|
9
|
+
from numpy.typing import NDArray
|
|
10
|
+
|
|
11
|
+
from numdaplot.positions.axis import Axis
|
|
12
|
+
from numdaplot.tables.columns.column_names import require_known_columns
|
|
13
|
+
from numdaplot.tables.missing.missing_counts import (
|
|
14
|
+
COLUMN_SUM_AXIS,
|
|
15
|
+
ROW_SUM_AXIS,
|
|
16
|
+
divide_counts,
|
|
17
|
+
find_frame_missing,
|
|
18
|
+
)
|
|
19
|
+
from numdaplot.tables.missing.missing_drop import MissingDrop
|
|
20
|
+
from numdaplot.tables.missing.missing_mode import MissingMode
|
|
21
|
+
from numdaplot.tables.missing.missing_ratio import MissingRatio
|
|
22
|
+
from numdaplot.tables.missing.ratio_comparison import RatioComparison
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def drop_frame_missing(frame: pandas.DataFrame, missing_drop: MissingDrop, axis: Axis) -> pandas.DataFrame:
|
|
26
|
+
"""
|
|
27
|
+
Return a Table without its rows or its columns holding too many missing values.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
frame
|
|
34
|
+
The columns of a Table.
|
|
35
|
+
missing_drop
|
|
36
|
+
The columns looked at and the rule deciding what is removed.
|
|
37
|
+
axis
|
|
38
|
+
``EACH_ROW`` to remove rows, ``EACH_COLUMN`` to remove columns.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
pandas.DataFrame
|
|
43
|
+
The remaining rows, in their order and numbered from 0, or the remaining columns, in their order.
|
|
44
|
+
|
|
45
|
+
Raises
|
|
46
|
+
------
|
|
47
|
+
ColumnNotFoundError
|
|
48
|
+
When a looked at column does not exist.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import pandas
|
|
53
|
+
>>> import numdaplot as ndp
|
|
54
|
+
>>> from numdaplot.tables.missing.missing_removal import drop_frame_missing
|
|
55
|
+
>>> frame = pandas.DataFrame({"price": [1.5, None, 3.0]})
|
|
56
|
+
>>> drop_frame_missing(frame, ndp.MissingDrop(), ndp.Axis.EACH_ROW)
|
|
57
|
+
price
|
|
58
|
+
0 1.5
|
|
59
|
+
1 3.0
|
|
60
|
+
"""
|
|
61
|
+
looked_names = [str(column_name) for column_name in frame.columns]
|
|
62
|
+
if missing_drop.columns is not None:
|
|
63
|
+
require_known_columns(missing_drop.columns, looked_names)
|
|
64
|
+
looked_names = missing_drop.columns
|
|
65
|
+
|
|
66
|
+
looked_frame = frame[looked_names]
|
|
67
|
+
if axis == Axis.EACH_COLUMN:
|
|
68
|
+
remaining_columns = drop_missing_columns(frame, looked_frame, missing_drop.rule)
|
|
69
|
+
return remaining_columns
|
|
70
|
+
|
|
71
|
+
remaining_rows = drop_missing_rows(frame, looked_frame, missing_drop.rule)
|
|
72
|
+
|
|
73
|
+
return remaining_rows
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def drop_missing_rows(
|
|
77
|
+
frame: pandas.DataFrame,
|
|
78
|
+
looked_frame: pandas.DataFrame,
|
|
79
|
+
rule: MissingMode | MissingRatio,
|
|
80
|
+
) -> pandas.DataFrame:
|
|
81
|
+
"""
|
|
82
|
+
Return a Table without the rows holding too many missing values in some of its columns.
|
|
83
|
+
|
|
84
|
+
.. versionadded:: 0.1.0
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
frame
|
|
89
|
+
The columns of a Table.
|
|
90
|
+
looked_frame
|
|
91
|
+
The columns whose missing values are counted on each row.
|
|
92
|
+
rule
|
|
93
|
+
How many missing values make a row removed.
|
|
94
|
+
|
|
95
|
+
Returns
|
|
96
|
+
-------
|
|
97
|
+
pandas.DataFrame
|
|
98
|
+
The remaining rows, in their order, numbered from 0.
|
|
99
|
+
|
|
100
|
+
Examples
|
|
101
|
+
--------
|
|
102
|
+
>>> import pandas
|
|
103
|
+
>>> import numdaplot as ndp
|
|
104
|
+
>>> from numdaplot.tables.missing.missing_removal import drop_missing_rows
|
|
105
|
+
>>> frame = pandas.DataFrame({"price": [1.5, None], "stock": [None, None]}, dtype="float64")
|
|
106
|
+
>>> drop_missing_rows(frame, frame, ndp.MissingMode.ALL)
|
|
107
|
+
price stock
|
|
108
|
+
0 1.5 NaN
|
|
109
|
+
"""
|
|
110
|
+
missing_grid = find_frame_missing(looked_frame)
|
|
111
|
+
row_counts = missing_grid.sum(axis=ROW_SUM_AXIS, dtype=numpy.int64)
|
|
112
|
+
looked_column_count = len(looked_frame.columns)
|
|
113
|
+
dropped = find_dropped(row_counts, looked_column_count, rule)
|
|
114
|
+
kept = ~dropped
|
|
115
|
+
kept_frame = frame[kept]
|
|
116
|
+
numbered_frame = kept_frame.reset_index(drop=True)
|
|
117
|
+
|
|
118
|
+
return numbered_frame
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def drop_missing_columns(
|
|
122
|
+
frame: pandas.DataFrame,
|
|
123
|
+
looked_frame: pandas.DataFrame,
|
|
124
|
+
rule: MissingMode | MissingRatio,
|
|
125
|
+
) -> pandas.DataFrame:
|
|
126
|
+
"""
|
|
127
|
+
Return a Table without the columns holding too many missing values, among some of its columns.
|
|
128
|
+
|
|
129
|
+
.. versionadded:: 0.1.0
|
|
130
|
+
|
|
131
|
+
Parameters
|
|
132
|
+
----------
|
|
133
|
+
frame
|
|
134
|
+
The columns of a Table.
|
|
135
|
+
looked_frame
|
|
136
|
+
The columns that may be removed.
|
|
137
|
+
rule
|
|
138
|
+
How many missing values make a column removed.
|
|
139
|
+
|
|
140
|
+
Returns
|
|
141
|
+
-------
|
|
142
|
+
pandas.DataFrame
|
|
143
|
+
The remaining columns, in their order.
|
|
144
|
+
|
|
145
|
+
Examples
|
|
146
|
+
--------
|
|
147
|
+
>>> import pandas
|
|
148
|
+
>>> import numdaplot as ndp
|
|
149
|
+
>>> from numdaplot.tables.missing.missing_removal import drop_missing_columns
|
|
150
|
+
>>> frame = pandas.DataFrame({"price": [1.5, None], "stock": [None, None]}, dtype="float64")
|
|
151
|
+
>>> drop_missing_columns(frame, frame, ndp.MissingMode.ALL)
|
|
152
|
+
price
|
|
153
|
+
0 1.5
|
|
154
|
+
1 NaN
|
|
155
|
+
"""
|
|
156
|
+
missing_grid = find_frame_missing(looked_frame)
|
|
157
|
+
column_counts = missing_grid.sum(axis=COLUMN_SUM_AXIS, dtype=numpy.int64)
|
|
158
|
+
row_count = len(looked_frame)
|
|
159
|
+
dropped = find_dropped(column_counts, row_count, rule)
|
|
160
|
+
looked_names = [str(column_name) for column_name in looked_frame.columns]
|
|
161
|
+
dropped_names = [name for name, is_dropped in zip(looked_names, dropped, strict=True) if is_dropped]
|
|
162
|
+
remaining_frame = frame.drop(columns=dropped_names)
|
|
163
|
+
|
|
164
|
+
return remaining_frame
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def find_dropped(
|
|
168
|
+
counts: NDArray[numpy.int64],
|
|
169
|
+
value_count: int,
|
|
170
|
+
rule: MissingMode | MissingRatio,
|
|
171
|
+
) -> NDArray[numpy.bool_]:
|
|
172
|
+
"""
|
|
173
|
+
Return which rows or columns hold too many missing values.
|
|
174
|
+
|
|
175
|
+
.. versionadded:: 0.1.0
|
|
176
|
+
|
|
177
|
+
Parameters
|
|
178
|
+
----------
|
|
179
|
+
counts
|
|
180
|
+
The number of missing values of each row or column.
|
|
181
|
+
value_count
|
|
182
|
+
The number of values of each row or column.
|
|
183
|
+
rule
|
|
184
|
+
How many missing values make a row or a column removed.
|
|
185
|
+
|
|
186
|
+
Returns
|
|
187
|
+
-------
|
|
188
|
+
NDArray[numpy.bool_]
|
|
189
|
+
True at each row or column to remove, never True when there is no value.
|
|
190
|
+
|
|
191
|
+
Examples
|
|
192
|
+
--------
|
|
193
|
+
>>> import numpy
|
|
194
|
+
>>> import numdaplot as ndp
|
|
195
|
+
>>> from numdaplot.tables.missing.missing_removal import find_dropped
|
|
196
|
+
>>> find_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingMode.ALL)
|
|
197
|
+
array([False, False, True])
|
|
198
|
+
>>> find_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE))
|
|
199
|
+
array([False, False, True])
|
|
200
|
+
"""
|
|
201
|
+
if value_count == 0:
|
|
202
|
+
nothing_dropped = numpy.zeros(counts.shape, dtype=numpy.bool_)
|
|
203
|
+
return nothing_dropped
|
|
204
|
+
|
|
205
|
+
if isinstance(rule, MissingRatio):
|
|
206
|
+
ratio_dropped = find_ratio_dropped(counts, value_count, rule)
|
|
207
|
+
return ratio_dropped
|
|
208
|
+
|
|
209
|
+
if rule == MissingMode.ALL:
|
|
210
|
+
all_missing = counts == value_count
|
|
211
|
+
return all_missing
|
|
212
|
+
|
|
213
|
+
any_missing = counts > 0
|
|
214
|
+
|
|
215
|
+
return any_missing
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def find_ratio_dropped(
|
|
219
|
+
counts: NDArray[numpy.int64],
|
|
220
|
+
value_count: int,
|
|
221
|
+
missing_ratio: MissingRatio,
|
|
222
|
+
) -> NDArray[numpy.bool_]:
|
|
223
|
+
"""
|
|
224
|
+
Return which rows or columns reach a ratio of missing values.
|
|
225
|
+
|
|
226
|
+
.. versionadded:: 0.1.0
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
counts
|
|
231
|
+
The number of missing values of each row or column.
|
|
232
|
+
value_count
|
|
233
|
+
The number of values of each row or column, at least 1.
|
|
234
|
+
missing_ratio
|
|
235
|
+
The threshold and how a ratio is compared with it.
|
|
236
|
+
|
|
237
|
+
Returns
|
|
238
|
+
-------
|
|
239
|
+
NDArray[numpy.bool_]
|
|
240
|
+
True at each row or column whose ratio reaches the threshold.
|
|
241
|
+
|
|
242
|
+
Examples
|
|
243
|
+
--------
|
|
244
|
+
>>> import numpy
|
|
245
|
+
>>> import numdaplot as ndp
|
|
246
|
+
>>> from numdaplot.tables.missing.missing_removal import find_ratio_dropped
|
|
247
|
+
>>> find_ratio_dropped(numpy.array([0, 1, 2]), 2, ndp.MissingRatio(0.5))
|
|
248
|
+
array([False, True, True])
|
|
249
|
+
"""
|
|
250
|
+
ratios = divide_counts(counts, value_count)
|
|
251
|
+
if missing_ratio.comparison == RatioComparison.ABOVE:
|
|
252
|
+
above_ratio = ratios > missing_ratio.ratio
|
|
253
|
+
return above_ratio
|
|
254
|
+
|
|
255
|
+
at_least_ratio = ratios >= missing_ratio.ratio
|
|
256
|
+
|
|
257
|
+
return at_least_ratio
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Summary of the missing values of each column of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
import pandas
|
|
9
|
+
|
|
10
|
+
from numdaplot.tables.frames.column_values import find_column_type
|
|
11
|
+
from numdaplot.tables.frames.time_zones import name_column_type
|
|
12
|
+
from numdaplot.tables.missing.missing_counts import COLUMN_SUM_AXIS, divide_counts, find_frame_missing
|
|
13
|
+
|
|
14
|
+
COLUMN_NAMES_COLUMN = "column"
|
|
15
|
+
TYPE_NAMES_COLUMN = "type"
|
|
16
|
+
COUNTS_COLUMN = "missing_count"
|
|
17
|
+
RATIOS_COLUMN = "missing_ratio"
|
|
18
|
+
TOTAL_LABEL = "(all columns)"
|
|
19
|
+
TOTAL_TYPE_NAME = ""
|
|
20
|
+
SUMMARY_TEXT_DTYPE = "string"
|
|
21
|
+
PERCENT_FORMAT = "{percent:.1f} %"
|
|
22
|
+
PERCENT_FACTOR = 100
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def summarize_missing(frame: pandas.DataFrame) -> pandas.DataFrame:
|
|
26
|
+
"""
|
|
27
|
+
Return the number and the percentage of missing values of each column of a Table, then of the whole Table.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
frame
|
|
34
|
+
The columns of a Table.
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
pandas.DataFrame
|
|
39
|
+
One row per column, in order, then an ``(all columns)`` row, with the columns ``column``, ``type``,
|
|
40
|
+
``missing_count`` and ``missing_ratio``. The ratios are texts such as ``"12.5 %"``,
|
|
41
|
+
missing when there is no value.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import pandas
|
|
46
|
+
>>> from numdaplot.tables.missing.missing_summary import summarize_missing
|
|
47
|
+
>>> summarize_missing(pandas.DataFrame({"price": [1.5, None, 3.0], "stock": [2.0, 4.0, 1.0]}))
|
|
48
|
+
column type missing_count missing_ratio
|
|
49
|
+
0 price FLOAT64 1 33.3 %
|
|
50
|
+
1 stock FLOAT64 0 0.0 %
|
|
51
|
+
2 (all columns) 1 16.7 %
|
|
52
|
+
"""
|
|
53
|
+
missing_grid = find_frame_missing(frame)
|
|
54
|
+
row_count = len(frame)
|
|
55
|
+
column_counts = missing_grid.sum(axis=COLUMN_SUM_AXIS, dtype=numpy.int64)
|
|
56
|
+
column_ratios = divide_counts(column_counts, row_count)
|
|
57
|
+
missing_total = column_counts.sum(dtype=numpy.int64)
|
|
58
|
+
total_counts = numpy.array([missing_total], dtype=numpy.int64)
|
|
59
|
+
total_ratios = divide_counts(total_counts, missing_grid.size)
|
|
60
|
+
counts = numpy.concatenate([column_counts, total_counts])
|
|
61
|
+
ratios = numpy.concatenate([column_ratios, total_ratios])
|
|
62
|
+
ratio_texts = [format_ratio(ratio) for ratio in ratios]
|
|
63
|
+
summary_names = list_summary_names(frame)
|
|
64
|
+
type_names = list_summary_types(frame)
|
|
65
|
+
summary_columns = {
|
|
66
|
+
COLUMN_NAMES_COLUMN: summary_names,
|
|
67
|
+
TYPE_NAMES_COLUMN: type_names,
|
|
68
|
+
COUNTS_COLUMN: counts,
|
|
69
|
+
RATIOS_COLUMN: ratio_texts,
|
|
70
|
+
}
|
|
71
|
+
raw_summary = pandas.DataFrame(summary_columns)
|
|
72
|
+
summary_dtypes = dict.fromkeys([COLUMN_NAMES_COLUMN, TYPE_NAMES_COLUMN, RATIOS_COLUMN], SUMMARY_TEXT_DTYPE)
|
|
73
|
+
summary = raw_summary.astype(summary_dtypes)
|
|
74
|
+
|
|
75
|
+
return summary
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def list_summary_names(frame: pandas.DataFrame) -> list[str]:
|
|
79
|
+
"""
|
|
80
|
+
Return the labels of the rows of a summary: the names of the columns, then ``(all columns)``.
|
|
81
|
+
|
|
82
|
+
.. versionadded:: 0.1.0
|
|
83
|
+
|
|
84
|
+
Parameters
|
|
85
|
+
----------
|
|
86
|
+
frame
|
|
87
|
+
The columns of a Table.
|
|
88
|
+
|
|
89
|
+
Returns
|
|
90
|
+
-------
|
|
91
|
+
list[str]
|
|
92
|
+
One label per column, in order, then the label of the total row.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> import pandas
|
|
97
|
+
>>> from numdaplot.tables.missing.missing_summary import list_summary_names
|
|
98
|
+
>>> list_summary_names(pandas.DataFrame({"price": [1.5]}))
|
|
99
|
+
['price', '(all columns)']
|
|
100
|
+
"""
|
|
101
|
+
column_names = [str(column_name) for column_name in frame.columns]
|
|
102
|
+
summary_names = [*column_names, TOTAL_LABEL]
|
|
103
|
+
|
|
104
|
+
return summary_names
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def list_summary_types(frame: pandas.DataFrame) -> list[str]:
|
|
108
|
+
"""
|
|
109
|
+
Return the type names of the rows of a summary: the type of each column, then an empty text.
|
|
110
|
+
|
|
111
|
+
.. versionadded:: 0.1.0
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
frame
|
|
116
|
+
The columns of a Table.
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
list[str]
|
|
121
|
+
The ``ndp.Type`` name of each column, with its time zone when it has one, in order, then an empty
|
|
122
|
+
text for the total row.
|
|
123
|
+
|
|
124
|
+
Examples
|
|
125
|
+
--------
|
|
126
|
+
>>> import pandas
|
|
127
|
+
>>> from numdaplot.tables.missing.missing_summary import list_summary_types
|
|
128
|
+
>>> list_summary_types(pandas.DataFrame({"price": [1.5]}))
|
|
129
|
+
['FLOAT64', '']
|
|
130
|
+
"""
|
|
131
|
+
type_names = list[str]()
|
|
132
|
+
|
|
133
|
+
for column_name in frame.columns:
|
|
134
|
+
column = frame[column_name]
|
|
135
|
+
column_type = find_column_type(column)
|
|
136
|
+
type_name = name_column_type(column, column_type)
|
|
137
|
+
type_names.append(type_name)
|
|
138
|
+
|
|
139
|
+
type_names.append(TOTAL_TYPE_NAME)
|
|
140
|
+
|
|
141
|
+
return type_names
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def format_ratio(ratio: numpy.float64) -> str | None:
|
|
145
|
+
"""
|
|
146
|
+
Return a fraction written as a percentage with one decimal.
|
|
147
|
+
|
|
148
|
+
.. versionadded:: 0.1.0
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
ratio
|
|
153
|
+
A fraction between 0 and 1, or NaN when there is no value.
|
|
154
|
+
|
|
155
|
+
Returns
|
|
156
|
+
-------
|
|
157
|
+
str or None
|
|
158
|
+
The percentage, such as ``"12.5 %"``, or ``None`` for NaN.
|
|
159
|
+
|
|
160
|
+
Examples
|
|
161
|
+
--------
|
|
162
|
+
>>> import numpy
|
|
163
|
+
>>> from numdaplot.tables.missing.missing_summary import format_ratio
|
|
164
|
+
>>> format_ratio(numpy.float64(0.125))
|
|
165
|
+
'12.5 %'
|
|
166
|
+
"""
|
|
167
|
+
is_missing = bool(numpy.isnan(ratio))
|
|
168
|
+
if is_missing:
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
percent = ratio * PERCENT_FACTOR
|
|
172
|
+
ratio_text = PERCENT_FORMAT.format(percent=percent)
|
|
173
|
+
|
|
174
|
+
return ratio_text
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""
|
|
2
|
+
How a ratio of missing values is compared with its threshold.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RatioComparison(Enum):
|
|
11
|
+
"""
|
|
12
|
+
How a ratio of missing values is compared with its threshold, used by ``MissingRatio``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
|
|
20
|
+
>>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
|
|
21
|
+
>>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
|
|
22
|
+
>>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE)
|
|
23
|
+
>>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
|
|
24
|
+
price stock
|
|
25
|
+
FLOAT64 FLOAT64
|
|
26
|
+
0 120.0 3.0
|
|
27
|
+
1 NaN 5.0
|
|
28
|
+
2 80.0 NaN
|
|
29
|
+
3 NaN 2.0
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
AT_LEAST = auto()
|
|
33
|
+
"""
|
|
34
|
+
The ratio reaches the threshold or goes beyond it. Default value.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
|
|
40
|
+
>>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
|
|
41
|
+
>>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
|
|
42
|
+
>>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.AT_LEAST)
|
|
43
|
+
>>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
|
|
44
|
+
stock
|
|
45
|
+
FLOAT64
|
|
46
|
+
0 3.0
|
|
47
|
+
1 5.0
|
|
48
|
+
2 NaN
|
|
49
|
+
3 2.0
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
ABOVE = auto()
|
|
53
|
+
"""
|
|
54
|
+
The ratio goes beyond the threshold.
|
|
55
|
+
|
|
56
|
+
Examples
|
|
57
|
+
--------
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> prices = ndp.Array.from_list([120.0, None, 80.0, None])
|
|
60
|
+
>>> stocks = ndp.Array.from_list([3.0, 5.0, None, 2.0])
|
|
61
|
+
>>> table = ndp.Table.from_arrays({"price": prices, "stock": stocks})
|
|
62
|
+
>>> half = ndp.MissingRatio(0.5, comparison=ndp.RatioComparison.ABOVE)
|
|
63
|
+
>>> table.drop_missing(ndp.MissingDrop(rule=half), axis=ndp.Axis.EACH_COLUMN)
|
|
64
|
+
price stock
|
|
65
|
+
FLOAT64 FLOAT64
|
|
66
|
+
0 120.0 3.0
|
|
67
|
+
1 NaN 5.0
|
|
68
|
+
2 80.0 NaN
|
|
69
|
+
3 NaN 2.0
|
|
70
|
+
"""
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of a pivot table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.empty_list_error import EmptyListError
|
|
10
|
+
from numdaplot.errors.refused_setting_error import RefusedSettingError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
from numdaplot.tables.aggregation.calculation import Calculation
|
|
13
|
+
from numdaplot.tables.columns.column_names import require_column_name, require_column_names, require_unique_names
|
|
14
|
+
|
|
15
|
+
ROW_COLUMN_ITEM_NAME = "row column"
|
|
16
|
+
RESULT_NAME_SETTING = "the result_name of its calculation"
|
|
17
|
+
PIVOT_TABLE_NAME = "PivotTable"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class PivotTable:
|
|
22
|
+
"""
|
|
23
|
+
One row per group of rows and one column per value of a column, used by ``Table.pivot_table``.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
rows
|
|
30
|
+
The names of the columns whose values form the rows of the result: one row per combination of values, sorted,
|
|
31
|
+
with missing values as a group of their own, last. The pivot table keeps its own copy of the list.
|
|
32
|
+
columns
|
|
33
|
+
The name of the column whose values become the columns of the result, sorted. It cannot hold missing values.
|
|
34
|
+
The values are written as texts: ``"Paris"``, ``"8"`` for 8 and 8.0, ``"2.5"``, ``"2026-12-31"``.
|
|
35
|
+
calculation
|
|
36
|
+
The statistic of each cell. A combination without any row gives what the statistic gives without value: 0
|
|
37
|
+
for ``Count`` and ``Sum``, a missing value for ``Mean`` or ``Max``. Its ``result_name`` is refused, since each
|
|
38
|
+
result column is named after a value.
|
|
39
|
+
|
|
40
|
+
Raises
|
|
41
|
+
------
|
|
42
|
+
InvalidTypeError
|
|
43
|
+
When a setting is not of the type its annotation names.
|
|
44
|
+
EmptyListError
|
|
45
|
+
When ``rows`` is an empty list.
|
|
46
|
+
InvalidColumnNameError
|
|
47
|
+
When ``columns`` or a name in ``rows`` is an empty text.
|
|
48
|
+
DuplicateColumnError
|
|
49
|
+
When a name appears twice among ``rows`` and ``columns``.
|
|
50
|
+
RefusedSettingError
|
|
51
|
+
When the calculation has a ``result_name``.
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> import numdaplot as ndp
|
|
56
|
+
>>> hours = ndp.Array.from_list([8, 8, 9])
|
|
57
|
+
>>> weekdays = ndp.Array.from_list(["Mon", "Tue", "Mon"])
|
|
58
|
+
>>> fares = ndp.Array.from_list([7.0, 9.0, 5.0])
|
|
59
|
+
>>> trips = ndp.Table.from_arrays({"hour": hours, "weekday": weekdays, "fare": fares})
|
|
60
|
+
>>> total_fare = ndp.Calculation(column="fare", function=ndp.Sum())
|
|
61
|
+
>>> trips.pivot_table(ndp.PivotTable(rows=["hour"], columns="weekday", calculation=total_fare))
|
|
62
|
+
hour Mon Tue
|
|
63
|
+
INT64 FLOAT64 FLOAT64
|
|
64
|
+
0 8 7.0 9.0
|
|
65
|
+
1 9 5.0 0.0
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
rows: list[str]
|
|
69
|
+
columns: str
|
|
70
|
+
calculation: Calculation
|
|
71
|
+
|
|
72
|
+
def __post_init__(self) -> None:
|
|
73
|
+
"""
|
|
74
|
+
Check the names and the calculation, and replace ``rows`` with a copy that only the pivot table holds.
|
|
75
|
+
|
|
76
|
+
.. versionadded:: 0.1.0
|
|
77
|
+
|
|
78
|
+
Raises
|
|
79
|
+
------
|
|
80
|
+
InvalidTypeError
|
|
81
|
+
When a setting is not of the type its annotation names.
|
|
82
|
+
EmptyListError
|
|
83
|
+
When ``rows`` is an empty list.
|
|
84
|
+
InvalidColumnNameError
|
|
85
|
+
When ``columns`` or a name in ``rows`` is an empty text.
|
|
86
|
+
DuplicateColumnError
|
|
87
|
+
When a name appears twice among ``rows`` and ``columns``.
|
|
88
|
+
RefusedSettingError
|
|
89
|
+
When the calculation has a ``result_name``.
|
|
90
|
+
"""
|
|
91
|
+
require_field_types(self)
|
|
92
|
+
|
|
93
|
+
if self.rows == []:
|
|
94
|
+
raise EmptyListError(ROW_COLUMN_ITEM_NAME)
|
|
95
|
+
|
|
96
|
+
if self.calculation.result_name is not None:
|
|
97
|
+
raise RefusedSettingError(RESULT_NAME_SETTING, PIVOT_TABLE_NAME)
|
|
98
|
+
|
|
99
|
+
require_column_names(self.rows)
|
|
100
|
+
require_column_name(self.columns)
|
|
101
|
+
rows_copy = list(self.rows)
|
|
102
|
+
object.__setattr__(self, "rows", rows_copy)
|
|
103
|
+
grouping_names = [*rows_copy, self.columns]
|
|
104
|
+
require_unique_names(grouping_names)
|