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,244 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pivot table of the rows of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any, cast
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
import pandas
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.data_types.type import Type
|
|
14
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
15
|
+
from numdaplot.tables.aggregation.aggregated_frame import compute_group_results, take_group_keys
|
|
16
|
+
from numdaplot.tables.aggregation.row_groups import find_row_groups, split_positions
|
|
17
|
+
from numdaplot.tables.columns.column_names import require_known_columns, require_unique_names
|
|
18
|
+
from numdaplot.tables.columns.conversion import Conversion
|
|
19
|
+
from numdaplot.tables.columns.converted_column import convert_column
|
|
20
|
+
from numdaplot.tables.frames.column import Column
|
|
21
|
+
from numdaplot.tables.frames.column_values import find_column_missing, find_column_type
|
|
22
|
+
from numdaplot.tables.pivot.pivot_table import PivotTable
|
|
23
|
+
|
|
24
|
+
MISSING_PIVOT_OPERATION = "Pivoting the column {column_name!r} while it holds missing values"
|
|
25
|
+
MISSING_PIVOT_ALTERNATIVE = "drop_missing with ndp.MissingDrop(columns=[{column_name!r}])"
|
|
26
|
+
DECIMAL_TYPES = frozenset({Type.FLOAT32, Type.FLOAT64})
|
|
27
|
+
FIRST_ROW = 0
|
|
28
|
+
ROW_POSITION_DTYPE = numpy.int64
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def pivot_frame(frame: pandas.DataFrame, pivot: PivotTable) -> pandas.DataFrame:
|
|
32
|
+
"""
|
|
33
|
+
Return one row per group of rows and one column per value of a column.
|
|
34
|
+
|
|
35
|
+
.. versionadded:: 0.1.0
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
frame
|
|
40
|
+
The columns of a Table.
|
|
41
|
+
pivot
|
|
42
|
+
The columns forming the rows and the columns of the result, and the statistic of each cell.
|
|
43
|
+
|
|
44
|
+
Returns
|
|
45
|
+
-------
|
|
46
|
+
pandas.DataFrame
|
|
47
|
+
The columns of ``rows``, then one column per value of ``columns``, both sorted.
|
|
48
|
+
|
|
49
|
+
Raises
|
|
50
|
+
------
|
|
51
|
+
ColumnNotFoundError
|
|
52
|
+
When a setting names a column the Table does not have.
|
|
53
|
+
RefusedOperationError
|
|
54
|
+
When the column of ``columns`` holds missing values.
|
|
55
|
+
DuplicateColumnError
|
|
56
|
+
When a value written as a text is also the name of a column of ``rows``.
|
|
57
|
+
IncompatibleTypesError
|
|
58
|
+
When the statistic does not apply to the type of its column.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
>>> import pandas
|
|
63
|
+
>>> import numdaplot as ndp
|
|
64
|
+
>>> from numdaplot.tables.pivot.pivoted_frame import pivot_frame
|
|
65
|
+
>>> days = pandas.Series(["Mon", "Tue", "Mon"], dtype="string")
|
|
66
|
+
>>> frame = pandas.DataFrame({"hour": [8, 8, 9], "day": days, "fare": [7.0, 9.0, 5.0]})
|
|
67
|
+
>>> total = ndp.Calculation(column="fare", function=ndp.Sum())
|
|
68
|
+
>>> pivot_frame(frame, ndp.PivotTable(rows=["hour"], columns="day", calculation=total))
|
|
69
|
+
hour Mon Tue
|
|
70
|
+
0 8 7.0 9.0
|
|
71
|
+
1 9 5.0 0.0
|
|
72
|
+
"""
|
|
73
|
+
column_names = [str(column_name) for column_name in frame.columns]
|
|
74
|
+
calculation = pivot.calculation
|
|
75
|
+
requested_names = [*pivot.rows, pivot.columns, calculation.column]
|
|
76
|
+
require_known_columns(requested_names, column_names)
|
|
77
|
+
pivot_column = frame[pivot.columns]
|
|
78
|
+
require_present_pivot_values(pivot_column, pivot.columns)
|
|
79
|
+
row_groups = find_row_groups(frame, pivot.rows)
|
|
80
|
+
column_groups = find_row_groups(frame, [pivot.columns])
|
|
81
|
+
value_names = name_value_columns(pivot_column, column_groups, pivot.columns)
|
|
82
|
+
output_names = [*pivot.rows, *value_names]
|
|
83
|
+
require_unique_names(output_names)
|
|
84
|
+
row_count = len(frame)
|
|
85
|
+
group_numbers = number_row_groups(row_groups, row_count)
|
|
86
|
+
group_count = len(row_groups)
|
|
87
|
+
result_columns = take_group_keys(frame, pivot.rows, row_groups)
|
|
88
|
+
value_column = frame[calculation.column]
|
|
89
|
+
|
|
90
|
+
for value_name, column_rows in zip(value_names, column_groups, strict=True):
|
|
91
|
+
column_group_numbers = group_numbers[column_rows]
|
|
92
|
+
cell_rows = split_positions(column_rows, column_group_numbers, group_count)
|
|
93
|
+
result_columns[value_name] = compute_group_results(value_column, calculation.function, cell_rows)
|
|
94
|
+
|
|
95
|
+
result_numbers = pandas.RangeIndex(group_count)
|
|
96
|
+
pivoted_frame = pandas.DataFrame(result_columns, index=result_numbers)
|
|
97
|
+
|
|
98
|
+
return pivoted_frame
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def require_present_pivot_values(pivot_column: Column, column_name: str) -> None:
|
|
102
|
+
"""
|
|
103
|
+
Check that the column giving its values to the result columns holds no missing value.
|
|
104
|
+
|
|
105
|
+
.. versionadded:: 0.1.0
|
|
106
|
+
|
|
107
|
+
Parameters
|
|
108
|
+
----------
|
|
109
|
+
pivot_column
|
|
110
|
+
The column.
|
|
111
|
+
column_name
|
|
112
|
+
Its name.
|
|
113
|
+
|
|
114
|
+
Raises
|
|
115
|
+
------
|
|
116
|
+
RefusedOperationError
|
|
117
|
+
When the column holds a missing value, which could not name a result column.
|
|
118
|
+
|
|
119
|
+
Examples
|
|
120
|
+
--------
|
|
121
|
+
>>> import pandas
|
|
122
|
+
>>> import numdaplot as ndp
|
|
123
|
+
>>> from numdaplot.tables.pivot.pivoted_frame import require_present_pivot_values
|
|
124
|
+
>>> try:
|
|
125
|
+
... require_present_pivot_values(pandas.Series(["Mon", None], dtype="string"), "day")
|
|
126
|
+
... except ndp.RefusedOperationError as error:
|
|
127
|
+
... print(error)
|
|
128
|
+
Pivoting the column 'day' while it holds missing values is not available,
|
|
129
|
+
use drop_missing with ndp.MissingDrop(columns=['day']) instead.
|
|
130
|
+
"""
|
|
131
|
+
missing = find_column_missing(pivot_column)
|
|
132
|
+
has_missing = bool(missing.any())
|
|
133
|
+
if has_missing:
|
|
134
|
+
operation = MISSING_PIVOT_OPERATION.format(column_name=column_name)
|
|
135
|
+
alternative = MISSING_PIVOT_ALTERNATIVE.format(column_name=column_name)
|
|
136
|
+
raise RefusedOperationError(operation, alternative)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def name_value_columns(pivot_column: Column, column_groups: list[NDArray[Any]], column_name: str) -> list[str]:
|
|
140
|
+
"""
|
|
141
|
+
Return the name of the result column of each value, the value written as a text.
|
|
142
|
+
|
|
143
|
+
.. versionadded:: 0.1.0
|
|
144
|
+
|
|
145
|
+
Parameters
|
|
146
|
+
----------
|
|
147
|
+
pivot_column
|
|
148
|
+
The column giving its values to the result columns.
|
|
149
|
+
column_groups
|
|
150
|
+
The rows of each value.
|
|
151
|
+
column_name
|
|
152
|
+
The name of the column.
|
|
153
|
+
|
|
154
|
+
Returns
|
|
155
|
+
-------
|
|
156
|
+
list[str]
|
|
157
|
+
One name per group. A whole decimal is written without decimal part.
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
>>> import numpy
|
|
162
|
+
>>> import pandas
|
|
163
|
+
>>> from numdaplot.tables.pivot.pivoted_frame import name_value_columns
|
|
164
|
+
>>> name_value_columns(pandas.Series([1.0, 2.5]), [numpy.array([0]), numpy.array([1])], "hour")
|
|
165
|
+
['1', '2.5']
|
|
166
|
+
"""
|
|
167
|
+
first_row_list = [column_group[FIRST_ROW] for column_group in column_groups]
|
|
168
|
+
first_rows = numpy.array(first_row_list, dtype=ROW_POSITION_DTYPE)
|
|
169
|
+
first_values = pivot_column.iloc[first_rows]
|
|
170
|
+
source_type = find_column_type(pivot_column)
|
|
171
|
+
if source_type in DECIMAL_TYPES:
|
|
172
|
+
decimals = cast(list[float], first_values.tolist())
|
|
173
|
+
decimal_names = [write_decimal(decimal) for decimal in decimals]
|
|
174
|
+
return decimal_names
|
|
175
|
+
|
|
176
|
+
text_conversion = Conversion(column=column_name, dtype=Type.TEXT)
|
|
177
|
+
value_texts = convert_column(first_values, text_conversion)
|
|
178
|
+
value_names = cast(list[str], value_texts.tolist())
|
|
179
|
+
|
|
180
|
+
return value_names
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def write_decimal(decimal: float) -> str:
|
|
184
|
+
"""
|
|
185
|
+
Return a decimal written as a text, without decimal part when it is whole.
|
|
186
|
+
|
|
187
|
+
.. versionadded:: 0.1.0
|
|
188
|
+
|
|
189
|
+
Parameters
|
|
190
|
+
----------
|
|
191
|
+
decimal
|
|
192
|
+
The decimal.
|
|
193
|
+
|
|
194
|
+
Returns
|
|
195
|
+
-------
|
|
196
|
+
str
|
|
197
|
+
The text.
|
|
198
|
+
|
|
199
|
+
Examples
|
|
200
|
+
--------
|
|
201
|
+
>>> from numdaplot.tables.pivot.pivoted_frame import write_decimal
|
|
202
|
+
>>> write_decimal(8.0)
|
|
203
|
+
'8'
|
|
204
|
+
>>> write_decimal(2.5)
|
|
205
|
+
'2.5'
|
|
206
|
+
"""
|
|
207
|
+
if decimal.is_integer():
|
|
208
|
+
whole_number = int(decimal)
|
|
209
|
+
return str(whole_number)
|
|
210
|
+
|
|
211
|
+
return str(decimal)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def number_row_groups(row_groups: list[NDArray[Any]], row_count: int) -> NDArray[Any]:
|
|
215
|
+
"""
|
|
216
|
+
Return the number of the group of each row.
|
|
217
|
+
|
|
218
|
+
.. versionadded:: 0.1.0
|
|
219
|
+
|
|
220
|
+
Parameters
|
|
221
|
+
----------
|
|
222
|
+
row_groups
|
|
223
|
+
The rows of each group, every row being in one group.
|
|
224
|
+
row_count
|
|
225
|
+
The number of rows.
|
|
226
|
+
|
|
227
|
+
Returns
|
|
228
|
+
-------
|
|
229
|
+
NDArray
|
|
230
|
+
One group number per row.
|
|
231
|
+
|
|
232
|
+
Examples
|
|
233
|
+
--------
|
|
234
|
+
>>> import numpy
|
|
235
|
+
>>> from numdaplot.tables.pivot.pivoted_frame import number_row_groups
|
|
236
|
+
>>> number_row_groups([numpy.array([1]), numpy.array([0, 2])], 3)
|
|
237
|
+
array([1, 0, 1])
|
|
238
|
+
"""
|
|
239
|
+
group_numbers = numpy.zeros(row_count, dtype=ROW_POSITION_DTYPE)
|
|
240
|
+
|
|
241
|
+
for group_number, row_group in enumerate(row_groups):
|
|
242
|
+
group_numbers[row_group] = group_number
|
|
243
|
+
|
|
244
|
+
return group_numbers
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Display of a Table in a terminal or in a Jupyter notebook.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from importlib import import_module
|
|
8
|
+
from importlib.util import find_spec
|
|
9
|
+
|
|
10
|
+
import pandas
|
|
11
|
+
|
|
12
|
+
from numdaplot.tables.frames.table_text import build_typed_frame, format_table, write_empty_table_note
|
|
13
|
+
from numdaplot.tables.preview.shown_columns import ShownColumns
|
|
14
|
+
|
|
15
|
+
IPYTHON_PACKAGE = "IPython"
|
|
16
|
+
IPYTHON_DISPLAY_MODULE = "IPython.display"
|
|
17
|
+
NOTEBOOK_KERNEL = "IPKernelApp"
|
|
18
|
+
COMPACT_NOTEBOOK_COLUMN_COUNT = 10
|
|
19
|
+
NOTE_HTML = "<p>{note}</p>"
|
|
20
|
+
MAX_ROWS_OPTION = "display.max_rows"
|
|
21
|
+
MIN_ROWS_OPTION = "display.min_rows"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def show_frame(frame: pandas.DataFrame, shown_columns: ShownColumns) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Show the columns of a Table: as an HTML table in a Jupyter notebook, as text anywhere else.
|
|
27
|
+
|
|
28
|
+
The type of each column is shown under its name.
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
frame
|
|
35
|
+
The rows to show.
|
|
36
|
+
shown_columns
|
|
37
|
+
Whether every column is shown. A compact HTML table shows 10 columns.
|
|
38
|
+
|
|
39
|
+
Examples
|
|
40
|
+
--------
|
|
41
|
+
>>> import pandas
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> from numdaplot.tables.preview.notebook_display import show_frame
|
|
44
|
+
>>> show_frame(pandas.DataFrame({"price": [1.5]}), ndp.ShownColumns.ALL)
|
|
45
|
+
price
|
|
46
|
+
FLOAT64
|
|
47
|
+
0 1.5
|
|
48
|
+
"""
|
|
49
|
+
runs_in_notebook = is_notebook()
|
|
50
|
+
if not runs_in_notebook:
|
|
51
|
+
table_text = format_table(frame, shown_columns)
|
|
52
|
+
print(table_text)
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
table_html = format_table_html(frame, shown_columns)
|
|
56
|
+
display_html(table_html)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def format_table_html(frame: pandas.DataFrame, shown_columns: ShownColumns) -> str:
|
|
60
|
+
"""
|
|
61
|
+
Return the HTML table of the columns of a Table, with the type of each column under its name.
|
|
62
|
+
|
|
63
|
+
A long Table only shows its first and last rows, following the pandas display settings, as its text does.
|
|
64
|
+
|
|
65
|
+
.. versionadded:: 0.1.0
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
frame
|
|
70
|
+
The columns of a Table.
|
|
71
|
+
shown_columns
|
|
72
|
+
Whether every column is shown. A compact HTML table shows 10 columns.
|
|
73
|
+
|
|
74
|
+
Returns
|
|
75
|
+
-------
|
|
76
|
+
str
|
|
77
|
+
The HTML table, followed by a note for a Table without rows, or only the note for a Table without columns.
|
|
78
|
+
|
|
79
|
+
Examples
|
|
80
|
+
--------
|
|
81
|
+
>>> import pandas
|
|
82
|
+
>>> import numdaplot as ndp
|
|
83
|
+
>>> from numdaplot.tables.preview.notebook_display import format_table_html
|
|
84
|
+
>>> table_html = format_table_html(pandas.DataFrame({"price": [1.5]}), ndp.ShownColumns.ALL)
|
|
85
|
+
>>> "FLOAT64" in table_html
|
|
86
|
+
True
|
|
87
|
+
"""
|
|
88
|
+
note = write_empty_table_note(frame)
|
|
89
|
+
column_count = len(frame.columns)
|
|
90
|
+
if column_count == 0:
|
|
91
|
+
note_html = NOTE_HTML.format(note=note)
|
|
92
|
+
return note_html
|
|
93
|
+
|
|
94
|
+
typed_frame = build_typed_frame(frame)
|
|
95
|
+
column_limit = None
|
|
96
|
+
are_columns_left_out = False
|
|
97
|
+
if shown_columns == ShownColumns.COMPACT:
|
|
98
|
+
column_limit = COMPACT_NOTEBOOK_COLUMN_COUNT
|
|
99
|
+
are_columns_left_out = column_count > column_limit
|
|
100
|
+
|
|
101
|
+
row_count = len(frame.index)
|
|
102
|
+
row_limit = find_shown_row_count(row_count)
|
|
103
|
+
are_rows_left_out = row_limit is not None
|
|
104
|
+
# pandas writes the size of the Table under it, as in its text, only when rows or columns are left out.
|
|
105
|
+
shows_size = are_rows_left_out or are_columns_left_out
|
|
106
|
+
table_html = typed_frame.to_html(max_rows=row_limit, max_cols=column_limit, show_dimensions=shows_size)
|
|
107
|
+
if note is not None:
|
|
108
|
+
note_html = NOTE_HTML.format(note=note)
|
|
109
|
+
table_html += note_html
|
|
110
|
+
|
|
111
|
+
return table_html
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def find_shown_row_count(row_count: int) -> int | None:
|
|
115
|
+
"""
|
|
116
|
+
Return how many rows pandas shows for a Table of this length.
|
|
117
|
+
|
|
118
|
+
pandas shows every row up to ``display.max_rows``, and only ``display.min_rows`` of them, the first and last
|
|
119
|
+
ones, beyond it. A missing ``display.min_rows`` or one above ``display.max_rows`` shows ``display.max_rows`` rows.
|
|
120
|
+
|
|
121
|
+
.. versionadded:: 0.1.0
|
|
122
|
+
|
|
123
|
+
Parameters
|
|
124
|
+
----------
|
|
125
|
+
row_count
|
|
126
|
+
The number of rows of the Table.
|
|
127
|
+
|
|
128
|
+
Returns
|
|
129
|
+
-------
|
|
130
|
+
int or None
|
|
131
|
+
The number of rows shown, or None to show every row.
|
|
132
|
+
|
|
133
|
+
Examples
|
|
134
|
+
--------
|
|
135
|
+
>>> from numdaplot.tables.preview.notebook_display import find_shown_row_count
|
|
136
|
+
>>> find_shown_row_count(5) is None
|
|
137
|
+
True
|
|
138
|
+
>>> find_shown_row_count(1000)
|
|
139
|
+
10
|
|
140
|
+
"""
|
|
141
|
+
max_rows = pandas.get_option(MAX_ROWS_OPTION)
|
|
142
|
+
if max_rows is None:
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
if row_count <= max_rows:
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
min_rows = pandas.get_option(MIN_ROWS_OPTION)
|
|
149
|
+
if min_rows is None:
|
|
150
|
+
return max_rows
|
|
151
|
+
|
|
152
|
+
shown_row_count = min(min_rows, max_rows)
|
|
153
|
+
|
|
154
|
+
return shown_row_count
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def show_pandas_frame(frame: pandas.DataFrame) -> None:
|
|
158
|
+
"""
|
|
159
|
+
Show a pandas DataFrame as it is: as an HTML table in a Jupyter notebook, as text anywhere else.
|
|
160
|
+
|
|
161
|
+
.. versionadded:: 0.1.0
|
|
162
|
+
|
|
163
|
+
Parameters
|
|
164
|
+
----------
|
|
165
|
+
frame
|
|
166
|
+
The rows to show, with their header.
|
|
167
|
+
|
|
168
|
+
Examples
|
|
169
|
+
--------
|
|
170
|
+
>>> import pandas
|
|
171
|
+
>>> from numdaplot.tables.preview.notebook_display import show_pandas_frame
|
|
172
|
+
>>> show_pandas_frame(pandas.DataFrame({"price": [1.5]}))
|
|
173
|
+
price
|
|
174
|
+
0 1.5
|
|
175
|
+
"""
|
|
176
|
+
runs_in_notebook = is_notebook()
|
|
177
|
+
if not runs_in_notebook:
|
|
178
|
+
frame_text = repr(frame)
|
|
179
|
+
print(frame_text)
|
|
180
|
+
return
|
|
181
|
+
|
|
182
|
+
frame_html = frame.to_html()
|
|
183
|
+
display_html(frame_html)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def display_html(frame_html: str) -> None:
|
|
187
|
+
"""
|
|
188
|
+
Show an HTML table in a Jupyter notebook.
|
|
189
|
+
|
|
190
|
+
.. versionadded:: 0.1.0
|
|
191
|
+
|
|
192
|
+
Parameters
|
|
193
|
+
----------
|
|
194
|
+
frame_html
|
|
195
|
+
The HTML table.
|
|
196
|
+
|
|
197
|
+
Examples
|
|
198
|
+
--------
|
|
199
|
+
>>> from numdaplot.tables.preview.notebook_display import display_html, is_notebook
|
|
200
|
+
>>> if is_notebook():
|
|
201
|
+
... display_html("<table></table>")
|
|
202
|
+
"""
|
|
203
|
+
display_module = import_module(IPYTHON_DISPLAY_MODULE)
|
|
204
|
+
html_object = display_module.HTML(frame_html)
|
|
205
|
+
display_module.display(html_object)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def is_notebook() -> bool:
|
|
209
|
+
"""
|
|
210
|
+
Return whether the code runs in a Jupyter notebook.
|
|
211
|
+
|
|
212
|
+
IPython is optional: without it, the code never runs in a notebook.
|
|
213
|
+
|
|
214
|
+
.. versionadded:: 0.1.0
|
|
215
|
+
|
|
216
|
+
Returns
|
|
217
|
+
-------
|
|
218
|
+
bool
|
|
219
|
+
True inside a Jupyter kernel, False in a terminal or a script.
|
|
220
|
+
|
|
221
|
+
Examples
|
|
222
|
+
--------
|
|
223
|
+
>>> from numdaplot.tables.preview.notebook_display import is_notebook
|
|
224
|
+
>>> is_notebook()
|
|
225
|
+
False
|
|
226
|
+
"""
|
|
227
|
+
ipython_spec = find_spec(IPYTHON_PACKAGE)
|
|
228
|
+
if ipython_spec is None:
|
|
229
|
+
return False
|
|
230
|
+
|
|
231
|
+
ipython_module = import_module(IPYTHON_PACKAGE)
|
|
232
|
+
shell = ipython_module.get_ipython()
|
|
233
|
+
if shell is None:
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
runs_in_kernel = NOTEBOOK_KERNEL in shell.config
|
|
237
|
+
|
|
238
|
+
return runs_in_kernel
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of the preview of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.creation.random_values import require_valid_seed
|
|
10
|
+
from numdaplot.errors.invalid_count_error import InvalidCountError
|
|
11
|
+
from numdaplot.errors.refused_setting_error import RefusedSettingError
|
|
12
|
+
from numdaplot.settings.field_types import require_field_types
|
|
13
|
+
from numdaplot.tables.preview.shown_columns import ShownColumns
|
|
14
|
+
from numdaplot.tables.preview.side import Side
|
|
15
|
+
|
|
16
|
+
DEFAULT_PREVIEW_COUNT = 5
|
|
17
|
+
MINIMUM_PREVIEW_COUNT = 1
|
|
18
|
+
SEED_SETTING = "seed"
|
|
19
|
+
SIDE_OWNER = "Side.{side_name}"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class Preview:
|
|
24
|
+
"""
|
|
25
|
+
How many rows of a Table to show, which ones, and how its columns are shown, used by ``Table.preview``.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
count
|
|
32
|
+
The number of rows, 5 by default. A shorter Table shows all its rows.
|
|
33
|
+
side
|
|
34
|
+
The first rows, ``Side.START`` by default, the last rows, ``Side.END``, or rows drawn at random,
|
|
35
|
+
``Side.RANDOM``.
|
|
36
|
+
seed
|
|
37
|
+
The seed of the random draw, to show the same rows each time, other rows at each call when omitted. Only
|
|
38
|
+
``Side.RANDOM`` accepts it.
|
|
39
|
+
columns
|
|
40
|
+
``ShownColumns.ALL`` by default to show every column, going on after a line break when they do not fit, or
|
|
41
|
+
``ShownColumns.COMPACT`` to replace those that do not fit by ``...``.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
InvalidTypeError
|
|
46
|
+
When a setting is not of the type its annotation names.
|
|
47
|
+
InvalidCountError
|
|
48
|
+
When ``count`` is lower than 1.
|
|
49
|
+
InvalidSeedError
|
|
50
|
+
When ``seed`` is negative.
|
|
51
|
+
RefusedSettingError
|
|
52
|
+
When ``seed`` is given with ``Side.START`` or ``Side.END``, which draw nothing.
|
|
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))
|
|
61
|
+
city price
|
|
62
|
+
TEXT FLOAT64
|
|
63
|
+
0 Paris 120.0
|
|
64
|
+
1 Lyon 80.0
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
count: int = DEFAULT_PREVIEW_COUNT
|
|
68
|
+
side: Side = Side.START
|
|
69
|
+
seed: int | None = None
|
|
70
|
+
columns: ShownColumns = ShownColumns.ALL
|
|
71
|
+
|
|
72
|
+
def __post_init__(self) -> None:
|
|
73
|
+
"""
|
|
74
|
+
Check the side, the count and the seed, which only a random draw uses.
|
|
75
|
+
|
|
76
|
+
.. versionadded:: 0.1.0
|
|
77
|
+
|
|
78
|
+
Raises
|
|
79
|
+
------
|
|
80
|
+
InvalidTypeError
|
|
81
|
+
When a setting is not of the type its annotation names.
|
|
82
|
+
InvalidCountError
|
|
83
|
+
When ``count`` is lower than 1.
|
|
84
|
+
InvalidSeedError
|
|
85
|
+
When ``seed`` is negative.
|
|
86
|
+
RefusedSettingError
|
|
87
|
+
When ``seed`` is given with ``Side.START`` or ``Side.END``.
|
|
88
|
+
"""
|
|
89
|
+
require_field_types(self)
|
|
90
|
+
|
|
91
|
+
if self.count < MINIMUM_PREVIEW_COUNT:
|
|
92
|
+
raise InvalidCountError(self.count, MINIMUM_PREVIEW_COUNT)
|
|
93
|
+
|
|
94
|
+
if self.seed is None:
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
require_valid_seed(self.seed)
|
|
98
|
+
if self.side != Side.RANDOM:
|
|
99
|
+
side_owner = SIDE_OWNER.format(side_name=self.side.name)
|
|
100
|
+
raise RefusedSettingError(SEED_SETTING, side_owner)
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Rows of a Table shown by a preview.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
import pandas
|
|
9
|
+
|
|
10
|
+
from numdaplot.tables.preview.preview import Preview
|
|
11
|
+
from numdaplot.tables.preview.side import Side
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def choose_preview_rows(frame: pandas.DataFrame, preview: Preview) -> pandas.DataFrame:
|
|
15
|
+
"""
|
|
16
|
+
Return the rows of a Table that a preview shows, with their row numbers.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
frame
|
|
23
|
+
The columns of a Table.
|
|
24
|
+
preview
|
|
25
|
+
How many rows, and which ones.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
pandas.DataFrame
|
|
30
|
+
The chosen rows, in the order of the Table, keeping their numbers in the Table.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import pandas
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> from numdaplot.tables.preview.preview_rows import choose_preview_rows
|
|
37
|
+
>>> frame = pandas.DataFrame({"price": [1.0, 2.0, 3.0]})
|
|
38
|
+
>>> choose_preview_rows(frame, ndp.Preview(count=2, side=ndp.Side.END))
|
|
39
|
+
price
|
|
40
|
+
1 2.0
|
|
41
|
+
2 3.0
|
|
42
|
+
"""
|
|
43
|
+
match preview.side:
|
|
44
|
+
case Side.START:
|
|
45
|
+
chosen_rows = frame.head(preview.count)
|
|
46
|
+
case Side.END:
|
|
47
|
+
chosen_rows = frame.tail(preview.count)
|
|
48
|
+
case Side.RANDOM:
|
|
49
|
+
row_count = len(frame)
|
|
50
|
+
drawn_count = min(preview.count, row_count)
|
|
51
|
+
generator = numpy.random.default_rng(preview.seed)
|
|
52
|
+
drawn_rows = frame.sample(n=drawn_count, random_state=generator)
|
|
53
|
+
chosen_rows = drawn_rows.sort_index()
|
|
54
|
+
|
|
55
|
+
return chosen_rows
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Which columns of a Table a preview shows.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ShownColumns(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Which columns of a Table ``Preview`` shows when they do not fit in the width of the terminal.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon"])
|
|
20
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0])
|
|
21
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
22
|
+
>>> sales.preview(ndp.Preview(columns=ndp.ShownColumns.ALL))
|
|
23
|
+
city price
|
|
24
|
+
TEXT FLOAT64
|
|
25
|
+
0 Paris 120.0
|
|
26
|
+
1 Lyon 80.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
ALL = auto()
|
|
30
|
+
"""
|
|
31
|
+
Every column, the columns going on after a line break, ended by a backslash, when they do not fit. Default value.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon"])
|
|
37
|
+
>>> prices = ndp.Array.from_list([120.0, 80.0])
|
|
38
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
39
|
+
>>> sales.preview(ndp.Preview(columns=ndp.ShownColumns.ALL))
|
|
40
|
+
city price
|
|
41
|
+
TEXT FLOAT64
|
|
42
|
+
0 Paris 120.0
|
|
43
|
+
1 Lyon 80.0
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
COMPACT = auto()
|
|
47
|
+
"""
|
|
48
|
+
Only the first and last columns that fit, the others replaced by ``...``.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numdaplot as ndp
|
|
53
|
+
>>> long_name = "a_very_long_column_name_{number}"
|
|
54
|
+
>>> columns = {long_name.format(number=number): ndp.Array.from_list([number]) for number in range(6)}
|
|
55
|
+
>>> wide_table = ndp.Table.from_arrays(columns)
|
|
56
|
+
>>> wide_table.preview(ndp.Preview(columns=ndp.ShownColumns.COMPACT))
|
|
57
|
+
a_very_long_column_name_0 ... a_very_long_column_name_5
|
|
58
|
+
INT64 ... INT64
|
|
59
|
+
0 0 ... 5
|
|
60
|
+
<BLANKLINE>
|
|
61
|
+
[1 rows x 6 columns]
|
|
62
|
+
"""
|