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,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A statistic computed on a column of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.field_types import require_field_types
|
|
10
|
+
from numdaplot.statistics.statistic import Statistic
|
|
11
|
+
from numdaplot.tables.aggregation.statistic_name import name_statistic
|
|
12
|
+
from numdaplot.tables.columns.column_names import require_column_name
|
|
13
|
+
|
|
14
|
+
RESULT_NAME = "{column}_{function}"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Calculation:
|
|
19
|
+
"""
|
|
20
|
+
A statistic computed on a column of a Table, used by ``Aggregation``.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
column
|
|
27
|
+
The name of the column.
|
|
28
|
+
function
|
|
29
|
+
A ``Statistic``, such as ``ndp.Mean()`` or ``ndp.Quantile(0.9)``: see ``Statistic`` for every statistic.
|
|
30
|
+
Missing values are ignored, unless ``Count`` is set to include them.
|
|
31
|
+
result_name
|
|
32
|
+
The name of the result column. When omitted, it is ``<column>_<function>``, such as ``"price_mean"``
|
|
33
|
+
``"price_quantile_90"`` or ``"price_count_excluded"``.
|
|
34
|
+
|
|
35
|
+
Raises
|
|
36
|
+
------
|
|
37
|
+
InvalidTypeError
|
|
38
|
+
When a setting is not of the type its annotation names.
|
|
39
|
+
InvalidColumnNameError
|
|
40
|
+
When ``column`` is an empty text.
|
|
41
|
+
InvalidColumnNameError
|
|
42
|
+
When ``result_name`` is an empty text.
|
|
43
|
+
RefusedOperationError
|
|
44
|
+
When ``function`` is not a statistic of numdaplot.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
50
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
51
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
52
|
+
>>> total = ndp.Calculation(column="price", function=ndp.Sum())
|
|
53
|
+
>>> highest = ndp.Calculation(column="price", function=ndp.Max(), result_name="highest_price")
|
|
54
|
+
>>> sales.aggregate(ndp.Aggregation(calculations=[total, highest]))
|
|
55
|
+
price_sum highest_price
|
|
56
|
+
FLOAT64 FLOAT64
|
|
57
|
+
0 350.0 150.0
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
column: str
|
|
61
|
+
function: Statistic
|
|
62
|
+
result_name: str | None = None
|
|
63
|
+
|
|
64
|
+
def __post_init__(self) -> None:
|
|
65
|
+
"""
|
|
66
|
+
Check that the result name, given or automatic, is valid.
|
|
67
|
+
|
|
68
|
+
.. versionadded:: 0.1.0
|
|
69
|
+
|
|
70
|
+
Raises
|
|
71
|
+
------
|
|
72
|
+
InvalidTypeError
|
|
73
|
+
When a setting is not of the type its annotation names.
|
|
74
|
+
InvalidColumnNameError
|
|
75
|
+
When ``column`` is an empty text.
|
|
76
|
+
InvalidColumnNameError
|
|
77
|
+
When ``result_name`` is an empty text.
|
|
78
|
+
RefusedOperationError
|
|
79
|
+
When ``function`` is not a statistic of numdaplot.
|
|
80
|
+
"""
|
|
81
|
+
require_field_types(self)
|
|
82
|
+
|
|
83
|
+
require_column_name(self.column)
|
|
84
|
+
|
|
85
|
+
result_name = find_result_name(self)
|
|
86
|
+
require_column_name(result_name)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def find_result_name(calculation: Calculation) -> str:
|
|
90
|
+
"""
|
|
91
|
+
Return the name of the column holding the result of a calculation.
|
|
92
|
+
|
|
93
|
+
.. versionadded:: 0.1.0
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
calculation
|
|
98
|
+
The calculation.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
str
|
|
103
|
+
The given result name, or ``<column>_<function>``.
|
|
104
|
+
|
|
105
|
+
Raises
|
|
106
|
+
------
|
|
107
|
+
RefusedOperationError
|
|
108
|
+
When the statistic is not a statistic of numdaplot and no result name is given.
|
|
109
|
+
|
|
110
|
+
Examples
|
|
111
|
+
--------
|
|
112
|
+
>>> import numdaplot as ndp
|
|
113
|
+
>>> from numdaplot.tables.aggregation.calculation import find_result_name
|
|
114
|
+
>>> find_result_name(ndp.Calculation(column="price", function=ndp.Quantile(0.9)))
|
|
115
|
+
'price_quantile_90'
|
|
116
|
+
"""
|
|
117
|
+
if calculation.result_name is not None:
|
|
118
|
+
return calculation.result_name
|
|
119
|
+
|
|
120
|
+
function_name = name_statistic(calculation.function)
|
|
121
|
+
result_name = RESULT_NAME.format(column=calculation.column, function=function_name)
|
|
122
|
+
|
|
123
|
+
return result_name
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Columns holding the results of statistics.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.calculation.statistic_values import compute_statistic
|
|
13
|
+
from numdaplot.errors.empty_array_error import EmptyArrayError
|
|
14
|
+
from numdaplot.statistics.count import Count
|
|
15
|
+
from numdaplot.statistics.counted_missing import CountedMissing
|
|
16
|
+
from numdaplot.statistics.statistic import Statistic
|
|
17
|
+
from numdaplot.tables.frames.column import Column
|
|
18
|
+
from numdaplot.tables.frames.column_values import build_column, build_column_with_missing
|
|
19
|
+
|
|
20
|
+
MISSING_RESULT = numpy.nan
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def compute_cell(present_values: NDArray[Any], statistic: Statistic, value_count: int) -> NDArray[Any] | None:
|
|
24
|
+
"""
|
|
25
|
+
Return a statistic of present values, or nothing when it needs a value and there is none.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
present_values
|
|
32
|
+
One-dimensional values without missing value.
|
|
33
|
+
statistic
|
|
34
|
+
Any statistic of numdaplot.
|
|
35
|
+
value_count
|
|
36
|
+
The number of values before the missing ones were left out, the result of a ``Count`` including them.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
NDArray or None
|
|
41
|
+
The result as a one-value array, ``None`` when the statistic needs a value and there is none.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
IncompatibleTypesError
|
|
46
|
+
When the statistic does not apply to the type of the values.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numpy
|
|
51
|
+
>>> import numdaplot as ndp
|
|
52
|
+
>>> from numdaplot.tables.aggregation.result_column import compute_cell
|
|
53
|
+
>>> compute_cell(numpy.array([10.0, 30.0]), ndp.Mean(), 3)
|
|
54
|
+
array([20.])
|
|
55
|
+
>>> print(compute_cell(numpy.array([], dtype=float), ndp.Mean(), 1))
|
|
56
|
+
None
|
|
57
|
+
>>> compute_cell(numpy.array([10.0, 30.0]), ndp.Count(missing=ndp.CountedMissing.INCLUDED), 3)
|
|
58
|
+
array([3])
|
|
59
|
+
"""
|
|
60
|
+
counts_every_value = isinstance(statistic, Count) and statistic.missing == CountedMissing.INCLUDED
|
|
61
|
+
if counts_every_value:
|
|
62
|
+
every_value_count = numpy.array([value_count])
|
|
63
|
+
return every_value_count
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
result = compute_statistic(present_values, statistic, None)
|
|
67
|
+
except EmptyArrayError:
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
return result
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def build_result_column(results: list[NDArray[Any] | None]) -> Column:
|
|
74
|
+
"""
|
|
75
|
+
Return a Table column holding one result per row, missing where there is no result.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
results
|
|
82
|
+
One one-value array per row, or ``None`` for a missing result.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
Column
|
|
87
|
+
The column, ``FLOAT64`` when no row has a result.
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
--------
|
|
91
|
+
>>> import numpy
|
|
92
|
+
>>> from numdaplot.tables.aggregation.result_column import build_result_column
|
|
93
|
+
>>> build_result_column([numpy.array([2]), None]).tolist()
|
|
94
|
+
[2, <NA>]
|
|
95
|
+
"""
|
|
96
|
+
missing_results = [result is None for result in results]
|
|
97
|
+
missing = numpy.array(missing_results, dtype=numpy.bool_)
|
|
98
|
+
present_results = [result for result in results if result is not None]
|
|
99
|
+
if present_results == []:
|
|
100
|
+
result_count = len(results)
|
|
101
|
+
missing_values = numpy.full(result_count, MISSING_RESULT)
|
|
102
|
+
missing_column = build_column(missing_values)
|
|
103
|
+
return missing_column
|
|
104
|
+
|
|
105
|
+
present_values = numpy.concatenate(present_results)
|
|
106
|
+
result_column = build_column_with_missing(present_values, missing)
|
|
107
|
+
|
|
108
|
+
return result_column
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Groups of rows of a Table sharing the same values in some columns.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
import pandas
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
STABLE_SORT = "stable"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def find_row_groups(frame: pandas.DataFrame, group_by: list[str] | None) -> list[NDArray[Any]]:
|
|
17
|
+
"""
|
|
18
|
+
Return the rows of each group, groups sorted by their values, the group of missing values last.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
frame
|
|
25
|
+
The columns of a Table.
|
|
26
|
+
group_by
|
|
27
|
+
The names of the columns forming the groups, or ``None`` for a single group of every row.
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
list[NDArray]
|
|
32
|
+
The positions of the rows of each group, in the order of the Table.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import pandas
|
|
37
|
+
>>> from numdaplot.tables.aggregation.row_groups import find_row_groups
|
|
38
|
+
>>> find_row_groups(pandas.DataFrame({"city": ["Pau", "Lyon", "Pau"]}), ["city"])
|
|
39
|
+
[array([1]), array([0, 2])]
|
|
40
|
+
"""
|
|
41
|
+
row_count = len(frame)
|
|
42
|
+
if group_by is None:
|
|
43
|
+
every_row = numpy.arange(row_count)
|
|
44
|
+
return [every_row]
|
|
45
|
+
|
|
46
|
+
# Some versions of the pandas stubs leave the parameter types of groupby unknown.
|
|
47
|
+
grouped_frame = cast(Any, frame)
|
|
48
|
+
grouped_rows = grouped_frame.groupby(group_by, sort=True, dropna=False, observed=True)
|
|
49
|
+
group_count = cast(int, grouped_rows.ngroups)
|
|
50
|
+
if group_count == 0:
|
|
51
|
+
return []
|
|
52
|
+
|
|
53
|
+
raw_group_numbers = grouped_rows.ngroup()
|
|
54
|
+
group_number_column = cast("pandas.Series[int]", raw_group_numbers)
|
|
55
|
+
group_numbers = group_number_column.to_numpy()
|
|
56
|
+
every_row = numpy.arange(row_count)
|
|
57
|
+
row_groups = split_positions(every_row, group_numbers, group_count)
|
|
58
|
+
|
|
59
|
+
return row_groups
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def split_positions(positions: NDArray[Any], group_numbers: NDArray[Any], group_count: int) -> list[NDArray[Any]]:
|
|
63
|
+
"""
|
|
64
|
+
Return the positions of each group, in their order, a group without position being empty.
|
|
65
|
+
|
|
66
|
+
.. versionadded:: 0.1.0
|
|
67
|
+
|
|
68
|
+
Parameters
|
|
69
|
+
----------
|
|
70
|
+
positions
|
|
71
|
+
The positions of rows.
|
|
72
|
+
group_numbers
|
|
73
|
+
The number of the group of each position, from 0.
|
|
74
|
+
group_count
|
|
75
|
+
The number of groups.
|
|
76
|
+
|
|
77
|
+
Returns
|
|
78
|
+
-------
|
|
79
|
+
list[NDArray]
|
|
80
|
+
One array per group, ``group_count`` in all.
|
|
81
|
+
|
|
82
|
+
Examples
|
|
83
|
+
--------
|
|
84
|
+
>>> import numpy
|
|
85
|
+
>>> from numdaplot.tables.aggregation.row_groups import split_positions
|
|
86
|
+
>>> split_positions(numpy.array([4, 7, 9]), numpy.array([2, 0, 2]), 3)
|
|
87
|
+
[array([7]), array([], dtype=int64), array([4, 9])]
|
|
88
|
+
"""
|
|
89
|
+
order = numpy.argsort(group_numbers, kind=STABLE_SORT)
|
|
90
|
+
sorted_positions = positions[order]
|
|
91
|
+
group_sizes = numpy.bincount(group_numbers, minlength=group_count)
|
|
92
|
+
group_ends = numpy.cumsum(group_sizes)
|
|
93
|
+
group_starts = group_ends[:-1]
|
|
94
|
+
position_groups = numpy.split(sorted_positions, group_starts)
|
|
95
|
+
|
|
96
|
+
return position_groups
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Names of the statistics in the column names of an aggregation and in a description.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.arrays.calculation.statistic_values import UNKNOWN_STATISTIC_ALTERNATIVE, UNKNOWN_STATISTIC_OPERATION
|
|
8
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
9
|
+
from numdaplot.statistics.count import Count
|
|
10
|
+
from numdaplot.statistics.count_distinct import CountDistinct
|
|
11
|
+
from numdaplot.statistics.counted_missing import CountedMissing
|
|
12
|
+
from numdaplot.statistics.maximum import Max
|
|
13
|
+
from numdaplot.statistics.mean import Mean
|
|
14
|
+
from numdaplot.statistics.median import Median
|
|
15
|
+
from numdaplot.statistics.minimum import Min
|
|
16
|
+
from numdaplot.statistics.most_frequent import MostFrequent
|
|
17
|
+
from numdaplot.statistics.most_frequent_count import MostFrequentCount
|
|
18
|
+
from numdaplot.statistics.quantile import Quantile
|
|
19
|
+
from numdaplot.statistics.standard_deviation import StandardDeviation
|
|
20
|
+
from numdaplot.statistics.statistic import Statistic
|
|
21
|
+
from numdaplot.statistics.sum import Sum
|
|
22
|
+
|
|
23
|
+
STATISTIC_NAMES = {
|
|
24
|
+
Sum: "sum",
|
|
25
|
+
Mean: "mean",
|
|
26
|
+
Median: "median",
|
|
27
|
+
Min: "min",
|
|
28
|
+
Max: "max",
|
|
29
|
+
CountDistinct: "count_distinct",
|
|
30
|
+
StandardDeviation: "standard_deviation",
|
|
31
|
+
MostFrequent: "most_frequent",
|
|
32
|
+
MostFrequentCount: "most_frequent_count",
|
|
33
|
+
}
|
|
34
|
+
COUNT_NAMES = {
|
|
35
|
+
CountedMissing.EXCLUDED: "count_excluded",
|
|
36
|
+
CountedMissing.INCLUDED: "count_included",
|
|
37
|
+
}
|
|
38
|
+
QUANTILE_NAME = "quantile_{percent}"
|
|
39
|
+
PERCENT_FACTOR = 100
|
|
40
|
+
PERCENT_DIGITS = 10
|
|
41
|
+
GENERAL_NUMBER_FORMAT = "g"
|
|
42
|
+
DECIMAL_POINT = "."
|
|
43
|
+
NAME_SEPARATOR = "_"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def name_statistic(statistic: Statistic) -> str:
|
|
47
|
+
"""
|
|
48
|
+
Return the name of a statistic, in lowercase words joined by underscores.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
statistic
|
|
55
|
+
Any statistic of numdaplot.
|
|
56
|
+
|
|
57
|
+
Returns
|
|
58
|
+
-------
|
|
59
|
+
str
|
|
60
|
+
The name, such as ``standard_deviation``, ``quantile_90`` for ``Quantile(0.9)``, or ``count_excluded`` for
|
|
61
|
+
``Count()``.
|
|
62
|
+
|
|
63
|
+
Raises
|
|
64
|
+
------
|
|
65
|
+
RefusedOperationError
|
|
66
|
+
When the statistic is not a statistic of numdaplot.
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> import numdaplot as ndp
|
|
71
|
+
>>> from numdaplot.tables.aggregation.statistic_name import name_statistic
|
|
72
|
+
>>> name_statistic(ndp.CountDistinct())
|
|
73
|
+
'count_distinct'
|
|
74
|
+
"""
|
|
75
|
+
if isinstance(statistic, Quantile):
|
|
76
|
+
quantile_name = name_quantile(statistic)
|
|
77
|
+
return quantile_name
|
|
78
|
+
|
|
79
|
+
if isinstance(statistic, Count):
|
|
80
|
+
count_name = COUNT_NAMES[statistic.missing]
|
|
81
|
+
return count_name
|
|
82
|
+
|
|
83
|
+
statistic_class = type(statistic)
|
|
84
|
+
if statistic_class not in STATISTIC_NAMES:
|
|
85
|
+
operation = UNKNOWN_STATISTIC_OPERATION.format(statistic_name=statistic_class.__name__)
|
|
86
|
+
raise RefusedOperationError(operation, UNKNOWN_STATISTIC_ALTERNATIVE)
|
|
87
|
+
|
|
88
|
+
statistic_name = STATISTIC_NAMES[statistic_class]
|
|
89
|
+
|
|
90
|
+
return statistic_name
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def name_quantile(quantile: Quantile) -> str:
|
|
94
|
+
"""
|
|
95
|
+
Return the name of a quantile, holding its fraction as a percentage.
|
|
96
|
+
|
|
97
|
+
.. versionadded:: 0.1.0
|
|
98
|
+
|
|
99
|
+
Parameters
|
|
100
|
+
----------
|
|
101
|
+
quantile
|
|
102
|
+
The quantile.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
str
|
|
107
|
+
``quantile_90`` for 0.9, and ``quantile_97_5`` for 0.975: an underscore replaces the decimal point.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> import numdaplot as ndp
|
|
112
|
+
>>> from numdaplot.tables.aggregation.statistic_name import name_quantile
|
|
113
|
+
>>> name_quantile(ndp.Quantile(0.975))
|
|
114
|
+
'quantile_97_5'
|
|
115
|
+
"""
|
|
116
|
+
percent = quantile.fraction * PERCENT_FACTOR
|
|
117
|
+
rounded_percent = round(percent, PERCENT_DIGITS)
|
|
118
|
+
percent_text = format(rounded_percent, GENERAL_NUMBER_FORMAT)
|
|
119
|
+
percent_name = percent_text.replace(DECIMAL_POINT, NAME_SEPARATOR)
|
|
120
|
+
quantile_name = QUANTILE_NAME.format(percent=percent_name)
|
|
121
|
+
|
|
122
|
+
return quantile_name
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Addition of a column to a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.dimension_error import DimensionError
|
|
10
|
+
from numdaplot.errors.duplicate_column_error import DuplicateColumnError
|
|
11
|
+
from numdaplot.errors.shape_mismatch_error import ShapeMismatchError
|
|
12
|
+
from numdaplot.tables.columns.new_column import NewColumn
|
|
13
|
+
from numdaplot.tables.conflict import Conflict
|
|
14
|
+
from numdaplot.tables.frames.column_values import build_column
|
|
15
|
+
from numdaplot.tables.frames.time_range_errors import TimeRangeErrors
|
|
16
|
+
|
|
17
|
+
ADD_COLUMN_OPERATION = "add_column"
|
|
18
|
+
ONE_DIMENSION = 1
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def add_frame_column(frame: pandas.DataFrame, new_column: NewColumn) -> pandas.DataFrame:
|
|
22
|
+
"""
|
|
23
|
+
Return the columns of a Table with one more column, or with a column replaced.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
frame
|
|
30
|
+
The columns of a Table, which are not changed.
|
|
31
|
+
new_column
|
|
32
|
+
The name, the values and what to do when the name exists.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
pandas.DataFrame
|
|
37
|
+
A new column is placed last; a replaced column keeps its place. A Table without column
|
|
38
|
+
takes as many rows as the new column has values.
|
|
39
|
+
|
|
40
|
+
Raises
|
|
41
|
+
------
|
|
42
|
+
DimensionError
|
|
43
|
+
When the Array of values does not have one dimension.
|
|
44
|
+
ShapeMismatchError
|
|
45
|
+
When the Array does not have one value per row of the Table.
|
|
46
|
+
DuplicateColumnError
|
|
47
|
+
When the name exists and ``on_conflict`` is ``ERROR``.
|
|
48
|
+
TimeOverflowError
|
|
49
|
+
When the Array holds a datetime or a duration that nanoseconds cannot hold.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> import pandas
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> from numdaplot.tables.columns.added_column import add_frame_column
|
|
56
|
+
>>> frame = pandas.DataFrame({"price": [1.5, 8.0]})
|
|
57
|
+
>>> add_frame_column(frame, ndp.NewColumn(name="count", values=ndp.Array.from_list([2, 1])))
|
|
58
|
+
price count
|
|
59
|
+
0 1.5 2
|
|
60
|
+
1 8.0 1
|
|
61
|
+
"""
|
|
62
|
+
values = new_column.values.to_numpy()
|
|
63
|
+
if values.ndim != ONE_DIMENSION:
|
|
64
|
+
raise DimensionError(ADD_COLUMN_OPERATION, values.ndim)
|
|
65
|
+
|
|
66
|
+
column_names = [str(column_name) for column_name in frame.columns]
|
|
67
|
+
value_count = values.size
|
|
68
|
+
row_count = len(frame)
|
|
69
|
+
has_columns = column_names != []
|
|
70
|
+
has_wrong_length = has_columns and value_count != row_count
|
|
71
|
+
if has_wrong_length:
|
|
72
|
+
raise ShapeMismatchError((value_count,), (row_count,))
|
|
73
|
+
|
|
74
|
+
name_exists = new_column.name in column_names
|
|
75
|
+
refuses_existing_name = name_exists and new_column.on_conflict == Conflict.ERROR
|
|
76
|
+
if refuses_existing_name:
|
|
77
|
+
raise DuplicateColumnError(new_column.name)
|
|
78
|
+
|
|
79
|
+
with TimeRangeErrors(ADD_COLUMN_OPERATION, new_column.name):
|
|
80
|
+
column = build_column(values)
|
|
81
|
+
|
|
82
|
+
extended_frame = frame.copy(deep=False)
|
|
83
|
+
if not has_columns:
|
|
84
|
+
row_numbers = pandas.RangeIndex(value_count)
|
|
85
|
+
extended_frame = pandas.DataFrame(index=row_numbers)
|
|
86
|
+
|
|
87
|
+
extended_frame[new_column.name] = column
|
|
88
|
+
|
|
89
|
+
return extended_frame
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversion of Table columns between booleans and numbers.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.type import Type
|
|
12
|
+
from numdaplot.errors.value_conversion_error import ValueConversionError
|
|
13
|
+
from numdaplot.tables.columns.boolean_rule import BooleanRule
|
|
14
|
+
from numdaplot.tables.frames.column import Column
|
|
15
|
+
from numdaplot.tables.frames.column_values import (
|
|
16
|
+
build_column_with_missing,
|
|
17
|
+
find_column_missing,
|
|
18
|
+
find_column_type,
|
|
19
|
+
read_present_values,
|
|
20
|
+
)
|
|
21
|
+
from numdaplot.tables.frames.frame_normalization import convert_to_type
|
|
22
|
+
|
|
23
|
+
FALSE_NUMBER = 0
|
|
24
|
+
TRUE_NUMBER = 1
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def convert_booleans_to_numbers(column: Column, target_type: Type) -> Column:
|
|
28
|
+
"""
|
|
29
|
+
Return a boolean column as numbers: 1 for ``True`` and 0 for ``False``.
|
|
30
|
+
|
|
31
|
+
.. versionadded:: 0.1.0
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
column
|
|
36
|
+
A ``BOOL`` column.
|
|
37
|
+
target_type
|
|
38
|
+
A number type.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
Column
|
|
43
|
+
The column of numbers, missing values staying missing.
|
|
44
|
+
|
|
45
|
+
Examples
|
|
46
|
+
--------
|
|
47
|
+
>>> import pandas
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> from numdaplot.tables.columns.boolean_conversion import convert_booleans_to_numbers
|
|
50
|
+
>>> flags = pandas.Series([True, None, False], dtype="boolean")
|
|
51
|
+
>>> convert_booleans_to_numbers(flags, ndp.Type.FLOAT64).tolist()
|
|
52
|
+
[1.0, nan, 0.0]
|
|
53
|
+
"""
|
|
54
|
+
number_column = convert_to_type(column, target_type)
|
|
55
|
+
|
|
56
|
+
return number_column
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def convert_numbers_to_booleans(column: Column, rule: BooleanRule) -> Column:
|
|
60
|
+
"""
|
|
61
|
+
Return a number column as booleans, each number read by a rule.
|
|
62
|
+
|
|
63
|
+
.. versionadded:: 0.1.0
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
column
|
|
68
|
+
A number column.
|
|
69
|
+
rule
|
|
70
|
+
``ZERO_ONE`` to accept only 0 and 1, ``NONZERO_TRUE`` to read every number but 0 as ``True``.
|
|
71
|
+
|
|
72
|
+
Returns
|
|
73
|
+
-------
|
|
74
|
+
Column
|
|
75
|
+
A ``BOOL`` column, missing values staying missing.
|
|
76
|
+
|
|
77
|
+
Raises
|
|
78
|
+
------
|
|
79
|
+
ValueConversionError
|
|
80
|
+
With ``ZERO_ONE``, at the first number that is neither 0 nor 1.
|
|
81
|
+
|
|
82
|
+
Examples
|
|
83
|
+
--------
|
|
84
|
+
>>> import pandas
|
|
85
|
+
>>> import numdaplot as ndp
|
|
86
|
+
>>> from numdaplot.tables.columns.boolean_conversion import convert_numbers_to_booleans
|
|
87
|
+
>>> numbers = pandas.Series([1, None, 0], dtype="Int64")
|
|
88
|
+
>>> convert_numbers_to_booleans(numbers, ndp.BooleanRule.ZERO_ONE).tolist()
|
|
89
|
+
[True, <NA>, False]
|
|
90
|
+
"""
|
|
91
|
+
missing = find_column_missing(column)
|
|
92
|
+
numbers = read_present_values(column)
|
|
93
|
+
if rule == BooleanRule.ZERO_ONE:
|
|
94
|
+
source_type = find_column_type(column)
|
|
95
|
+
require_zero_or_one(numbers, source_type)
|
|
96
|
+
|
|
97
|
+
is_true = numbers != FALSE_NUMBER
|
|
98
|
+
boolean_column = build_column_with_missing(is_true, missing)
|
|
99
|
+
|
|
100
|
+
return boolean_column
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def require_zero_or_one(numbers: numpy.typing.NDArray[numpy.number], source_type: Type) -> None:
|
|
104
|
+
"""
|
|
105
|
+
Check that every number is 0 or 1.
|
|
106
|
+
|
|
107
|
+
.. versionadded:: 0.1.0
|
|
108
|
+
|
|
109
|
+
Parameters
|
|
110
|
+
----------
|
|
111
|
+
numbers
|
|
112
|
+
The present numbers of a column.
|
|
113
|
+
source_type
|
|
114
|
+
The type of the column, named in the error.
|
|
115
|
+
|
|
116
|
+
Raises
|
|
117
|
+
------
|
|
118
|
+
ValueConversionError
|
|
119
|
+
At the first number that is neither 0 nor 1.
|
|
120
|
+
|
|
121
|
+
Examples
|
|
122
|
+
--------
|
|
123
|
+
>>> import numpy
|
|
124
|
+
>>> import numdaplot as ndp
|
|
125
|
+
>>> from numdaplot.tables.columns.boolean_conversion import require_zero_or_one
|
|
126
|
+
>>> try:
|
|
127
|
+
... require_zero_or_one(numpy.array([1, 2, 0]), ndp.Type.INT64)
|
|
128
|
+
... except ndp.ValueConversionError as error:
|
|
129
|
+
... print(error)
|
|
130
|
+
Cannot store the INT64 value 2 as BOOL without losing information.
|
|
131
|
+
"""
|
|
132
|
+
is_false = numbers == FALSE_NUMBER
|
|
133
|
+
is_true = numbers == TRUE_NUMBER
|
|
134
|
+
is_boolean = is_false | is_true
|
|
135
|
+
is_other = ~is_boolean
|
|
136
|
+
has_other = bool(is_other.any())
|
|
137
|
+
if not has_other:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
other_numbers = numbers[is_other]
|
|
141
|
+
raw_numbers = other_numbers.tolist()
|
|
142
|
+
python_numbers = cast(list[Any], raw_numbers)
|
|
143
|
+
first_other_number = python_numbers[0]
|
|
144
|
+
raise ValueConversionError(source_type.name, Type.BOOL.name, first_other_number)
|