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,451 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Creation of a Table from a file.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Self
|
|
9
|
+
|
|
10
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
11
|
+
from numdaplot.tables.files.csv_file import read_csv_file
|
|
12
|
+
from numdaplot.tables.files.csv_read_options import CsvReadOptions
|
|
13
|
+
from numdaplot.tables.files.excel_file import read_excel_file
|
|
14
|
+
from numdaplot.tables.files.excel_read_options import ExcelReadOptions
|
|
15
|
+
from numdaplot.tables.files.file_access import READ_OPERATION, FileAccessErrors
|
|
16
|
+
from numdaplot.tables.files.file_paths import FilePath, require_existing_file
|
|
17
|
+
from numdaplot.tables.files.json_file import read_json_file
|
|
18
|
+
from numdaplot.tables.files.json_read_options import JsonReadOptions
|
|
19
|
+
from numdaplot.tables.files.parquet_file import read_parquet_file
|
|
20
|
+
from numdaplot.tables.files.parquet_read_options import ParquetReadOptions
|
|
21
|
+
from numdaplot.tables.files.sas_file import read_sas_file, read_xpt_file
|
|
22
|
+
from numdaplot.tables.files.sas_read_options import SasReadOptions
|
|
23
|
+
from numdaplot.tables.files.stata_file import read_stata_file
|
|
24
|
+
from numdaplot.tables.files.stata_read_options import StataReadOptions
|
|
25
|
+
from numdaplot.tables.files.xpt_read_options import XptReadOptions
|
|
26
|
+
from numdaplot.tables.table_data import TableData
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TableReading(TableData):
|
|
30
|
+
"""
|
|
31
|
+
Creation of a Table from a CSV, JSON, Excel, Parquet, Stata, SAS or XPT file.
|
|
32
|
+
|
|
33
|
+
Integers become ``INT64``, decimals ``FLOAT64`` and true or false values ``BOOL``. Any other column of a CSV
|
|
34
|
+
or JSON file becomes ``TEXT``, dates included: convert them afterwards. Empty cells and the usual markers
|
|
35
|
+
such as ``NA`` or ``null`` are read as missing values; ``missing_texts`` of ``CsvReadOptions`` and
|
|
36
|
+
``ExcelReadOptions`` chooses other ones.
|
|
37
|
+
|
|
38
|
+
.. versionadded:: 0.1.0
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
@checked_arguments
|
|
43
|
+
def from_csv(cls, path: FilePath, options: CsvReadOptions | None = None) -> Self:
|
|
44
|
+
r"""
|
|
45
|
+
Return a Table read from a CSV file whose first row holds the column names.
|
|
46
|
+
|
|
47
|
+
Each column takes the type of all its values, even in a long file: a column mixing numbers and texts is read
|
|
48
|
+
as texts written as in the file, such as ``01``.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
path
|
|
55
|
+
The path of the file, a ``FilePath`` such as ``"sales.csv"`` or ``Path("data/sales.csv")``.
|
|
56
|
+
options
|
|
57
|
+
The separator and the encoding, ``","`` and UTF-8 when omitted.
|
|
58
|
+
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
|
+
Self
|
|
62
|
+
A new Table, empty for an empty file.
|
|
63
|
+
|
|
64
|
+
Raises
|
|
65
|
+
------
|
|
66
|
+
InvalidTypeError
|
|
67
|
+
When an argument is not of the type its annotation names.
|
|
68
|
+
FileNotFoundError
|
|
69
|
+
When there is no file at the path.
|
|
70
|
+
FileAccessError
|
|
71
|
+
When the file system refuses the file, for a missing permission for example.
|
|
72
|
+
InvalidColumnNameError, DuplicateColumnError
|
|
73
|
+
When a column name is empty, even once cleaned, or appears twice, or two names become the same once
|
|
74
|
+
cleaned.
|
|
75
|
+
|
|
76
|
+
Examples
|
|
77
|
+
--------
|
|
78
|
+
>>> import tempfile
|
|
79
|
+
>>> from pathlib import Path
|
|
80
|
+
>>> import numdaplot as ndp
|
|
81
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.csv"
|
|
82
|
+
>>> _ = path.write_text("city;price\nParis;1.5\nLyon;\n")
|
|
83
|
+
>>> ndp.Table.from_csv(path, ndp.CsvReadOptions(separator=";"))
|
|
84
|
+
city price
|
|
85
|
+
TEXT FLOAT64
|
|
86
|
+
0 Paris 1.5
|
|
87
|
+
1 Lyon NaN
|
|
88
|
+
"""
|
|
89
|
+
if options is None:
|
|
90
|
+
options = CsvReadOptions()
|
|
91
|
+
|
|
92
|
+
file_path = Path(path)
|
|
93
|
+
require_existing_file(file_path)
|
|
94
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
95
|
+
frame = read_csv_file(file_path, options)
|
|
96
|
+
|
|
97
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
98
|
+
|
|
99
|
+
return table
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
@checked_arguments
|
|
103
|
+
def from_json(cls, path: FilePath, options: JsonReadOptions | None = None) -> Self:
|
|
104
|
+
r"""
|
|
105
|
+
Return a Table read from a JSON file in UTF-8 holding one object per row.
|
|
106
|
+
|
|
107
|
+
Each column takes the type of its JSON values: a text that looks like a number or a date stays a text.
|
|
108
|
+
|
|
109
|
+
.. versionadded:: 0.1.0
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
path
|
|
114
|
+
The path of the file, a ``FilePath`` such as ``"sales.json"`` or ``Path("data/sales.json")``.
|
|
115
|
+
options
|
|
116
|
+
The layout of the rows, one list of objects when omitted.
|
|
117
|
+
|
|
118
|
+
Returns
|
|
119
|
+
-------
|
|
120
|
+
Self
|
|
121
|
+
A new Table, with one column per name found in the objects.
|
|
122
|
+
|
|
123
|
+
Raises
|
|
124
|
+
------
|
|
125
|
+
InvalidTypeError
|
|
126
|
+
When an argument is not of the type its annotation names.
|
|
127
|
+
FileNotFoundError
|
|
128
|
+
When there is no file at the path.
|
|
129
|
+
FileAccessError
|
|
130
|
+
When the file system refuses the file, for a missing permission for example.
|
|
131
|
+
InvalidColumnNameError, DuplicateColumnError
|
|
132
|
+
When a column name is empty, even once cleaned, or two names become the same once cleaned.
|
|
133
|
+
|
|
134
|
+
Examples
|
|
135
|
+
--------
|
|
136
|
+
>>> import tempfile
|
|
137
|
+
>>> from pathlib import Path
|
|
138
|
+
>>> import numdaplot as ndp
|
|
139
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.jsonl"
|
|
140
|
+
>>> _ = path.write_text('{"city": "Paris", "count": 2}\n{"city": "Lyon", "count": null}\n')
|
|
141
|
+
>>> ndp.Table.from_json(path, ndp.JsonReadOptions(layout=ndp.JsonLayout.LINES))
|
|
142
|
+
city count
|
|
143
|
+
TEXT INT64
|
|
144
|
+
0 Paris 2
|
|
145
|
+
1 Lyon <NA>
|
|
146
|
+
"""
|
|
147
|
+
file_path = Path(path)
|
|
148
|
+
require_existing_file(file_path)
|
|
149
|
+
if options is None:
|
|
150
|
+
options = JsonReadOptions()
|
|
151
|
+
|
|
152
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
153
|
+
frame = read_json_file(file_path, options)
|
|
154
|
+
|
|
155
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
156
|
+
|
|
157
|
+
return table
|
|
158
|
+
|
|
159
|
+
@classmethod
|
|
160
|
+
@checked_arguments
|
|
161
|
+
def from_excel(cls, path: FilePath, options: ExcelReadOptions | None = None) -> Self:
|
|
162
|
+
"""
|
|
163
|
+
Return a Table read from a sheet of an Excel file whose first row holds the column names.
|
|
164
|
+
|
|
165
|
+
Needs the ``excel`` extra: ``pip install numdaplot[excel]``.
|
|
166
|
+
|
|
167
|
+
.. versionadded:: 0.1.0
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
path
|
|
172
|
+
The path of the file, a ``FilePath`` such as ``"sales.xlsx"`` or ``Path("data/sales.xlsx")``.
|
|
173
|
+
options
|
|
174
|
+
The sheet to read, the first one when omitted.
|
|
175
|
+
|
|
176
|
+
Returns
|
|
177
|
+
-------
|
|
178
|
+
Self
|
|
179
|
+
A new Table. Dates of the sheet become ``DATETIME`` columns. A column of time cells only, such as
|
|
180
|
+
``hh:mm``, becomes ``TIME``, and a column of duration cells only, such as ``[h]:mm``, ``DURATION``: a
|
|
181
|
+
column mixing them with texts stays ``TEXT``.
|
|
182
|
+
|
|
183
|
+
Raises
|
|
184
|
+
------
|
|
185
|
+
InvalidTypeError
|
|
186
|
+
When an argument is not of the type its annotation names.
|
|
187
|
+
FileNotFoundError
|
|
188
|
+
When there is no file at the path.
|
|
189
|
+
FileAccessError
|
|
190
|
+
When the file system refuses the file, for a missing permission for example.
|
|
191
|
+
MissingDependencyError
|
|
192
|
+
When the ``excel`` extra is not installed.
|
|
193
|
+
InvalidColumnNameError, DuplicateColumnError
|
|
194
|
+
When a cell of the first row is empty, even once cleaned, is not a text, or repeats another one, or two
|
|
195
|
+
names become the same once cleaned.
|
|
196
|
+
TimeOverflowError
|
|
197
|
+
When a column holds a datetime outside 1677 to 2262, or a duration beyond about 292 years.
|
|
198
|
+
|
|
199
|
+
Examples
|
|
200
|
+
--------
|
|
201
|
+
>>> import tempfile
|
|
202
|
+
>>> from pathlib import Path
|
|
203
|
+
>>> import numdaplot as ndp
|
|
204
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.xlsx"
|
|
205
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).to_excel(path)
|
|
206
|
+
>>> ndp.Table.from_excel(path).column_types
|
|
207
|
+
{'price': <Type.FLOAT64: 10>}
|
|
208
|
+
"""
|
|
209
|
+
file_path = Path(path)
|
|
210
|
+
require_existing_file(file_path)
|
|
211
|
+
if options is None:
|
|
212
|
+
options = ExcelReadOptions()
|
|
213
|
+
|
|
214
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
215
|
+
frame = read_excel_file(file_path, options)
|
|
216
|
+
|
|
217
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
218
|
+
|
|
219
|
+
return table
|
|
220
|
+
|
|
221
|
+
@classmethod
|
|
222
|
+
@checked_arguments
|
|
223
|
+
def from_parquet(cls, path: FilePath, options: ParquetReadOptions | None = None) -> Self:
|
|
224
|
+
"""
|
|
225
|
+
Return a Table read from a Parquet file.
|
|
226
|
+
|
|
227
|
+
Needs the ``parquet`` extra: ``pip install numdaplot[parquet]``.
|
|
228
|
+
|
|
229
|
+
.. versionadded:: 0.1.0
|
|
230
|
+
|
|
231
|
+
Parameters
|
|
232
|
+
----------
|
|
233
|
+
path
|
|
234
|
+
The path of the file, a ``FilePath`` such as ``"sales.parquet"`` or ``Path("data/sales.parquet")``.
|
|
235
|
+
options
|
|
236
|
+
Whether the column names are cleaned, cleaned when omitted.
|
|
237
|
+
|
|
238
|
+
Returns
|
|
239
|
+
-------
|
|
240
|
+
Self
|
|
241
|
+
A new Table, with the types stored in the file.
|
|
242
|
+
|
|
243
|
+
Raises
|
|
244
|
+
------
|
|
245
|
+
InvalidTypeError
|
|
246
|
+
When an argument is not of the type its annotation names.
|
|
247
|
+
FileNotFoundError
|
|
248
|
+
When there is no file at the path.
|
|
249
|
+
FileAccessError
|
|
250
|
+
When the file system refuses the file, for a missing permission for example.
|
|
251
|
+
MissingDependencyError
|
|
252
|
+
When the ``parquet`` extra is not installed.
|
|
253
|
+
TimeOverflowError
|
|
254
|
+
When a column holds a datetime outside 1677 to 2262, or a duration beyond about 292 years.
|
|
255
|
+
DuplicateColumnError
|
|
256
|
+
When two column names become the same once cleaned.
|
|
257
|
+
|
|
258
|
+
Examples
|
|
259
|
+
--------
|
|
260
|
+
>>> import tempfile
|
|
261
|
+
>>> from pathlib import Path
|
|
262
|
+
>>> import numdaplot as ndp
|
|
263
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.parquet"
|
|
264
|
+
>>> ndp.Table.from_arrays({"count": ndp.Array.from_list([3])}).to_parquet(path)
|
|
265
|
+
>>> ndp.Table.from_parquet(path).column_types
|
|
266
|
+
{'count': <Type.INT64: 4>}
|
|
267
|
+
"""
|
|
268
|
+
if options is None:
|
|
269
|
+
options = ParquetReadOptions()
|
|
270
|
+
|
|
271
|
+
file_path = Path(path)
|
|
272
|
+
require_existing_file(file_path)
|
|
273
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
274
|
+
frame = read_parquet_file(file_path)
|
|
275
|
+
|
|
276
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
277
|
+
|
|
278
|
+
return table
|
|
279
|
+
|
|
280
|
+
@classmethod
|
|
281
|
+
@checked_arguments
|
|
282
|
+
def from_stata(cls, path: FilePath, options: StataReadOptions | None = None) -> Self:
|
|
283
|
+
"""
|
|
284
|
+
Return a Table read from a Stata file (``.dta``).
|
|
285
|
+
|
|
286
|
+
.. versionadded:: 0.1.0
|
|
287
|
+
|
|
288
|
+
Parameters
|
|
289
|
+
----------
|
|
290
|
+
path
|
|
291
|
+
The path of the file, a ``FilePath`` such as ``"sales.dta"`` or ``Path("data/sales.dta")``.
|
|
292
|
+
options
|
|
293
|
+
Whether the column names are cleaned, cleaned when omitted.
|
|
294
|
+
|
|
295
|
+
Returns
|
|
296
|
+
-------
|
|
297
|
+
Self
|
|
298
|
+
A new Table, with the types stored in the file.
|
|
299
|
+
|
|
300
|
+
Raises
|
|
301
|
+
------
|
|
302
|
+
InvalidTypeError
|
|
303
|
+
When an argument is not of the type its annotation names.
|
|
304
|
+
FileNotFoundError
|
|
305
|
+
When there is no file at the path.
|
|
306
|
+
FileAccessError
|
|
307
|
+
When the file system refuses the file, for a missing permission for example.
|
|
308
|
+
TimeOverflowError
|
|
309
|
+
When a column holds a datetime outside 1677 to 2262, or a duration beyond about 292 years.
|
|
310
|
+
DuplicateColumnError
|
|
311
|
+
When two column names become the same once cleaned.
|
|
312
|
+
|
|
313
|
+
Examples
|
|
314
|
+
--------
|
|
315
|
+
>>> import tempfile
|
|
316
|
+
>>> from pathlib import Path
|
|
317
|
+
>>> import numdaplot as ndp
|
|
318
|
+
>>> path = Path(tempfile.mkdtemp()) / "sales.dta"
|
|
319
|
+
>>> ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])}).to_stata(path)
|
|
320
|
+
>>> ndp.Table.from_stata(path).column_types
|
|
321
|
+
{'price': <Type.FLOAT64: 10>}
|
|
322
|
+
"""
|
|
323
|
+
if options is None:
|
|
324
|
+
options = StataReadOptions()
|
|
325
|
+
|
|
326
|
+
file_path = Path(path)
|
|
327
|
+
require_existing_file(file_path)
|
|
328
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
329
|
+
frame = read_stata_file(file_path)
|
|
330
|
+
|
|
331
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
332
|
+
|
|
333
|
+
return table
|
|
334
|
+
|
|
335
|
+
@classmethod
|
|
336
|
+
@checked_arguments
|
|
337
|
+
def from_sas(cls, path: FilePath, options: SasReadOptions | None = None) -> Self:
|
|
338
|
+
"""
|
|
339
|
+
Return a Table read from a SAS data file (``.sas7bdat``). numdaplot does not write this format.
|
|
340
|
+
|
|
341
|
+
The example reads
|
|
342
|
+
[airline.sas7bdat](https://github.com/Ryieru/numdaplot/blob/main/tests/data/airline.sas7bdat),
|
|
343
|
+
a SAS data file of 32 rows.
|
|
344
|
+
|
|
345
|
+
.. versionadded:: 0.1.0
|
|
346
|
+
|
|
347
|
+
Parameters
|
|
348
|
+
----------
|
|
349
|
+
path
|
|
350
|
+
The path of the file, a ``FilePath`` such as ``"sales.sas7bdat"`` or ``Path("data/sales.sas7bdat")``.
|
|
351
|
+
options
|
|
352
|
+
The encoding of the texts, UTF-8 when omitted.
|
|
353
|
+
|
|
354
|
+
Returns
|
|
355
|
+
-------
|
|
356
|
+
Self
|
|
357
|
+
A new Table. SAS stores every number as a decimal, so numbers become ``FLOAT64``.
|
|
358
|
+
|
|
359
|
+
Raises
|
|
360
|
+
------
|
|
361
|
+
InvalidTypeError
|
|
362
|
+
When an argument is not of the type its annotation names.
|
|
363
|
+
FileNotFoundError
|
|
364
|
+
When there is no file at the path.
|
|
365
|
+
FileAccessError
|
|
366
|
+
When the file system refuses the file, for a missing permission for example.
|
|
367
|
+
TimeOverflowError
|
|
368
|
+
When a column holds a datetime outside 1677 to 2262, or a duration beyond about 292 years.
|
|
369
|
+
DuplicateColumnError
|
|
370
|
+
When two column names become the same once cleaned.
|
|
371
|
+
|
|
372
|
+
Examples
|
|
373
|
+
--------
|
|
374
|
+
>>> import numdaplot as ndp
|
|
375
|
+
>>> airline = ndp.Table.from_sas("airline.sas7bdat")
|
|
376
|
+
>>> airline.preview(ndp.Preview(count=3))
|
|
377
|
+
YEAR Y W R L K
|
|
378
|
+
FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64 FLOAT64
|
|
379
|
+
0 1948.0 1.214 0.243 0.1454 1.415 0.612
|
|
380
|
+
1 1949.0 1.354 0.260 0.2181 1.384 0.559
|
|
381
|
+
2 1950.0 1.569 0.278 0.3157 1.388 0.573
|
|
382
|
+
"""
|
|
383
|
+
file_path = Path(path)
|
|
384
|
+
require_existing_file(file_path)
|
|
385
|
+
if options is None:
|
|
386
|
+
options = SasReadOptions()
|
|
387
|
+
|
|
388
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
389
|
+
frame = read_sas_file(file_path, options)
|
|
390
|
+
|
|
391
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
392
|
+
|
|
393
|
+
return table
|
|
394
|
+
|
|
395
|
+
@classmethod
|
|
396
|
+
@checked_arguments
|
|
397
|
+
def from_xpt(cls, path: FilePath, options: XptReadOptions | None = None) -> Self:
|
|
398
|
+
"""
|
|
399
|
+
Return a Table read from a SAS transport file (``.xpt``). numdaplot does not write this format.
|
|
400
|
+
|
|
401
|
+
The example reads
|
|
402
|
+
[paxraw_d_short.xpt](https://github.com/Ryieru/numdaplot/blob/main/tests/data/paxraw_d_short.xpt),
|
|
403
|
+
a SAS transport file of 100 rows.
|
|
404
|
+
|
|
405
|
+
.. versionadded:: 0.1.0
|
|
406
|
+
|
|
407
|
+
Parameters
|
|
408
|
+
----------
|
|
409
|
+
path
|
|
410
|
+
The path of the file, a ``FilePath`` such as ``"sales.xpt"`` or ``Path("data/sales.xpt")``.
|
|
411
|
+
options
|
|
412
|
+
The encoding of the texts, UTF-8 when omitted.
|
|
413
|
+
|
|
414
|
+
Returns
|
|
415
|
+
-------
|
|
416
|
+
Self
|
|
417
|
+
A new Table. SAS stores every number as a decimal, so numbers become ``FLOAT64``.
|
|
418
|
+
|
|
419
|
+
Raises
|
|
420
|
+
------
|
|
421
|
+
InvalidTypeError
|
|
422
|
+
When an argument is not of the type its annotation names.
|
|
423
|
+
FileNotFoundError
|
|
424
|
+
When there is no file at the path.
|
|
425
|
+
FileAccessError
|
|
426
|
+
When the file system refuses the file, for a missing permission for example.
|
|
427
|
+
TimeOverflowError
|
|
428
|
+
When a column holds a datetime outside 1677 to 2262, or a duration beyond about 292 years.
|
|
429
|
+
DuplicateColumnError
|
|
430
|
+
When two column names become the same once cleaned.
|
|
431
|
+
|
|
432
|
+
Examples
|
|
433
|
+
--------
|
|
434
|
+
>>> import numdaplot as ndp
|
|
435
|
+
>>> activity = ndp.Table.from_xpt("paxraw_d_short.xpt")
|
|
436
|
+
>>> activity.row_count
|
|
437
|
+
100
|
|
438
|
+
>>> activity.column_names
|
|
439
|
+
['SEQN', 'PAXSTAT', 'PAXCAL', 'PAXDAY', 'PAXN', 'PAXHOUR', 'PAXMINUT', 'PAXINTEN', 'PAXSTEP']
|
|
440
|
+
"""
|
|
441
|
+
file_path = Path(path)
|
|
442
|
+
require_existing_file(file_path)
|
|
443
|
+
if options is None:
|
|
444
|
+
options = XptReadOptions()
|
|
445
|
+
|
|
446
|
+
with FileAccessErrors(READ_OPERATION, file_path):
|
|
447
|
+
frame = read_xpt_file(file_path, options)
|
|
448
|
+
|
|
449
|
+
table = cls._from_read_frame(frame, options.column_names)
|
|
450
|
+
|
|
451
|
+
return table
|