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,82 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Which rows of a Table a preview shows.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Side(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Which rows of a Table a ``Preview`` shows.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
20
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
21
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
22
|
+
>>> sales.preview(ndp.Preview(count=1, side=ndp.Side.END))
|
|
23
|
+
city price
|
|
24
|
+
TEXT FLOAT64
|
|
25
|
+
2 Paris 150.0
|
|
26
|
+
>>> sales.preview(ndp.Preview(count=2, side=ndp.Side.RANDOM, seed=42))
|
|
27
|
+
city price
|
|
28
|
+
TEXT FLOAT64
|
|
29
|
+
0 Paris 120.0
|
|
30
|
+
2 Paris 150.0
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
START = auto()
|
|
34
|
+
"""
|
|
35
|
+
The first rows. Default value.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
41
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
42
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
43
|
+
>>> sales.preview(ndp.Preview(count=2, side=ndp.Side.START))
|
|
44
|
+
city price
|
|
45
|
+
TEXT FLOAT64
|
|
46
|
+
0 Paris 120.0
|
|
47
|
+
1 Lyon 80.0
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
END = auto()
|
|
51
|
+
"""
|
|
52
|
+
The last rows.
|
|
53
|
+
|
|
54
|
+
Examples
|
|
55
|
+
--------
|
|
56
|
+
>>> import numdaplot as ndp
|
|
57
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
58
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
59
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
60
|
+
>>> sales.preview(ndp.Preview(count=2, side=ndp.Side.END))
|
|
61
|
+
city price
|
|
62
|
+
TEXT FLOAT64
|
|
63
|
+
1 Lyon 80.0
|
|
64
|
+
2 Paris 150.0
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
RANDOM = auto()
|
|
68
|
+
"""
|
|
69
|
+
Rows drawn at random, shown in the order of the Table.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> import numdaplot as ndp
|
|
74
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
75
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
76
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
77
|
+
>>> sales.preview(ndp.Preview(count=2, side=ndp.Side.RANDOM, seed=42))
|
|
78
|
+
city price
|
|
79
|
+
TEXT FLOAT64
|
|
80
|
+
0 Paris 120.0
|
|
81
|
+
2 Paris 150.0
|
|
82
|
+
"""
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A column the rows of a Table are sorted by.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.ordering.missing_position import MissingPosition
|
|
10
|
+
from numdaplot.ordering.order import Order
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
from numdaplot.tables.columns.column_names import require_column_name
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class SortKey:
|
|
17
|
+
"""
|
|
18
|
+
A column the rows of a Table are sorted by, used by ``Sorting``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
column
|
|
25
|
+
The name of the column.
|
|
26
|
+
order
|
|
27
|
+
Ascending by default.
|
|
28
|
+
missing
|
|
29
|
+
Place of the missing values, last by default whatever the order.
|
|
30
|
+
|
|
31
|
+
Raises
|
|
32
|
+
------
|
|
33
|
+
InvalidTypeError
|
|
34
|
+
When a setting is not of the type its annotation names.
|
|
35
|
+
InvalidColumnNameError
|
|
36
|
+
When ``column`` is an empty text.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> import numdaplot as ndp
|
|
41
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
42
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
43
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
44
|
+
>>> sales.sort(ndp.Sorting(keys=[ndp.SortKey(column="price", order=ndp.Order.DESCENDING)]))
|
|
45
|
+
city price
|
|
46
|
+
TEXT FLOAT64
|
|
47
|
+
0 Paris 150.0
|
|
48
|
+
1 Paris 120.0
|
|
49
|
+
2 Lyon 80.0
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
column: str
|
|
53
|
+
order: Order = Order.ASCENDING
|
|
54
|
+
missing: MissingPosition = MissingPosition.LAST
|
|
55
|
+
|
|
56
|
+
def __post_init__(self) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Check that the column name is a non-empty text.
|
|
59
|
+
|
|
60
|
+
.. versionadded:: 0.1.0
|
|
61
|
+
|
|
62
|
+
Raises
|
|
63
|
+
------
|
|
64
|
+
InvalidTypeError
|
|
65
|
+
When a setting is not of the type its annotation names.
|
|
66
|
+
InvalidColumnNameError
|
|
67
|
+
When ``column`` is an empty text.
|
|
68
|
+
"""
|
|
69
|
+
require_field_types(self)
|
|
70
|
+
|
|
71
|
+
require_column_name(self.column)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Sort of the rows of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
import pandas
|
|
10
|
+
|
|
11
|
+
from numdaplot.ordering.missing_position import MissingPosition
|
|
12
|
+
from numdaplot.ordering.order import Order
|
|
13
|
+
from numdaplot.tables.columns.column_names import require_known_columns
|
|
14
|
+
from numdaplot.tables.sorting.sorting import Sorting
|
|
15
|
+
|
|
16
|
+
STABLE_SORT = "stable"
|
|
17
|
+
MISSING_PLACES = dict[MissingPosition, Literal["first", "last"]](
|
|
18
|
+
{
|
|
19
|
+
MissingPosition.FIRST: "first",
|
|
20
|
+
MissingPosition.LAST: "last",
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def sort_frame(frame: pandas.DataFrame, sorting: Sorting) -> pandas.DataFrame:
|
|
26
|
+
"""
|
|
27
|
+
Return the rows of a Table sorted by several columns, each with its own order and place of missing values.
|
|
28
|
+
|
|
29
|
+
.. versionadded:: 0.1.0
|
|
30
|
+
|
|
31
|
+
Parameters
|
|
32
|
+
----------
|
|
33
|
+
frame
|
|
34
|
+
The columns of a Table.
|
|
35
|
+
sorting
|
|
36
|
+
The sort keys.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
pandas.DataFrame
|
|
41
|
+
The sorted rows, numbered from 0. Rows equal on every key keep their order.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
ColumnNotFoundError
|
|
46
|
+
When a key names a column the Table does not have.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import pandas
|
|
51
|
+
>>> import numdaplot as ndp
|
|
52
|
+
>>> from numdaplot.tables.sorting.sorted_frame import sort_frame
|
|
53
|
+
>>> frame = pandas.DataFrame({"city": ["Pau", "Lyon", "Pau"], "price": [1.0, 2.0, 3.0]})
|
|
54
|
+
>>> by_city = ndp.SortKey(column="city")
|
|
55
|
+
>>> by_price = ndp.SortKey(column="price", order=ndp.Order.DESCENDING)
|
|
56
|
+
>>> sort_frame(frame, ndp.Sorting(keys=[by_city, by_price]))
|
|
57
|
+
city price
|
|
58
|
+
0 Lyon 2.0
|
|
59
|
+
1 Pau 3.0
|
|
60
|
+
2 Pau 1.0
|
|
61
|
+
"""
|
|
62
|
+
column_names = [str(column_name) for column_name in frame.columns]
|
|
63
|
+
key_columns = [key.column for key in sorting.keys]
|
|
64
|
+
require_known_columns(key_columns, column_names)
|
|
65
|
+
sorted_frame = frame
|
|
66
|
+
reversed_keys = reversed(sorting.keys)
|
|
67
|
+
|
|
68
|
+
# A stable sort by the last key first leaves the rows sorted by every key in order.
|
|
69
|
+
for key in reversed_keys:
|
|
70
|
+
is_ascending = key.order == Order.ASCENDING
|
|
71
|
+
missing_place = MISSING_PLACES[key.missing]
|
|
72
|
+
sorted_frame = sorted_frame.sort_values(
|
|
73
|
+
by=key.column,
|
|
74
|
+
ascending=is_ascending,
|
|
75
|
+
na_position=missing_place,
|
|
76
|
+
kind=STABLE_SORT,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
numbered_frame = sorted_frame.reset_index(drop=True)
|
|
80
|
+
|
|
81
|
+
return numbered_frame
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the sort of the rows of a 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.settings.field_types import require_field_types
|
|
11
|
+
from numdaplot.tables.columns.column_names import require_unique_names
|
|
12
|
+
from numdaplot.tables.sorting.sort_key import SortKey
|
|
13
|
+
|
|
14
|
+
SORT_KEY_ITEM_NAME = "sort key"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Sorting:
|
|
19
|
+
"""
|
|
20
|
+
Columns the rows of a Table are sorted by, used by ``Table.sort``.
|
|
21
|
+
|
|
22
|
+
Rows are sorted by the first key, then rows with the same value by the second key, and so on.
|
|
23
|
+
Rows equal on every key keep their order.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
keys
|
|
30
|
+
The sort keys, at least one, each on a different column. The sorting keeps its own copy of the list.
|
|
31
|
+
|
|
32
|
+
Raises
|
|
33
|
+
------
|
|
34
|
+
InvalidTypeError
|
|
35
|
+
When a setting is not of the type its annotation names.
|
|
36
|
+
EmptyListError
|
|
37
|
+
When ``keys`` is empty.
|
|
38
|
+
DuplicateColumnError
|
|
39
|
+
When two keys sort the same column.
|
|
40
|
+
|
|
41
|
+
Examples
|
|
42
|
+
--------
|
|
43
|
+
>>> import numdaplot as ndp
|
|
44
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
45
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
46
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
47
|
+
>>> by_city = ndp.SortKey(column="city")
|
|
48
|
+
>>> by_price = ndp.SortKey(column="price", order=ndp.Order.DESCENDING)
|
|
49
|
+
>>> sales.sort(ndp.Sorting(keys=[by_city, by_price]))
|
|
50
|
+
city price
|
|
51
|
+
TEXT FLOAT64
|
|
52
|
+
0 Lyon 80.0
|
|
53
|
+
1 Paris 150.0
|
|
54
|
+
2 Paris 120.0
|
|
55
|
+
"""
|
|
56
|
+
|
|
57
|
+
keys: list[SortKey]
|
|
58
|
+
|
|
59
|
+
def __post_init__(self) -> None:
|
|
60
|
+
"""
|
|
61
|
+
Check the keys and replace them with a copy that only the sorting holds.
|
|
62
|
+
|
|
63
|
+
.. versionadded:: 0.1.0
|
|
64
|
+
|
|
65
|
+
Raises
|
|
66
|
+
------
|
|
67
|
+
InvalidTypeError
|
|
68
|
+
When a setting is not of the type its annotation names.
|
|
69
|
+
EmptyListError
|
|
70
|
+
When ``keys`` is empty.
|
|
71
|
+
DuplicateColumnError
|
|
72
|
+
When two keys sort the same column.
|
|
73
|
+
"""
|
|
74
|
+
require_field_types(self)
|
|
75
|
+
|
|
76
|
+
if self.keys == []:
|
|
77
|
+
raise EmptyListError(SORT_KEY_ITEM_NAME)
|
|
78
|
+
|
|
79
|
+
key_columns = [key.column for key in self.keys]
|
|
80
|
+
require_unique_names(key_columns)
|
|
81
|
+
keys_copy = list(self.keys)
|
|
82
|
+
object.__setattr__(self, "keys", keys_copy)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The ``ndp.Table`` class: named columns, each holding values of one type.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.tables.table_calculation import TableCalculation
|
|
8
|
+
from numdaplot.tables.table_columns import TableColumns
|
|
9
|
+
from numdaplot.tables.table_conversion import TableConversion
|
|
10
|
+
from numdaplot.tables.table_display import TableDisplay
|
|
11
|
+
from numdaplot.tables.table_joining import TableJoining
|
|
12
|
+
from numdaplot.tables.table_layout import TableLayout
|
|
13
|
+
from numdaplot.tables.table_missing import TableMissing
|
|
14
|
+
from numdaplot.tables.table_reading import TableReading
|
|
15
|
+
from numdaplot.tables.table_refusals import TableRefusals
|
|
16
|
+
from numdaplot.tables.table_selection import TableSelection
|
|
17
|
+
from numdaplot.tables.table_writing import TableWriting
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Table(
|
|
21
|
+
TableReading,
|
|
22
|
+
TableWriting,
|
|
23
|
+
TableConversion,
|
|
24
|
+
TableSelection,
|
|
25
|
+
TableColumns,
|
|
26
|
+
TableCalculation,
|
|
27
|
+
TableLayout,
|
|
28
|
+
TableJoining,
|
|
29
|
+
TableMissing,
|
|
30
|
+
TableDisplay,
|
|
31
|
+
TableRefusals,
|
|
32
|
+
):
|
|
33
|
+
"""
|
|
34
|
+
Named columns, each holding values of one type, wrapping a pandas DataFrame.
|
|
35
|
+
|
|
36
|
+
A Table never changes: every operation returns a new Table. Its rows are numbered from 0, and renumbered
|
|
37
|
+
after a filter or a sort. Integer, boolean and text columns accept missing values.
|
|
38
|
+
|
|
39
|
+
- Create it with ``from_csv``, ``from_json``, ``from_excel``, ``from_parquet``, ``from_stata``, ``from_sas``,
|
|
40
|
+
``from_xpt``, ``from_pandas`` or ``from_arrays``.
|
|
41
|
+
- Write it with ``to_csv``, ``to_json``, ``to_excel``, ``to_parquet`` or ``to_stata``.
|
|
42
|
+
- Select rows with ``filter`` and ``take``, check values with ``check``, read a column with ``column``.
|
|
43
|
+
- Change columns with ``choose_columns``, ``rename``, ``convert`` and ``add_column``.
|
|
44
|
+
- Compute with ``aggregate``, ``pivot_table`` and ``describe``.
|
|
45
|
+
- Rearrange rows with ``sort`` and ``drop_duplicates``, and combine two Tables with ``join``.
|
|
46
|
+
- Handle missing values with ``count_missing``, ``preview_missing`` and ``drop_missing``.
|
|
47
|
+
- Read it with ``row_count``, ``column_names``, ``column_types``, ``to_value``, ``to_pandas`` and ``is_equal``,
|
|
48
|
+
and show it with ``preview`` or ``print``.
|
|
49
|
+
|
|
50
|
+
Calling ``ndp.Table(...)``, comparisons, brackets, ``for``, ``in``, ``len`` and ``bool`` are refused
|
|
51
|
+
with ``RefusedOperationError``, which names the method to use instead.
|
|
52
|
+
|
|
53
|
+
.. versionadded:: 0.1.0
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import numdaplot as ndp
|
|
58
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
|
|
59
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
|
|
60
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
61
|
+
>>> sales
|
|
62
|
+
city price
|
|
63
|
+
TEXT FLOAT64
|
|
64
|
+
0 Paris 120.0
|
|
65
|
+
1 Lyon 80.0
|
|
66
|
+
2 Paris 150.0
|
|
67
|
+
>>> sales.row_count
|
|
68
|
+
3
|
|
69
|
+
>>> sales.column_names
|
|
70
|
+
['city', 'price']
|
|
71
|
+
"""
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Statistics of a Table: aggregation, pivot table and description.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
10
|
+
from numdaplot.tables.aggregation.aggregated_frame import aggregate_frame
|
|
11
|
+
from numdaplot.tables.aggregation.aggregation import Aggregation
|
|
12
|
+
from numdaplot.tables.description.described_frame import describe_frame
|
|
13
|
+
from numdaplot.tables.description.description import Description
|
|
14
|
+
from numdaplot.tables.pivot.pivot_table import PivotTable
|
|
15
|
+
from numdaplot.tables.pivot.pivoted_frame import pivot_frame
|
|
16
|
+
from numdaplot.tables.table_data import TableData
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TableCalculation(TableData):
|
|
20
|
+
"""
|
|
21
|
+
Statistics of a Table with ``aggregate``, ``pivot_table`` and ``describe``. Missing values are ignored.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
@checked_arguments
|
|
27
|
+
def aggregate(self, aggregation: Aggregation) -> Self:
|
|
28
|
+
"""
|
|
29
|
+
Return statistics of the whole Table, or of each group of rows.
|
|
30
|
+
|
|
31
|
+
.. versionadded:: 0.1.0
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
aggregation
|
|
36
|
+
The calculations, and the columns forming the groups.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
Self
|
|
41
|
+
A new Table: the group columns, then one column per calculation; one row per group, sorted by
|
|
42
|
+
group values with missing values as a group of their own, last. Without groups, a single row.
|
|
43
|
+
A statistic needing a value gives a missing value for a group without present value.
|
|
44
|
+
|
|
45
|
+
Raises
|
|
46
|
+
------
|
|
47
|
+
InvalidTypeError
|
|
48
|
+
When an argument is not of the type its annotation names.
|
|
49
|
+
ColumnNotFoundError
|
|
50
|
+
When a calculation or a group names a column the Table does not have.
|
|
51
|
+
IncompatibleTypesError
|
|
52
|
+
When a statistic does not apply to the type of its column.
|
|
53
|
+
|
|
54
|
+
Examples
|
|
55
|
+
--------
|
|
56
|
+
>>> import numdaplot as ndp
|
|
57
|
+
>>> cities = ndp.Array.from_list(["Pau", "Lyon", "Pau"])
|
|
58
|
+
>>> prices = ndp.Array.from_list([10.0, 30.0, 20.0])
|
|
59
|
+
>>> table = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
60
|
+
>>> average_price = ndp.Calculation(column="price", function=ndp.Mean())
|
|
61
|
+
>>> table.aggregate(ndp.Aggregation(calculations=[average_price], group_by=["city"]))
|
|
62
|
+
city price_mean
|
|
63
|
+
TEXT FLOAT64
|
|
64
|
+
0 Lyon 30.0
|
|
65
|
+
1 Pau 15.0
|
|
66
|
+
"""
|
|
67
|
+
aggregated_frame = aggregate_frame(self._frame, aggregation)
|
|
68
|
+
aggregated_table = self._wrap(aggregated_frame)
|
|
69
|
+
|
|
70
|
+
return aggregated_table
|
|
71
|
+
|
|
72
|
+
@checked_arguments
|
|
73
|
+
def pivot_table(self, pivot: PivotTable) -> Self:
|
|
74
|
+
"""
|
|
75
|
+
Return one statistic for each combination of groups of rows and values of a column, as a wide Table.
|
|
76
|
+
|
|
77
|
+
``aggregate`` gives one row per combination: ``pivot_table`` gives one column per value of a column, as
|
|
78
|
+
``Plot.heatmap`` draws them.
|
|
79
|
+
|
|
80
|
+
.. versionadded:: 0.1.0
|
|
81
|
+
|
|
82
|
+
Parameters
|
|
83
|
+
----------
|
|
84
|
+
pivot
|
|
85
|
+
The columns forming the rows and the columns of the result, and the statistic of each cell.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
Self
|
|
90
|
+
A new Table: the columns of ``rows``, then one column per value of ``columns``, named after the value;
|
|
91
|
+
one row per group, sorted, with missing values as a group of their own, last.
|
|
92
|
+
|
|
93
|
+
Raises
|
|
94
|
+
------
|
|
95
|
+
InvalidTypeError
|
|
96
|
+
When an argument is not of the type its annotation names.
|
|
97
|
+
ColumnNotFoundError
|
|
98
|
+
When a setting names a column the Table does not have.
|
|
99
|
+
RefusedOperationError
|
|
100
|
+
When the column of ``columns`` holds missing values: remove them with ``drop_missing``.
|
|
101
|
+
DuplicateColumnError
|
|
102
|
+
When a value written as a text is also the name of a column of ``rows``.
|
|
103
|
+
InvalidColumnNameError
|
|
104
|
+
When a value written as a text is empty.
|
|
105
|
+
IncompatibleTypesError
|
|
106
|
+
When the statistic does not apply to the type of its column.
|
|
107
|
+
|
|
108
|
+
Examples
|
|
109
|
+
--------
|
|
110
|
+
>>> import numdaplot as ndp
|
|
111
|
+
>>> hours = ndp.Array.from_list([8, 8, 9])
|
|
112
|
+
>>> weekdays = ndp.Array.from_list(["Mon", "Tue", "Mon"])
|
|
113
|
+
>>> fares = ndp.Array.from_list([7.0, 9.0, 5.0])
|
|
114
|
+
>>> trips = ndp.Table.from_arrays({"hour": hours, "weekday": weekdays, "fare": fares})
|
|
115
|
+
>>> trip_count = ndp.Calculation(column="fare", function=ndp.Count(missing=ndp.CountedMissing.INCLUDED))
|
|
116
|
+
>>> trips.pivot_table(ndp.PivotTable(rows=["hour"], columns="weekday", calculation=trip_count))
|
|
117
|
+
hour Mon Tue
|
|
118
|
+
INT64 INT64 INT64
|
|
119
|
+
0 8 1 1
|
|
120
|
+
1 9 1 0
|
|
121
|
+
"""
|
|
122
|
+
pivoted_frame = pivot_frame(self._frame, pivot)
|
|
123
|
+
pivoted_table = self._wrap(pivoted_frame)
|
|
124
|
+
|
|
125
|
+
return pivoted_table
|
|
126
|
+
|
|
127
|
+
@checked_arguments
|
|
128
|
+
def describe(self, description: Description | None = None) -> Self:
|
|
129
|
+
"""
|
|
130
|
+
Return statistics describing columns, one row per statistic and one column per described column.
|
|
131
|
+
|
|
132
|
+
.. versionadded:: 0.1.0
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
description
|
|
137
|
+
The statistics and the columns. When omitted, every number column is described with the
|
|
138
|
+
statistics of pandas.
|
|
139
|
+
|
|
140
|
+
Returns
|
|
141
|
+
-------
|
|
142
|
+
Self
|
|
143
|
+
A new Table whose first column, ``statistic``, names each statistic, such as ``quantile_25``.
|
|
144
|
+
A cell is missing when the statistic does not apply to the column or finds no value.
|
|
145
|
+
|
|
146
|
+
Raises
|
|
147
|
+
------
|
|
148
|
+
InvalidTypeError
|
|
149
|
+
When an argument is not of the type its annotation names.
|
|
150
|
+
ColumnNotFoundError
|
|
151
|
+
When a described column does not exist.
|
|
152
|
+
DuplicateColumnError
|
|
153
|
+
When a described column is named ``statistic``.
|
|
154
|
+
|
|
155
|
+
Examples
|
|
156
|
+
--------
|
|
157
|
+
>>> import numdaplot as ndp
|
|
158
|
+
>>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([10.0, 30.0])})
|
|
159
|
+
>>> table.describe(ndp.Description(functions=[ndp.Count(), ndp.Mean(), ndp.Max()]))
|
|
160
|
+
statistic price
|
|
161
|
+
TEXT FLOAT64
|
|
162
|
+
0 count_excluded 2.0
|
|
163
|
+
1 mean 20.0
|
|
164
|
+
2 max 30.0
|
|
165
|
+
"""
|
|
166
|
+
if description is None:
|
|
167
|
+
description = Description()
|
|
168
|
+
|
|
169
|
+
described_frame = describe_frame(self._frame, description)
|
|
170
|
+
described_table = self._wrap(described_frame)
|
|
171
|
+
|
|
172
|
+
return described_table
|