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,94 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Reading SAS data and SAS transport (XPT) files.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Literal
|
|
9
|
+
|
|
10
|
+
import pandas
|
|
11
|
+
|
|
12
|
+
from numdaplot.tables.files.encoding import Encoding
|
|
13
|
+
from numdaplot.tables.files.sas_read_options import SasReadOptions
|
|
14
|
+
from numdaplot.tables.files.xpt_read_options import XptReadOptions
|
|
15
|
+
|
|
16
|
+
SAS_DATA_FORMAT = "sas7bdat"
|
|
17
|
+
SAS_TRANSPORT_FORMAT = "xport"
|
|
18
|
+
|
|
19
|
+
type SasFormat = Literal["sas7bdat", "xport"]
|
|
20
|
+
"""The names pandas gives to the SAS data and SAS transport formats.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def read_sas_file(path: Path, options: SasReadOptions) -> pandas.DataFrame:
|
|
27
|
+
"""
|
|
28
|
+
Return the columns of a SAS data file (``.sas7bdat``).
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
path
|
|
35
|
+
The path of an existing SAS data file.
|
|
36
|
+
options
|
|
37
|
+
The encoding of the texts of the file.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
pandas.DataFrame
|
|
42
|
+
The columns as pandas reads them. SAS stores every number as a decimal.
|
|
43
|
+
"""
|
|
44
|
+
frame = read_sas_format(path, SAS_DATA_FORMAT, options.encoding)
|
|
45
|
+
|
|
46
|
+
return frame
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def read_xpt_file(path: Path, options: XptReadOptions) -> pandas.DataFrame:
|
|
50
|
+
"""
|
|
51
|
+
Return the columns of a SAS transport file (``.xpt``).
|
|
52
|
+
|
|
53
|
+
.. versionadded:: 0.1.0
|
|
54
|
+
|
|
55
|
+
Parameters
|
|
56
|
+
----------
|
|
57
|
+
path
|
|
58
|
+
The path of an existing SAS transport file.
|
|
59
|
+
options
|
|
60
|
+
The encoding of the texts of the file.
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
pandas.DataFrame
|
|
65
|
+
The columns as pandas reads them. SAS stores every number as a decimal.
|
|
66
|
+
"""
|
|
67
|
+
frame = read_sas_format(path, SAS_TRANSPORT_FORMAT, options.encoding)
|
|
68
|
+
|
|
69
|
+
return frame
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def read_sas_format(path: Path, sas_format: SasFormat, encoding: Encoding) -> pandas.DataFrame:
|
|
73
|
+
"""
|
|
74
|
+
Return the columns of a SAS file of a given format.
|
|
75
|
+
|
|
76
|
+
.. versionadded:: 0.1.0
|
|
77
|
+
|
|
78
|
+
Parameters
|
|
79
|
+
----------
|
|
80
|
+
path
|
|
81
|
+
The path of an existing SAS file.
|
|
82
|
+
sas_format
|
|
83
|
+
``sas7bdat`` for SAS data, ``xport`` for SAS transport.
|
|
84
|
+
encoding
|
|
85
|
+
The encoding of the texts of the file.
|
|
86
|
+
|
|
87
|
+
Returns
|
|
88
|
+
-------
|
|
89
|
+
pandas.DataFrame
|
|
90
|
+
The columns as pandas reads them.
|
|
91
|
+
"""
|
|
92
|
+
frame = pandas.read_sas(path, format=sas_format, encoding=encoding.value)
|
|
93
|
+
|
|
94
|
+
return frame
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the SAS data files a Table reads.
|
|
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.tables.files.column_names import ColumnNames
|
|
11
|
+
from numdaplot.tables.files.encoding import Encoding
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class SasReadOptions:
|
|
16
|
+
"""
|
|
17
|
+
Settings of a SAS data file (``.sas7bdat``) read by ``Table.from_sas``.
|
|
18
|
+
|
|
19
|
+
These files are read only.
|
|
20
|
+
|
|
21
|
+
The example reads
|
|
22
|
+
[airline.sas7bdat](https://github.com/Ryieru/numdaplot/blob/main/tests/data/airline.sas7bdat),
|
|
23
|
+
a SAS data file of 32 rows.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
encoding
|
|
30
|
+
The text encoding of the texts stored in the file, UTF-8 by default.
|
|
31
|
+
column_names
|
|
32
|
+
Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
|
|
33
|
+
the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
|
|
34
|
+
|
|
35
|
+
Raises
|
|
36
|
+
------
|
|
37
|
+
InvalidTypeError
|
|
38
|
+
When a setting is not of the type its annotation names.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> latin_1 = ndp.SasReadOptions(encoding=ndp.Encoding.LATIN_1)
|
|
44
|
+
>>> airline = ndp.Table.from_sas("airline.sas7bdat", latin_1)
|
|
45
|
+
>>> airline.preview(ndp.Preview(count=3))
|
|
46
|
+
YEAR Y W R L K
|
|
47
|
+
FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64
|
|
48
|
+
0 1948.0 1.214 0.243 0.1454 1.415 0.612
|
|
49
|
+
1 1949.0 1.354 0.260 0.2181 1.384 0.559
|
|
50
|
+
2 1950.0 1.569 0.278 0.3157 1.388 0.573
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
encoding: Encoding = Encoding.UTF_8
|
|
54
|
+
column_names: ColumnNames = ColumnNames.CLEANED
|
|
55
|
+
|
|
56
|
+
def __post_init__(self) -> None:
|
|
57
|
+
"""
|
|
58
|
+
Check the type of every setting.
|
|
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
|
+
"""
|
|
67
|
+
require_field_types(self)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Reading and writing Stata files.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pandas
|
|
10
|
+
|
|
11
|
+
from numdaplot.tables.frames.time_zones import require_no_time_zone
|
|
12
|
+
|
|
13
|
+
STATA_OPERATION = "A Stata file"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def read_stata_file(path: Path) -> pandas.DataFrame:
|
|
17
|
+
"""
|
|
18
|
+
Return the columns of a Stata file (``.dta``).
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
path
|
|
25
|
+
The path of an existing Stata file.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
pandas.DataFrame
|
|
30
|
+
The columns as pandas reads them.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import tempfile
|
|
35
|
+
>>> from pathlib import Path
|
|
36
|
+
>>> import pandas
|
|
37
|
+
>>> from numdaplot.tables.files.stata_file import read_stata_file
|
|
38
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.dta"
|
|
39
|
+
>>> pandas.DataFrame({"price": [1.5]}).to_stata(path, write_index=False)
|
|
40
|
+
>>> read_stata_file(path)
|
|
41
|
+
price
|
|
42
|
+
0 1.5
|
|
43
|
+
"""
|
|
44
|
+
frame = pandas.read_stata(path)
|
|
45
|
+
|
|
46
|
+
return frame
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def write_stata_file(frame: pandas.DataFrame, path: Path) -> None:
|
|
50
|
+
"""
|
|
51
|
+
Write the columns of a Table in a Stata file (``.dta``).
|
|
52
|
+
|
|
53
|
+
Stata stores integers and booleans holding missing values as decimals, and a missing text
|
|
54
|
+
as an empty text. Column names that Stata refuses, such as names with spaces, are changed
|
|
55
|
+
by pandas with a warning.
|
|
56
|
+
|
|
57
|
+
.. versionadded:: 0.1.0
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
frame
|
|
62
|
+
The columns of a Table.
|
|
63
|
+
path
|
|
64
|
+
The path of the file, replaced when it exists.
|
|
65
|
+
|
|
66
|
+
Raises
|
|
67
|
+
------
|
|
68
|
+
TimeZoneMismatchError
|
|
69
|
+
When a column holds datetimes with a time zone, which Stata files cannot store.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> import tempfile
|
|
74
|
+
>>> from pathlib import Path
|
|
75
|
+
>>> import pandas
|
|
76
|
+
>>> from numdaplot.tables.files.stata_file import write_stata_file
|
|
77
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.dta"
|
|
78
|
+
>>> write_stata_file(pandas.DataFrame({"price": [1.5]}), path)
|
|
79
|
+
>>> path.exists()
|
|
80
|
+
True
|
|
81
|
+
"""
|
|
82
|
+
require_no_time_zone(frame, STATA_OPERATION)
|
|
83
|
+
frame.to_stata(path, write_index=False)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
r"""
|
|
2
|
+
Settings of the Stata files a Table reads.
|
|
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.tables.files.column_names import ColumnNames
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class StataReadOptions:
|
|
15
|
+
r"""
|
|
16
|
+
Settings of a Stata file (``.dta``) read by ``Table.from_stata``.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
column_names
|
|
23
|
+
Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
|
|
24
|
+
the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
|
|
25
|
+
|
|
26
|
+
Raises
|
|
27
|
+
------
|
|
28
|
+
InvalidTypeError
|
|
29
|
+
When a setting is not of the type its annotation names.
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> import tempfile
|
|
34
|
+
>>> from pathlib import Path
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.dta"
|
|
37
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).to_stata(path)
|
|
38
|
+
>>> options = ndp.StataReadOptions(column_names=ndp.ColumnNames.KEPT)
|
|
39
|
+
>>> ndp.Table.from_stata(path, options).column_names
|
|
40
|
+
['price']
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
column_names: ColumnNames = ColumnNames.CLEANED
|
|
44
|
+
|
|
45
|
+
def __post_init__(self) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Check the type of every setting.
|
|
48
|
+
|
|
49
|
+
.. versionadded:: 0.1.0
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
InvalidTypeError
|
|
54
|
+
When a setting is not of the type its annotation names.
|
|
55
|
+
"""
|
|
56
|
+
require_field_types(self)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the SAS transport (XPT) files a Table reads.
|
|
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.tables.files.column_names import ColumnNames
|
|
11
|
+
from numdaplot.tables.files.encoding import Encoding
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class XptReadOptions:
|
|
16
|
+
"""
|
|
17
|
+
Settings of a SAS transport (XPT) file (``.xpt``) read by ``Table.from_xpt``.
|
|
18
|
+
|
|
19
|
+
These files are read only.
|
|
20
|
+
|
|
21
|
+
The example reads
|
|
22
|
+
[paxraw_d_short.xpt](https://github.com/Ryieru/numdaplot/blob/main/tests/data/paxraw_d_short.xpt),
|
|
23
|
+
a SAS transport file of 100 rows.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
encoding
|
|
30
|
+
The text encoding of the texts stored in the file, UTF-8 by default.
|
|
31
|
+
column_names
|
|
32
|
+
Whether the column names are cleaned, ``ColumnNames.CLEANED`` by default: the spaces, tabs and line breaks at
|
|
33
|
+
the start and the end of each name are removed. ``ColumnNames.KEPT`` keeps the names as written.
|
|
34
|
+
|
|
35
|
+
Raises
|
|
36
|
+
------
|
|
37
|
+
InvalidTypeError
|
|
38
|
+
When a setting is not of the type its annotation names.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> latin_1 = ndp.XptReadOptions(encoding=ndp.Encoding.LATIN_1)
|
|
44
|
+
>>> activity = ndp.Table.from_xpt("paxraw_d_short.xpt", latin_1)
|
|
45
|
+
>>> activity.row_count
|
|
46
|
+
100
|
|
47
|
+
>>> activity.column_names
|
|
48
|
+
['SEQN', 'PAXSTAT', 'PAXCAL', 'PAXDAY', 'PAXN', 'PAXHOUR', 'PAXMINUT', 'PAXINTEN', 'PAXSTEP']
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
encoding: Encoding = Encoding.UTF_8
|
|
52
|
+
column_names: ColumnNames = ColumnNames.CLEANED
|
|
53
|
+
|
|
54
|
+
def __post_init__(self) -> None:
|
|
55
|
+
"""
|
|
56
|
+
Check the type of every setting.
|
|
57
|
+
|
|
58
|
+
.. versionadded:: 0.1.0
|
|
59
|
+
|
|
60
|
+
Raises
|
|
61
|
+
------
|
|
62
|
+
InvalidTypeError
|
|
63
|
+
When a setting is not of the type its annotation names.
|
|
64
|
+
"""
|
|
65
|
+
require_field_types(self)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values of a Table satisfying a rule.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas
|
|
8
|
+
|
|
9
|
+
from numdaplot.rules.rule import Rule
|
|
10
|
+
from numdaplot.tables.filtering.column_mask import build_column_mask
|
|
11
|
+
from numdaplot.tables.frames.column import Column
|
|
12
|
+
from numdaplot.tables.frames.column_values import build_column
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def check_frame(frame: pandas.DataFrame, rule: Rule) -> pandas.DataFrame:
|
|
16
|
+
"""
|
|
17
|
+
Return which values of every column of a Table satisfy a rule.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
frame
|
|
24
|
+
The columns of a Table.
|
|
25
|
+
rule
|
|
26
|
+
Any rule of numdaplot. A missing value only satisfies ``IsMissing``.
|
|
27
|
+
|
|
28
|
+
Returns
|
|
29
|
+
-------
|
|
30
|
+
pandas.DataFrame
|
|
31
|
+
The same column names and rows, each value replaced by True or False.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
IncompatibleTypesError
|
|
36
|
+
When the rule does not apply to the type of one of the columns.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> import pandas
|
|
41
|
+
>>> import numdaplot as ndp
|
|
42
|
+
>>> from numdaplot.tables.filtering.checked_frame import check_frame
|
|
43
|
+
>>> check_frame(pandas.DataFrame({"price": [1.5, None]}), ndp.IsMissing())
|
|
44
|
+
price
|
|
45
|
+
0 False
|
|
46
|
+
1 True
|
|
47
|
+
"""
|
|
48
|
+
checked_columns = dict[str, Column]()
|
|
49
|
+
|
|
50
|
+
for column_name in frame.columns:
|
|
51
|
+
column = frame[column_name]
|
|
52
|
+
column_mask = build_column_mask(column, rule)
|
|
53
|
+
checked_name = str(column_name)
|
|
54
|
+
checked_columns[checked_name] = build_column(column_mask)
|
|
55
|
+
|
|
56
|
+
row_count = len(frame)
|
|
57
|
+
row_numbers = pandas.RangeIndex(row_count)
|
|
58
|
+
checked = pandas.DataFrame(checked_columns, index=row_numbers)
|
|
59
|
+
|
|
60
|
+
return checked
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Rows of a Table column satisfying a rule.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
from numpy.typing import NDArray
|
|
9
|
+
|
|
10
|
+
from numdaplot.arrays.selection.rule_mask import build_rule_mask
|
|
11
|
+
from numdaplot.rules.is_missing import IsMissing
|
|
12
|
+
from numdaplot.rules.is_present import IsPresent
|
|
13
|
+
from numdaplot.rules.rule import Rule
|
|
14
|
+
from numdaplot.tables.filtering.rule_moments import match_rule_time_zone
|
|
15
|
+
from numdaplot.tables.frames.column import Column
|
|
16
|
+
from numdaplot.tables.frames.column_values import find_column_missing, read_present_values
|
|
17
|
+
from numdaplot.tables.frames.named_column_errors import NamedColumnErrors
|
|
18
|
+
from numdaplot.tables.frames.time_zones import find_column_time_zone
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def build_column_mask(column: Column, rule: Rule) -> NDArray[numpy.bool_]:
|
|
22
|
+
"""
|
|
23
|
+
Return which values of a Table column satisfy a rule.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
column
|
|
30
|
+
A Table column.
|
|
31
|
+
rule
|
|
32
|
+
Any rule of numdaplot. A missing value only satisfies ``IsMissing``.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
NDArray[numpy.bool_]
|
|
37
|
+
True at each row whose value satisfies the rule.
|
|
38
|
+
|
|
39
|
+
Raises
|
|
40
|
+
------
|
|
41
|
+
IncompatibleTypesError
|
|
42
|
+
When the rule does not apply to the type of the column.
|
|
43
|
+
TimeZoneMismatchError
|
|
44
|
+
When a datetime of the rule has a time zone and the column has none, or the reverse.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import pandas
|
|
49
|
+
>>> import numdaplot as ndp
|
|
50
|
+
>>> from numdaplot.tables.filtering.column_mask import build_column_mask
|
|
51
|
+
>>> build_column_mask(pandas.Series([5, None, 12], dtype="Int64"), ndp.Greater(10))
|
|
52
|
+
array([False, False, True])
|
|
53
|
+
"""
|
|
54
|
+
missing = find_column_missing(column)
|
|
55
|
+
if isinstance(rule, IsMissing):
|
|
56
|
+
return missing
|
|
57
|
+
|
|
58
|
+
present = ~missing
|
|
59
|
+
if isinstance(rule, IsPresent):
|
|
60
|
+
return present
|
|
61
|
+
|
|
62
|
+
time_zone = find_column_time_zone(column)
|
|
63
|
+
matched_rule = match_rule_time_zone(rule, time_zone)
|
|
64
|
+
present_values = read_present_values(column)
|
|
65
|
+
with NamedColumnErrors(column):
|
|
66
|
+
present_mask = build_rule_mask(present_values, matched_rule)
|
|
67
|
+
|
|
68
|
+
mask = numpy.zeros(missing.shape, dtype=numpy.bool_)
|
|
69
|
+
mask[present] = present_mask
|
|
70
|
+
|
|
71
|
+
return mask
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
How the columns of a Condition combine.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ColumnMatch(Enum):
|
|
11
|
+
"""
|
|
12
|
+
How the columns of a ``Condition`` combine to satisfy it.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
|
|
20
|
+
>>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
|
|
21
|
+
>>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
|
|
22
|
+
>>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ALL)
|
|
23
|
+
>>> ranges.filter(ndp.Filter(conditions=[above_ten]))
|
|
24
|
+
low high
|
|
25
|
+
FLOAT64 FLOAT64
|
|
26
|
+
0 20.0 40.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
ANY = auto()
|
|
30
|
+
"""
|
|
31
|
+
A row satisfies the condition when at least one of the columns satisfies the rule. Default value.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
|
|
37
|
+
>>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
|
|
38
|
+
>>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
|
|
39
|
+
>>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ANY)
|
|
40
|
+
>>> ranges.filter(ndp.Filter(conditions=[above_ten]))
|
|
41
|
+
low high
|
|
42
|
+
FLOAT64 FLOAT64
|
|
43
|
+
0 5.0 30.0
|
|
44
|
+
1 20.0 40.0
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
ALL = auto()
|
|
48
|
+
"""
|
|
49
|
+
A row satisfies the condition when every column satisfies the rule.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> import numdaplot as ndp
|
|
54
|
+
>>> low = ndp.Array.from_list([1.0, 5.0, 20.0])
|
|
55
|
+
>>> high = ndp.Array.from_list([2.0, 30.0, 40.0])
|
|
56
|
+
>>> ranges = ndp.Table.from_arrays({"low": low, "high": high})
|
|
57
|
+
>>> above_ten = ndp.Condition(rule=ndp.Greater(10), mode=ndp.ColumnMatch.ALL)
|
|
58
|
+
>>> ranges.filter(ndp.Filter(conditions=[above_ten]))
|
|
59
|
+
low high
|
|
60
|
+
FLOAT64 FLOAT64
|
|
61
|
+
0 20.0 40.0
|
|
62
|
+
"""
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A rule applied to one or several columns 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.rules.rule import Rule
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
from numdaplot.tables.columns.column_names import require_column_names
|
|
13
|
+
from numdaplot.tables.filtering.column_match import ColumnMatch
|
|
14
|
+
|
|
15
|
+
COLUMN_ITEM_NAME = "column"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class Condition:
|
|
20
|
+
"""
|
|
21
|
+
A rule applied to one or several columns of a Table, used by ``Filter``.
|
|
22
|
+
|
|
23
|
+
A missing value only satisfies ``IsMissing``.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
rule
|
|
30
|
+
A ``Rule``, such as ``ndp.Greater(100)`` or ``ndp.IsIn(["Paris"])``: see ``Rule`` for every rule.
|
|
31
|
+
columns
|
|
32
|
+
The names of the columns the rule applies to, every column when omitted.
|
|
33
|
+
The condition keeps its own copy of the list.
|
|
34
|
+
mode
|
|
35
|
+
Whether one column satisfying the rule is enough, ``ColumnMatch.ANY`` by default, or every column must,
|
|
36
|
+
``ColumnMatch.ALL``.
|
|
37
|
+
|
|
38
|
+
Raises
|
|
39
|
+
------
|
|
40
|
+
InvalidTypeError
|
|
41
|
+
When a setting is not of the type its annotation names.
|
|
42
|
+
EmptyListError
|
|
43
|
+
When ``columns`` is an empty list.
|
|
44
|
+
InvalidColumnNameError
|
|
45
|
+
When a column name is an empty text.
|
|
46
|
+
DuplicateColumnError
|
|
47
|
+
When a column name appears twice.
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> import numdaplot as ndp
|
|
52
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0, 90.0])
|
|
53
|
+
>>> costs = ndp.Array.from_list([70.0, 60.0, 110.0])
|
|
54
|
+
>>> sales = ndp.Table.from_arrays({"price": prices, "cost": costs})
|
|
55
|
+
>>> above_hundred = ndp.Condition(rule=ndp.Greater(100), columns=["price", "cost"])
|
|
56
|
+
>>> sales.filter(ndp.Filter(conditions=[above_hundred]))
|
|
57
|
+
price cost
|
|
58
|
+
FLOAT64 FLOAT64
|
|
59
|
+
0 120.0 70.0
|
|
60
|
+
1 90.0 110.0
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
rule: Rule
|
|
64
|
+
columns: list[str] | None = None
|
|
65
|
+
mode: ColumnMatch = ColumnMatch.ANY
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
"""
|
|
69
|
+
Check the columns and replace them with a copy that only the condition holds.
|
|
70
|
+
|
|
71
|
+
.. versionadded:: 0.1.0
|
|
72
|
+
|
|
73
|
+
Raises
|
|
74
|
+
------
|
|
75
|
+
InvalidTypeError
|
|
76
|
+
When a setting is not of the type its annotation names.
|
|
77
|
+
EmptyListError
|
|
78
|
+
When ``columns`` is an empty list.
|
|
79
|
+
InvalidColumnNameError
|
|
80
|
+
When a column name is an empty text.
|
|
81
|
+
DuplicateColumnError
|
|
82
|
+
When a column name appears twice.
|
|
83
|
+
"""
|
|
84
|
+
require_field_types(self)
|
|
85
|
+
|
|
86
|
+
if self.columns is None:
|
|
87
|
+
return
|
|
88
|
+
|
|
89
|
+
if self.columns == []:
|
|
90
|
+
raise EmptyListError(COLUMN_ITEM_NAME)
|
|
91
|
+
|
|
92
|
+
require_column_names(self.columns)
|
|
93
|
+
columns_copy = list(self.columns)
|
|
94
|
+
object.__setattr__(self, "columns", columns_copy)
|