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,248 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Columns shown by the charts of a Plot, and the checks of the names they are shown under.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import cast
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.column_not_found_error import ColumnNotFoundError
|
|
10
|
+
from numdaplot.errors.duplicate_column_error import DuplicateColumnError
|
|
11
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
12
|
+
from numdaplot.plots.data.chart_values import ChartValues
|
|
13
|
+
from numdaplot.plots.data.missing_cells import MissingCounts
|
|
14
|
+
from numdaplot.plots.data.point_values import PointValues
|
|
15
|
+
from numdaplot.plots.data.sample_values import SampleValues
|
|
16
|
+
from numdaplot.tables.columns.renaming import Renaming
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def find_shown_columns(layers: list[ChartLayer]) -> set[str]:
|
|
20
|
+
"""
|
|
21
|
+
Return the names of the columns shown by the charts of a Plot.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
layers
|
|
28
|
+
The charts of the Plot and their values.
|
|
29
|
+
|
|
30
|
+
Returns
|
|
31
|
+
-------
|
|
32
|
+
set[str]
|
|
33
|
+
The ``x`` column, the drawn columns, the group, color and size columns, or the columns of a missing value
|
|
34
|
+
chart; ``"0"``, ``"1"``... for the columns of an Array.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
40
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
41
|
+
>>> from numdaplot.plots.data.shown_columns import find_shown_columns
|
|
42
|
+
>>> days = ndp.Array.from_list([1, 2])
|
|
43
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
44
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
|
|
45
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_table_values(sales, "day", ["price"], "LineChart"))
|
|
46
|
+
>>> sorted(find_shown_columns([layer]))
|
|
47
|
+
['day', 'price']
|
|
48
|
+
"""
|
|
49
|
+
shown_columns = set[str]()
|
|
50
|
+
for layer in layers:
|
|
51
|
+
value_columns = find_value_columns(layer.values)
|
|
52
|
+
shown_columns.update(value_columns)
|
|
53
|
+
if layer.points is not None:
|
|
54
|
+
point_columns = find_point_columns(layer.points)
|
|
55
|
+
shown_columns.update(point_columns)
|
|
56
|
+
|
|
57
|
+
return shown_columns
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def find_value_columns(values: ChartValues | SampleValues) -> list[str]:
|
|
61
|
+
"""
|
|
62
|
+
Return the names of the columns shown by the values of one chart.
|
|
63
|
+
|
|
64
|
+
.. versionadded:: 0.1.0
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
values
|
|
69
|
+
The values of a chart.
|
|
70
|
+
|
|
71
|
+
Returns
|
|
72
|
+
-------
|
|
73
|
+
list[str]
|
|
74
|
+
The column names, the columns of a missing value chart being its positions.
|
|
75
|
+
|
|
76
|
+
Examples
|
|
77
|
+
--------
|
|
78
|
+
>>> import numpy
|
|
79
|
+
>>> import numdaplot as ndp
|
|
80
|
+
>>> from numdaplot.plots.data.chart_values import Series
|
|
81
|
+
>>> from numdaplot.plots.data.sample_values import SampleValues
|
|
82
|
+
>>> from numdaplot.plots.data.shown_columns import find_value_columns
|
|
83
|
+
>>> prices = Series("price", numpy.array([12.0]))
|
|
84
|
+
>>> find_value_columns(SampleValues([prices], None, "city", "price", ndp.Type.FLOAT64))
|
|
85
|
+
['price', 'city']
|
|
86
|
+
"""
|
|
87
|
+
if isinstance(values, MissingCounts):
|
|
88
|
+
raw_columns = values.positions.values.tolist()
|
|
89
|
+
missing_columns = cast(list[str], raw_columns)
|
|
90
|
+
return missing_columns
|
|
91
|
+
|
|
92
|
+
value_columns = [series.name for series in values.series]
|
|
93
|
+
if isinstance(values, SampleValues):
|
|
94
|
+
group_columns = optional_names(values.group_name)
|
|
95
|
+
sample_columns = value_columns + group_columns
|
|
96
|
+
return sample_columns
|
|
97
|
+
|
|
98
|
+
position_columns = optional_names(values.positions.name)
|
|
99
|
+
chart_columns = position_columns + value_columns
|
|
100
|
+
|
|
101
|
+
return chart_columns
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def find_point_columns(points: PointValues) -> list[str]:
|
|
105
|
+
"""
|
|
106
|
+
Return the names of the color and size columns of a scatter chart.
|
|
107
|
+
|
|
108
|
+
.. versionadded:: 0.1.0
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
points
|
|
113
|
+
The colors and the sizes of the points.
|
|
114
|
+
|
|
115
|
+
Returns
|
|
116
|
+
-------
|
|
117
|
+
list[str]
|
|
118
|
+
The names of the columns given, empty when the points take no column.
|
|
119
|
+
|
|
120
|
+
Examples
|
|
121
|
+
--------
|
|
122
|
+
>>> from numdaplot.plots.data.point_values import PointValues
|
|
123
|
+
>>> from numdaplot.plots.data.shown_columns import find_point_columns
|
|
124
|
+
>>> find_point_columns(PointValues("zone", None, None, None))
|
|
125
|
+
['zone']
|
|
126
|
+
"""
|
|
127
|
+
color_columns = optional_names(points.color_name)
|
|
128
|
+
size_columns = optional_names(points.size_name)
|
|
129
|
+
point_columns = color_columns + size_columns
|
|
130
|
+
|
|
131
|
+
return point_columns
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def optional_names(name: str | None) -> list[str]:
|
|
135
|
+
"""
|
|
136
|
+
Return a name in a list, or an empty list when there is none.
|
|
137
|
+
|
|
138
|
+
.. versionadded:: 0.1.0
|
|
139
|
+
|
|
140
|
+
Parameters
|
|
141
|
+
----------
|
|
142
|
+
name
|
|
143
|
+
A column name, or None.
|
|
144
|
+
|
|
145
|
+
Returns
|
|
146
|
+
-------
|
|
147
|
+
list[str]
|
|
148
|
+
The name alone, or nothing.
|
|
149
|
+
|
|
150
|
+
Examples
|
|
151
|
+
--------
|
|
152
|
+
>>> from numdaplot.plots.data.shown_columns import optional_names
|
|
153
|
+
>>> optional_names("day"), optional_names(None)
|
|
154
|
+
(['day'], [])
|
|
155
|
+
"""
|
|
156
|
+
if name is None:
|
|
157
|
+
return []
|
|
158
|
+
|
|
159
|
+
names = [name]
|
|
160
|
+
|
|
161
|
+
return names
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def require_distinct_shown_names(layers: list[ChartLayer], renaming: Renaming | None) -> None:
|
|
165
|
+
"""
|
|
166
|
+
Check that no column is shown under the name of another column that keeps its own name.
|
|
167
|
+
|
|
168
|
+
.. versionadded:: 0.1.0
|
|
169
|
+
|
|
170
|
+
Parameters
|
|
171
|
+
----------
|
|
172
|
+
layers
|
|
173
|
+
The charts of the Plot known so far.
|
|
174
|
+
renaming
|
|
175
|
+
The names under which some columns are shown, or None.
|
|
176
|
+
|
|
177
|
+
Raises
|
|
178
|
+
------
|
|
179
|
+
DuplicateColumnError
|
|
180
|
+
When a new name is the name of another shown column that is not renamed itself.
|
|
181
|
+
|
|
182
|
+
Examples
|
|
183
|
+
--------
|
|
184
|
+
>>> import numdaplot as ndp
|
|
185
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
186
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
187
|
+
>>> from numdaplot.plots.data.shown_columns import require_distinct_shown_names
|
|
188
|
+
>>> days = ndp.Array.from_list([1, 2])
|
|
189
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
190
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
|
|
191
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_table_values(sales, "day", ["price"], "LineChart"))
|
|
192
|
+
>>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="price", new_name="day")])
|
|
193
|
+
>>> try:
|
|
194
|
+
... require_distinct_shown_names([layer], renaming)
|
|
195
|
+
... except ndp.DuplicateColumnError as error:
|
|
196
|
+
... print(error)
|
|
197
|
+
The column name 'day' appears more than once.
|
|
198
|
+
"""
|
|
199
|
+
if renaming is None:
|
|
200
|
+
return
|
|
201
|
+
|
|
202
|
+
shown_columns = find_shown_columns(layers)
|
|
203
|
+
renamed_columns = {change.old_name for change in renaming.changes}
|
|
204
|
+
kept_columns = shown_columns - renamed_columns
|
|
205
|
+
for change in renaming.changes:
|
|
206
|
+
if change.new_name in kept_columns:
|
|
207
|
+
raise DuplicateColumnError(change.new_name)
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def require_renamed_columns_shown(layers: list[ChartLayer], renaming: Renaming | None) -> None:
|
|
211
|
+
"""
|
|
212
|
+
Check that every renamed column is shown by a chart of the Plot.
|
|
213
|
+
|
|
214
|
+
.. versionadded:: 0.1.0
|
|
215
|
+
|
|
216
|
+
Parameters
|
|
217
|
+
----------
|
|
218
|
+
layers
|
|
219
|
+
Every chart of the Plot.
|
|
220
|
+
renaming
|
|
221
|
+
The names under which some columns are shown, or None.
|
|
222
|
+
|
|
223
|
+
Raises
|
|
224
|
+
------
|
|
225
|
+
ColumnNotFoundError
|
|
226
|
+
At the first renamed column that no chart shows.
|
|
227
|
+
|
|
228
|
+
Examples
|
|
229
|
+
--------
|
|
230
|
+
>>> import numdaplot as ndp
|
|
231
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
232
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
233
|
+
>>> from numdaplot.plots.data.shown_columns import require_renamed_columns_shown
|
|
234
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_array_values(ndp.Array.from_list([12.0]), "LineChart"))
|
|
235
|
+
>>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="prise", new_name="Price")])
|
|
236
|
+
>>> try:
|
|
237
|
+
... require_renamed_columns_shown([layer], renaming)
|
|
238
|
+
... except ndp.ColumnNotFoundError as error:
|
|
239
|
+
... print(error)
|
|
240
|
+
No column is named 'prise'.
|
|
241
|
+
"""
|
|
242
|
+
if renaming is None:
|
|
243
|
+
return
|
|
244
|
+
|
|
245
|
+
shown_columns = find_shown_columns(layers)
|
|
246
|
+
for change in renaming.changes:
|
|
247
|
+
if change.old_name not in shown_columns:
|
|
248
|
+
raise ColumnNotFoundError(change.old_name)
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values a chart draws from the columns of a Table.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import numpy
|
|
8
|
+
import pandas
|
|
9
|
+
from numpy.typing import NDArray
|
|
10
|
+
|
|
11
|
+
from numdaplot.data_types.type import Type
|
|
12
|
+
from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
|
|
13
|
+
from numdaplot.plots.data.column_reading import read_positions, read_values, require_same_family
|
|
14
|
+
from numdaplot.plots.data.position_kind import PositionKind
|
|
15
|
+
from numdaplot.tables.columns.column_names import require_known_columns
|
|
16
|
+
from numdaplot.tables.frames.column_values import find_column_type
|
|
17
|
+
from numdaplot.tables.table import Table
|
|
18
|
+
from numdaplot.tables.table_data import read_stored_frame
|
|
19
|
+
|
|
20
|
+
MAXIMUM_NAMED_COLUMNS = 3
|
|
21
|
+
NAME_SEPARATOR = ", "
|
|
22
|
+
SHORTENED_NAMES = "{joined_names} and {other_count} more"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def read_table_values(table: Table, x_name: str | None, y_names: list[str], chart_name: str) -> ChartValues:
|
|
26
|
+
"""
|
|
27
|
+
Return the positions and the series a chart draws from a Table.
|
|
28
|
+
|
|
29
|
+
A row whose ``x`` number or moment is missing draws no value, so it breaks a line. A row whose ``x`` text
|
|
30
|
+
is missing is left out, having no label.
|
|
31
|
+
|
|
32
|
+
.. versionadded:: 0.1.0
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
table
|
|
37
|
+
The Table drawn.
|
|
38
|
+
x_name
|
|
39
|
+
The column of the positions, or None for the row numbers.
|
|
40
|
+
y_names
|
|
41
|
+
The columns drawn, one series each: numbers, or times of day for a chart measuring them.
|
|
42
|
+
chart_name
|
|
43
|
+
Name of the chart class, shown in error messages.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
ChartValues
|
|
48
|
+
The positions, and one series per ``y`` column.
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
ColumnNotFoundError
|
|
53
|
+
When a column does not exist.
|
|
54
|
+
IncompatibleTypesError
|
|
55
|
+
When ``x`` holds booleans or durations, a ``y`` column holds neither numbers nor times of day for a chart
|
|
56
|
+
measuring them, or the ``y`` columns mix numbers and times of day.
|
|
57
|
+
|
|
58
|
+
Examples
|
|
59
|
+
--------
|
|
60
|
+
>>> import pandas
|
|
61
|
+
>>> import numdaplot as ndp
|
|
62
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
63
|
+
>>> sales = ndp.Table.from_pandas(pandas.DataFrame({"city": ["Paris", None, "Pau"], "price": [12.0, 15.5, None]}))
|
|
64
|
+
>>> chart_values = read_table_values(sales, "city", ["price"], "BarChart")
|
|
65
|
+
>>> chart_values.positions.values
|
|
66
|
+
array(['Paris', 'Pau'], dtype=object)
|
|
67
|
+
>>> chart_values.series[0].values
|
|
68
|
+
array([12., nan])
|
|
69
|
+
"""
|
|
70
|
+
frame = read_stored_frame(table)
|
|
71
|
+
column_names = frame.columns.tolist()
|
|
72
|
+
require_known_columns(y_names, column_names)
|
|
73
|
+
positions = read_table_positions(frame, x_name, chart_name)
|
|
74
|
+
missing_positions = find_missing_positions(positions)
|
|
75
|
+
rows = numpy.flatnonzero(~missing_positions)
|
|
76
|
+
if positions.kind != PositionKind.TEXTS:
|
|
77
|
+
rows = numpy.arange(len(frame))
|
|
78
|
+
|
|
79
|
+
kept_positions = Positions(positions.kind, positions.values[rows], positions.name)
|
|
80
|
+
column_series, value_type = read_series(frame, y_names, chart_name)
|
|
81
|
+
series = list[Series]()
|
|
82
|
+
|
|
83
|
+
for one_series in column_series:
|
|
84
|
+
drawn_numbers = numpy.where(missing_positions, numpy.nan, one_series.values)
|
|
85
|
+
kept_numbers = drawn_numbers[rows]
|
|
86
|
+
kept_series = Series(one_series.name, kept_numbers)
|
|
87
|
+
series.append(kept_series)
|
|
88
|
+
|
|
89
|
+
value_name = name_columns(y_names)
|
|
90
|
+
chart_values = ChartValues(kept_positions, series, rows, value_name, value_type)
|
|
91
|
+
|
|
92
|
+
return chart_values
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def read_table_positions(frame: pandas.DataFrame, x_name: str | None, chart_name: str) -> Positions:
|
|
96
|
+
"""
|
|
97
|
+
Return the ``x`` values of a chart drawing a Table.
|
|
98
|
+
|
|
99
|
+
.. versionadded:: 0.1.0
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
frame
|
|
104
|
+
The columns of the Table.
|
|
105
|
+
x_name
|
|
106
|
+
The column of the positions, or None for the row numbers.
|
|
107
|
+
chart_name
|
|
108
|
+
Name of the chart class, shown in error messages.
|
|
109
|
+
|
|
110
|
+
Returns
|
|
111
|
+
-------
|
|
112
|
+
Positions
|
|
113
|
+
The values of the column, or the row numbers from 0.
|
|
114
|
+
|
|
115
|
+
Raises
|
|
116
|
+
------
|
|
117
|
+
ColumnNotFoundError
|
|
118
|
+
When the ``x`` column does not exist.
|
|
119
|
+
IncompatibleTypesError
|
|
120
|
+
When the ``x`` column holds booleans or durations.
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
>>> import pandas
|
|
125
|
+
>>> from numdaplot.plots.data.table_values import read_table_positions
|
|
126
|
+
>>> read_table_positions(pandas.DataFrame({"price": [12.0, 15.5]}), None, "LineChart").values
|
|
127
|
+
array([0., 1.])
|
|
128
|
+
"""
|
|
129
|
+
if x_name is None:
|
|
130
|
+
row_count = len(frame)
|
|
131
|
+
row_numbers = numpy.arange(row_count, dtype=numpy.float64)
|
|
132
|
+
row_positions = Positions(PositionKind.NUMBERS, row_numbers, None)
|
|
133
|
+
return row_positions
|
|
134
|
+
|
|
135
|
+
column_names = frame.columns.tolist()
|
|
136
|
+
require_known_columns([x_name], column_names)
|
|
137
|
+
kind, values = read_positions(frame[x_name], chart_name)
|
|
138
|
+
column_positions = Positions(kind, values, x_name)
|
|
139
|
+
|
|
140
|
+
return column_positions
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def find_missing_positions(positions: Positions) -> NDArray[numpy.bool_]:
|
|
144
|
+
"""
|
|
145
|
+
Return which ``x`` values are missing.
|
|
146
|
+
|
|
147
|
+
.. versionadded:: 0.1.0
|
|
148
|
+
|
|
149
|
+
Parameters
|
|
150
|
+
----------
|
|
151
|
+
positions
|
|
152
|
+
The ``x`` values of a chart.
|
|
153
|
+
|
|
154
|
+
Returns
|
|
155
|
+
-------
|
|
156
|
+
NDArray[numpy.bool_]
|
|
157
|
+
True at each NaN number, NaT moment or missing text.
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
>>> import numpy
|
|
162
|
+
>>> from numdaplot.plots.data.chart_values import Positions
|
|
163
|
+
>>> from numdaplot.plots.data.position_kind import PositionKind
|
|
164
|
+
>>> from numdaplot.plots.data.table_values import find_missing_positions
|
|
165
|
+
>>> find_missing_positions(Positions(PositionKind.TEXTS, numpy.array(["Paris", None]), "city"))
|
|
166
|
+
array([False, True])
|
|
167
|
+
"""
|
|
168
|
+
missing_values = pandas.isna(positions.values)
|
|
169
|
+
|
|
170
|
+
return missing_values
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def read_series(frame: pandas.DataFrame, column_names: list[str], chart_name: str) -> tuple[list[Series], Type]:
|
|
174
|
+
"""
|
|
175
|
+
Return each column of values of a Table as a series named after it, with the type of the first column.
|
|
176
|
+
|
|
177
|
+
.. versionadded:: 0.1.0
|
|
178
|
+
|
|
179
|
+
Parameters
|
|
180
|
+
----------
|
|
181
|
+
frame
|
|
182
|
+
The columns of the Table.
|
|
183
|
+
column_names
|
|
184
|
+
The columns read, at least one, known to exist.
|
|
185
|
+
chart_name
|
|
186
|
+
Name of the chart class, shown in the error message.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
tuple[list[Series], Type]
|
|
191
|
+
One series per column, NaN where a value is missing, a time of day being its hours since midnight, and
|
|
192
|
+
the type of the first column.
|
|
193
|
+
|
|
194
|
+
Raises
|
|
195
|
+
------
|
|
196
|
+
IncompatibleTypesError
|
|
197
|
+
When a column holds neither numbers nor times of day for a chart measuring them, or the columns mix
|
|
198
|
+
numbers and times of day.
|
|
199
|
+
|
|
200
|
+
Examples
|
|
201
|
+
--------
|
|
202
|
+
>>> import pandas
|
|
203
|
+
>>> from numdaplot.plots.data.table_values import read_series
|
|
204
|
+
>>> frame = pandas.DataFrame({"price": [12.0, None]})
|
|
205
|
+
>>> series, value_type = read_series(frame, ["price"], "BoxChart")
|
|
206
|
+
>>> series[0].values, value_type
|
|
207
|
+
(array([12., nan]), <Type.FLOAT64: 10>)
|
|
208
|
+
"""
|
|
209
|
+
series = list[Series]()
|
|
210
|
+
first_name = column_names[0]
|
|
211
|
+
first_column = frame[first_name]
|
|
212
|
+
value_type = find_column_type(first_column)
|
|
213
|
+
|
|
214
|
+
for column_name in column_names:
|
|
215
|
+
column = frame[column_name]
|
|
216
|
+
values = read_values(column, chart_name)
|
|
217
|
+
require_same_family(column, value_type, chart_name)
|
|
218
|
+
column_series = Series(column_name, values)
|
|
219
|
+
series.append(column_series)
|
|
220
|
+
|
|
221
|
+
return series, value_type
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def name_columns(column_names: list[str]) -> str:
|
|
225
|
+
"""
|
|
226
|
+
Return the names of the columns a chart draws, the default label of the axis of its values.
|
|
227
|
+
|
|
228
|
+
.. versionadded:: 0.1.0
|
|
229
|
+
|
|
230
|
+
Parameters
|
|
231
|
+
----------
|
|
232
|
+
column_names
|
|
233
|
+
The columns drawn, at least one.
|
|
234
|
+
|
|
235
|
+
Returns
|
|
236
|
+
-------
|
|
237
|
+
str
|
|
238
|
+
The names one after the other. Beyond 3 columns, the first 3 and the number of the others.
|
|
239
|
+
|
|
240
|
+
Examples
|
|
241
|
+
--------
|
|
242
|
+
>>> from numdaplot.plots.data.table_values import name_columns
|
|
243
|
+
>>> name_columns(["price"]), name_columns(["price", "cost"])
|
|
244
|
+
('price', 'price, cost')
|
|
245
|
+
>>> name_columns(["price", "cost", "tax", "tip"])
|
|
246
|
+
'price, cost, tax and 1 more'
|
|
247
|
+
"""
|
|
248
|
+
named_columns = column_names[:MAXIMUM_NAMED_COLUMNS]
|
|
249
|
+
joined_names = NAME_SEPARATOR.join(named_columns)
|
|
250
|
+
other_count = len(column_names) - MAXIMUM_NAMED_COLUMNS
|
|
251
|
+
if other_count <= 0:
|
|
252
|
+
return joined_names
|
|
253
|
+
|
|
254
|
+
shortened_names = SHORTENED_NAMES.format(joined_names=joined_names, other_count=other_count)
|
|
255
|
+
|
|
256
|
+
return shortened_names
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check that the values of a chart have different labels.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Iterable
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.duplicate_label_error import DuplicateLabelError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def require_unique_labels(labels: Iterable[str]) -> None:
|
|
13
|
+
"""
|
|
14
|
+
Check that every value of a chart has its own label, such as the slices of a PieChart.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
labels
|
|
21
|
+
The label of each value.
|
|
22
|
+
|
|
23
|
+
Raises
|
|
24
|
+
------
|
|
25
|
+
DuplicateLabelError
|
|
26
|
+
At the first label already seen.
|
|
27
|
+
|
|
28
|
+
Examples
|
|
29
|
+
--------
|
|
30
|
+
>>> import numpy
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> from numdaplot.plots.data.unique_labels import require_unique_labels
|
|
33
|
+
>>> try:
|
|
34
|
+
... require_unique_labels(numpy.array(["Paris", "Lyon", "Paris"], dtype=object))
|
|
35
|
+
... except ndp.DuplicateLabelError as error:
|
|
36
|
+
... print(error)
|
|
37
|
+
The label 'Paris' appears more than once.
|
|
38
|
+
"""
|
|
39
|
+
seen_labels = set[str]()
|
|
40
|
+
|
|
41
|
+
for label in labels:
|
|
42
|
+
if label in seen_labels:
|
|
43
|
+
raise DuplicateLabelError(label)
|
|
44
|
+
|
|
45
|
+
seen_labels.add(label)
|