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,45 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kind of object a display shows: a Plot or a Figure.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ShownObject(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Kind of object a display shows, named in the message of a ``DisplayWarning``.
|
|
13
|
+
|
|
14
|
+
The value is the name of the class.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Examples
|
|
19
|
+
--------
|
|
20
|
+
>>> from numdaplot.plots.output.shown_object import ShownObject
|
|
21
|
+
>>> ShownObject.FIGURE.value
|
|
22
|
+
'Figure'
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
PLOT = "Plot"
|
|
26
|
+
"""
|
|
27
|
+
A Plot, shown with ``Plot.show``.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> from numdaplot.plots.output.shown_object import ShownObject
|
|
32
|
+
>>> ShownObject.PLOT.value
|
|
33
|
+
'Plot'
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
FIGURE = "Figure"
|
|
37
|
+
"""
|
|
38
|
+
A Figure, shown with ``Figure.show``.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> from numdaplot.plots.output.shown_object import ShownObject
|
|
43
|
+
>>> ShownObject.FIGURE.value
|
|
44
|
+
'Figure'
|
|
45
|
+
"""
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Checks of a chart added to a Plot with ``add_line``, ``add_bar`` or ``add_scatter``.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import cast
|
|
8
|
+
|
|
9
|
+
from numdaplot.data_types.value_family import ValueFamily, find_family
|
|
10
|
+
from numdaplot.errors.incompatible_charts_error import IncompatibleChartsError
|
|
11
|
+
from numdaplot.errors.refused_setting_error import RefusedSettingError
|
|
12
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
13
|
+
from numdaplot.plots.charts.bar_chart import BarChart
|
|
14
|
+
from numdaplot.plots.charts.chart import Chart
|
|
15
|
+
from numdaplot.plots.charts.line_chart import LineChart
|
|
16
|
+
from numdaplot.plots.charts.orientation import Orientation
|
|
17
|
+
from numdaplot.plots.charts.scatter_chart import ScatterChart
|
|
18
|
+
from numdaplot.plots.charts.value_axis import ValueAxis
|
|
19
|
+
from numdaplot.plots.data.chart_values import ChartValues
|
|
20
|
+
from numdaplot.plots.data.position_kind import PositionKind
|
|
21
|
+
|
|
22
|
+
OVERLAID_CHARTS = (LineChart, BarChart, ScatterChart)
|
|
23
|
+
POSITION_NAMES = {
|
|
24
|
+
PositionKind.NUMBERS: "numbers",
|
|
25
|
+
PositionKind.MOMENTS: "dates",
|
|
26
|
+
PositionKind.TEXTS: "texts",
|
|
27
|
+
PositionKind.TIMES: "times of day",
|
|
28
|
+
}
|
|
29
|
+
VALUE_NAMES = {
|
|
30
|
+
ValueFamily.NUMBER: "numbers",
|
|
31
|
+
ValueFamily.TIME: "times of day",
|
|
32
|
+
}
|
|
33
|
+
AXIS_NAMES = {
|
|
34
|
+
ValueAxis.LEFT: "left",
|
|
35
|
+
ValueAxis.RIGHT: "right",
|
|
36
|
+
}
|
|
37
|
+
VALUE_DESCRIPTION = "{value_name} on the {axis_name} axis"
|
|
38
|
+
PLOT_NAME = "a Plot of {chart_name}"
|
|
39
|
+
HORIZONTAL_BARS_NAME = "a Plot of horizontal bars"
|
|
40
|
+
HORIZONTAL_SETTING = "Orientation.HORIZONTAL"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def require_overlay_base(first_layer: ChartLayer, method_name: str) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Check that a Plot accepts added charts: its first chart draws lines, vertical bars or points.
|
|
46
|
+
|
|
47
|
+
.. versionadded:: 0.1.0
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
first_layer
|
|
52
|
+
The first chart of the Plot and its values.
|
|
53
|
+
method_name
|
|
54
|
+
The method adding a chart, such as ``add_line``, shown in the error message.
|
|
55
|
+
|
|
56
|
+
Raises
|
|
57
|
+
------
|
|
58
|
+
RefusedSettingError
|
|
59
|
+
When the first chart is not a LineChart, a BarChart or a ScatterChart, or draws horizontal bars.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> import numdaplot as ndp
|
|
64
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
65
|
+
>>> from numdaplot.plots.data.sample_values import read_sample_values
|
|
66
|
+
>>> from numdaplot.plots.overlay_checks import require_overlay_base
|
|
67
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
68
|
+
>>> layer = ChartLayer(ndp.BoxChart(), read_sample_values(prices, None, None, "BoxChart"))
|
|
69
|
+
>>> try:
|
|
70
|
+
... require_overlay_base(layer, "add_line")
|
|
71
|
+
... except ndp.RefusedSettingError as error:
|
|
72
|
+
... print(error)
|
|
73
|
+
add_line does not accept a Plot of BoxChart.
|
|
74
|
+
"""
|
|
75
|
+
chart = first_layer.chart
|
|
76
|
+
if not isinstance(chart, OVERLAID_CHARTS):
|
|
77
|
+
chart_class = type(chart)
|
|
78
|
+
plot_name = PLOT_NAME.format(chart_name=chart_class.__name__)
|
|
79
|
+
raise RefusedSettingError(plot_name, method_name)
|
|
80
|
+
|
|
81
|
+
draws_horizontal_bars = is_horizontal_bar_chart(chart)
|
|
82
|
+
if draws_horizontal_bars:
|
|
83
|
+
raise RefusedSettingError(HORIZONTAL_BARS_NAME, method_name)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def require_vertical_bars(chart: BarChart, method_name: str) -> None:
|
|
87
|
+
"""
|
|
88
|
+
Check that bars added to a Plot are vertical, their ``x`` values sharing the horizontal axis.
|
|
89
|
+
|
|
90
|
+
.. versionadded:: 0.1.0
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
chart
|
|
95
|
+
The bars added.
|
|
96
|
+
method_name
|
|
97
|
+
The method adding them, shown in the error message.
|
|
98
|
+
|
|
99
|
+
Raises
|
|
100
|
+
------
|
|
101
|
+
RefusedSettingError
|
|
102
|
+
When the bars are horizontal.
|
|
103
|
+
|
|
104
|
+
Examples
|
|
105
|
+
--------
|
|
106
|
+
>>> import numdaplot as ndp
|
|
107
|
+
>>> from numdaplot.plots.overlay_checks import require_vertical_bars
|
|
108
|
+
>>> try:
|
|
109
|
+
... require_vertical_bars(ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL), "add_bar")
|
|
110
|
+
... except ndp.RefusedSettingError as error:
|
|
111
|
+
... print(error)
|
|
112
|
+
add_bar does not accept Orientation.HORIZONTAL.
|
|
113
|
+
"""
|
|
114
|
+
if chart.orientation == Orientation.HORIZONTAL:
|
|
115
|
+
raise RefusedSettingError(HORIZONTAL_SETTING, method_name)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def require_same_positions(first_layer: ChartLayer, added_layer: ChartLayer) -> None:
|
|
119
|
+
"""
|
|
120
|
+
Check that a chart added to a Plot has the same kind of ``x`` values as its first chart.
|
|
121
|
+
|
|
122
|
+
.. versionadded:: 0.1.0
|
|
123
|
+
|
|
124
|
+
Parameters
|
|
125
|
+
----------
|
|
126
|
+
first_layer
|
|
127
|
+
The first chart of the Plot and its values.
|
|
128
|
+
added_layer
|
|
129
|
+
The chart added and its values.
|
|
130
|
+
|
|
131
|
+
Raises
|
|
132
|
+
------
|
|
133
|
+
IncompatibleChartsError
|
|
134
|
+
When one has numbers, dates or texts and the other another kind.
|
|
135
|
+
|
|
136
|
+
Examples
|
|
137
|
+
--------
|
|
138
|
+
>>> import numdaplot as ndp
|
|
139
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
140
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
141
|
+
>>> from numdaplot.plots.overlay_checks import require_same_positions
|
|
142
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
143
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
|
|
144
|
+
>>> require_same_positions(layer, layer)
|
|
145
|
+
"""
|
|
146
|
+
first_values = cast(ChartValues, first_layer.values)
|
|
147
|
+
added_values = cast(ChartValues, added_layer.values)
|
|
148
|
+
plot_kind = first_values.positions.kind
|
|
149
|
+
added_kind = added_values.positions.kind
|
|
150
|
+
if added_kind == plot_kind:
|
|
151
|
+
return
|
|
152
|
+
|
|
153
|
+
added_class = type(added_layer.chart)
|
|
154
|
+
added_name = POSITION_NAMES[added_kind]
|
|
155
|
+
plot_name = POSITION_NAMES[plot_kind]
|
|
156
|
+
raise IncompatibleChartsError(added_class.__name__, added_name, plot_name)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def require_same_values(layers: list[ChartLayer], added_layer: ChartLayer, axis: ValueAxis) -> None:
|
|
160
|
+
"""
|
|
161
|
+
Check that a chart added to a Plot measures the same kind of values as the charts already on its axis.
|
|
162
|
+
|
|
163
|
+
.. versionadded:: 0.1.0
|
|
164
|
+
|
|
165
|
+
Parameters
|
|
166
|
+
----------
|
|
167
|
+
layers
|
|
168
|
+
The charts of the Plot and their values.
|
|
169
|
+
added_layer
|
|
170
|
+
The chart added and its values.
|
|
171
|
+
axis
|
|
172
|
+
The vertical axis the added chart is measured on.
|
|
173
|
+
|
|
174
|
+
Raises
|
|
175
|
+
------
|
|
176
|
+
IncompatibleChartsError
|
|
177
|
+
When one measures numbers and the other times of day on the same axis.
|
|
178
|
+
|
|
179
|
+
Examples
|
|
180
|
+
--------
|
|
181
|
+
>>> from datetime import time
|
|
182
|
+
>>> import numdaplot as ndp
|
|
183
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
184
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
185
|
+
>>> from numdaplot.plots.overlay_checks import require_same_values
|
|
186
|
+
>>> counts = ndp.Array.from_list([3.0, 5.0])
|
|
187
|
+
>>> hours = ndp.Array.from_list([time(8), time(9)])
|
|
188
|
+
>>> count_line = ChartLayer(ndp.LineChart(), read_array_values(counts, "LineChart"))
|
|
189
|
+
>>> hour_line = ChartLayer(ndp.LineChart(), read_array_values(hours, "LineChart"))
|
|
190
|
+
>>> try:
|
|
191
|
+
... require_same_values([count_line], hour_line, ndp.ValueAxis.LEFT)
|
|
192
|
+
... except ndp.IncompatibleChartsError as error:
|
|
193
|
+
... print(error)
|
|
194
|
+
A LineChart with times of day on the left axis cannot be added to a Plot with numbers on the left axis.
|
|
195
|
+
"""
|
|
196
|
+
added_values = cast(ChartValues, added_layer.values)
|
|
197
|
+
added_family = find_family(added_values.value_type)
|
|
198
|
+
axis_name = AXIS_NAMES[axis]
|
|
199
|
+
|
|
200
|
+
for layer in layers:
|
|
201
|
+
if layer.value_axis != axis:
|
|
202
|
+
continue
|
|
203
|
+
|
|
204
|
+
values = cast(ChartValues, layer.values)
|
|
205
|
+
plot_family = find_family(values.value_type)
|
|
206
|
+
if plot_family == added_family:
|
|
207
|
+
return
|
|
208
|
+
|
|
209
|
+
added_class = type(added_layer.chart)
|
|
210
|
+
added_value_name = VALUE_NAMES[added_family]
|
|
211
|
+
plot_value_name = VALUE_NAMES[plot_family]
|
|
212
|
+
added_name = VALUE_DESCRIPTION.format(value_name=added_value_name, axis_name=axis_name)
|
|
213
|
+
plot_name = VALUE_DESCRIPTION.format(value_name=plot_value_name, axis_name=axis_name)
|
|
214
|
+
raise IncompatibleChartsError(added_class.__name__, added_name, plot_name)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def is_horizontal_bar_chart(chart: Chart) -> bool:
|
|
218
|
+
"""
|
|
219
|
+
Return whether a chart draws horizontal bars.
|
|
220
|
+
|
|
221
|
+
.. versionadded:: 0.1.0
|
|
222
|
+
|
|
223
|
+
Parameters
|
|
224
|
+
----------
|
|
225
|
+
chart
|
|
226
|
+
Any chart.
|
|
227
|
+
|
|
228
|
+
Returns
|
|
229
|
+
-------
|
|
230
|
+
bool
|
|
231
|
+
True for a BarChart of horizontal bars.
|
|
232
|
+
|
|
233
|
+
Examples
|
|
234
|
+
--------
|
|
235
|
+
>>> import numdaplot as ndp
|
|
236
|
+
>>> from numdaplot.plots.overlay_checks import is_horizontal_bar_chart
|
|
237
|
+
>>> is_horizontal_bar_chart(ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL))
|
|
238
|
+
True
|
|
239
|
+
"""
|
|
240
|
+
if not isinstance(chart, BarChart):
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
is_horizontal = chart.orientation == Orientation.HORIZONTAL
|
|
244
|
+
|
|
245
|
+
return is_horizontal
|
numdaplot/plots/plot.py
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The ``ndp.Plot`` class: a drawn view of a Table or an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.plots.plot_distribution_creation import PlotDistributionCreation
|
|
8
|
+
from numdaplot.plots.plot_output import PlotOutput
|
|
9
|
+
from numdaplot.plots.plot_overlays import PlotOverlays
|
|
10
|
+
from numdaplot.plots.plot_overview_creation import PlotOverviewCreation
|
|
11
|
+
from numdaplot.plots.plot_series_creation import PlotSeriesCreation
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Plot(PlotSeriesCreation, PlotDistributionCreation, PlotOverviewCreation, PlotOverlays, PlotOutput):
|
|
15
|
+
"""
|
|
16
|
+
A drawn view of a Table or an Array, made by creation methods such as ``Plot.line``.
|
|
17
|
+
|
|
18
|
+
A Plot is immutable: it keeps the values it was made from, so changing the data afterwards never changes it.
|
|
19
|
+
It is only displayed by ``show``, never on its own in a notebook.
|
|
20
|
+
|
|
21
|
+
Calling ``ndp.Plot(...)`` is refused with ``RefusedOperationError``, which names the methods to use instead.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
|
|
25
|
+
Examples
|
|
26
|
+
--------
|
|
27
|
+
>>> import numdaplot as ndp
|
|
28
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
29
|
+
>>> plot = ndp.Plot.line(prices)
|
|
30
|
+
>>> plot.show()
|
|
31
|
+
"""
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Charts and style stored by a Plot, shared by every group of Plot methods.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Never, Self
|
|
8
|
+
|
|
9
|
+
from matplotlib.figure import FigureBase
|
|
10
|
+
|
|
11
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
12
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
13
|
+
from numdaplot.plots.data.shown_columns import require_distinct_shown_names
|
|
14
|
+
from numdaplot.plots.drawing.plot_drawing import FigureDrawing, draw_plot
|
|
15
|
+
from numdaplot.plots.drawing.size_inches import convert_size_to_inches
|
|
16
|
+
from numdaplot.plots.style.plot_style import PlotStyle
|
|
17
|
+
|
|
18
|
+
CONSTRUCTOR_OPERATION = "Creating a Plot with ndp.Plot(...)"
|
|
19
|
+
CONSTRUCTOR_ALTERNATIVE = "ndp.Plot.line, bar, scatter, histogram, box, pie, heatmap, missing_by_column or missing_map"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PlotData:
|
|
23
|
+
"""
|
|
24
|
+
Charts and style stored by a Plot, shared by every group of Plot methods.
|
|
25
|
+
|
|
26
|
+
Use ``ndp.Plot`` and its creation methods; this base class only holds the charts and the style.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
_layers: list[ChartLayer]
|
|
32
|
+
_style: PlotStyle
|
|
33
|
+
|
|
34
|
+
def __init__(self, *arguments: Never, **keyword_arguments: Never) -> None:
|
|
35
|
+
"""
|
|
36
|
+
Refuse the creation of a Plot by its constructor: the creation methods such as ``line`` create Plots.
|
|
37
|
+
|
|
38
|
+
.. versionadded:: 0.1.0
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
arguments
|
|
43
|
+
Any value, refused.
|
|
44
|
+
keyword_arguments
|
|
45
|
+
Any named value, refused.
|
|
46
|
+
|
|
47
|
+
Raises
|
|
48
|
+
------
|
|
49
|
+
RefusedOperationError
|
|
50
|
+
Always, naming the creation methods.
|
|
51
|
+
"""
|
|
52
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def _create(cls, layers: list[ChartLayer], style: PlotStyle) -> Self:
|
|
56
|
+
"""
|
|
57
|
+
Return a new Plot keeping the charts and the style.
|
|
58
|
+
|
|
59
|
+
.. versionadded:: 0.1.0
|
|
60
|
+
|
|
61
|
+
Parameters
|
|
62
|
+
----------
|
|
63
|
+
layers
|
|
64
|
+
The charts and their values, made by the creation methods, the first one giving the default labels.
|
|
65
|
+
The Plot keeps its own copy of the list.
|
|
66
|
+
style
|
|
67
|
+
The look of the Plot.
|
|
68
|
+
|
|
69
|
+
Returns
|
|
70
|
+
-------
|
|
71
|
+
Self
|
|
72
|
+
The new Plot.
|
|
73
|
+
|
|
74
|
+
Raises
|
|
75
|
+
------
|
|
76
|
+
DuplicateColumnError
|
|
77
|
+
When the style shows a column under the name of another column of the charts.
|
|
78
|
+
"""
|
|
79
|
+
require_distinct_shown_names(layers, style.renaming)
|
|
80
|
+
created_plot = cls.__new__(cls)
|
|
81
|
+
created_plot._layers = list(layers)
|
|
82
|
+
created_plot._style = style
|
|
83
|
+
|
|
84
|
+
return created_plot
|
|
85
|
+
|
|
86
|
+
@classmethod
|
|
87
|
+
def _create_from_layer(cls, layer: ChartLayer, style: PlotStyle | None) -> Self:
|
|
88
|
+
"""
|
|
89
|
+
Return a new Plot drawing one chart, with the default ``PlotStyle`` when none is given.
|
|
90
|
+
|
|
91
|
+
.. versionadded:: 0.1.0
|
|
92
|
+
|
|
93
|
+
Parameters
|
|
94
|
+
----------
|
|
95
|
+
layer
|
|
96
|
+
The chart and its values.
|
|
97
|
+
style
|
|
98
|
+
The look of the Plot, or None for the default ``PlotStyle``.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
Self
|
|
103
|
+
The Plot of the chart.
|
|
104
|
+
"""
|
|
105
|
+
chosen_style = style
|
|
106
|
+
if chosen_style is None:
|
|
107
|
+
chosen_style = PlotStyle()
|
|
108
|
+
|
|
109
|
+
created_plot = cls._create([layer], chosen_style)
|
|
110
|
+
|
|
111
|
+
return created_plot
|
|
112
|
+
|
|
113
|
+
def _draw_on(self, target: FigureBase) -> None:
|
|
114
|
+
"""
|
|
115
|
+
Draw the Plot on an empty matplotlib figure or subfigure, as ``show``, ``save`` and ``Figure`` do.
|
|
116
|
+
|
|
117
|
+
.. versionadded:: 0.1.0
|
|
118
|
+
|
|
119
|
+
Parameters
|
|
120
|
+
----------
|
|
121
|
+
target
|
|
122
|
+
The figure or subfigure drawn on.
|
|
123
|
+
"""
|
|
124
|
+
draw_plot(target, self._layers, self._style)
|
|
125
|
+
|
|
126
|
+
def _describe_drawing(self) -> FigureDrawing:
|
|
127
|
+
"""
|
|
128
|
+
Return what the Plot draws, and the size of its style.
|
|
129
|
+
|
|
130
|
+
.. versionadded:: 0.1.0
|
|
131
|
+
|
|
132
|
+
Returns
|
|
133
|
+
-------
|
|
134
|
+
FigureDrawing
|
|
135
|
+
The drawing of the Plot.
|
|
136
|
+
"""
|
|
137
|
+
size_inches = convert_size_to_inches(self._style.size)
|
|
138
|
+
drawing = FigureDrawing(self._draw_on, size_inches)
|
|
139
|
+
|
|
140
|
+
return drawing
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Creation of a Plot showing how values are spread or shared out.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Self
|
|
8
|
+
|
|
9
|
+
from numdaplot.arrays.array import Array
|
|
10
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
11
|
+
from numdaplot.plots.charts.box_chart import BoxChart
|
|
12
|
+
from numdaplot.plots.charts.histogram_chart import HistogramChart
|
|
13
|
+
from numdaplot.plots.charts.pie_chart import PieChart
|
|
14
|
+
from numdaplot.plots.data.pie_values import read_pie_values
|
|
15
|
+
from numdaplot.plots.data.sample_values import read_sample_values
|
|
16
|
+
from numdaplot.plots.drawing.histogram_drawing import require_bins_on_values
|
|
17
|
+
from numdaplot.plots.drawing.series_colors import require_color_count
|
|
18
|
+
from numdaplot.plots.plot_data import PlotData
|
|
19
|
+
from numdaplot.plots.style.axis_settings import require_no_axis_settings
|
|
20
|
+
from numdaplot.plots.style.plot_style import PlotStyle
|
|
21
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
22
|
+
from numdaplot.tables.table import Table
|
|
23
|
+
|
|
24
|
+
HISTOGRAM_CHART_NAME = "HistogramChart"
|
|
25
|
+
BOX_CHART_NAME = "BoxChart"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class PlotDistributionCreation(PlotData):
|
|
29
|
+
"""
|
|
30
|
+
Creation of a Plot showing how values are spread or shared out.
|
|
31
|
+
|
|
32
|
+
Use ``ndp.Plot.histogram``, ``ndp.Plot.box`` and ``ndp.Plot.pie``.
|
|
33
|
+
|
|
34
|
+
.. versionadded:: 0.1.0
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
@checked_arguments
|
|
39
|
+
def histogram(
|
|
40
|
+
cls, data: Table | Array, chart: HistogramChart | None = None, style: PlotStyle | None = None
|
|
41
|
+
) -> Self:
|
|
42
|
+
"""
|
|
43
|
+
Return a Plot drawing how many values of columns of numbers or times of day fall in each bin.
|
|
44
|
+
|
|
45
|
+
For a Table, ``HistogramChart.columns`` names the columns drawn. For an Array of one or two dimensions, each
|
|
46
|
+
column is drawn. Several columns share the same bins.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
data
|
|
53
|
+
The Table or the Array drawn.
|
|
54
|
+
chart
|
|
55
|
+
The columns drawn, the bins, the measure and the colors.
|
|
56
|
+
The default ``HistogramChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
57
|
+
style
|
|
58
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
Self
|
|
63
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
64
|
+
|
|
65
|
+
Raises
|
|
66
|
+
------
|
|
67
|
+
InvalidTypeError
|
|
68
|
+
When an argument is not of the type its annotation names.
|
|
69
|
+
InvalidChartDataError
|
|
70
|
+
When a Table has no ``columns``, or an Array has ``columns``.
|
|
71
|
+
ColumnNotFoundError
|
|
72
|
+
When a column does not exist.
|
|
73
|
+
IncompatibleTypesError
|
|
74
|
+
When a drawn column holds neither numbers nor times of day, the columns mix them, or the width of the bins
|
|
75
|
+
is a number for times of day or a duration for numbers.
|
|
76
|
+
DimensionError
|
|
77
|
+
When an Array has more than two dimensions.
|
|
78
|
+
InvalidColorCountError
|
|
79
|
+
When the colors of the chart are not one per column.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
>>> import numdaplot as ndp
|
|
84
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 15.0, 18.5, 11.0])
|
|
85
|
+
>>> flats = ndp.Table.from_arrays({"price": prices})
|
|
86
|
+
>>> chart = ndp.HistogramChart(columns=["price"], bins=ndp.BinWidth(2.0), measure=ndp.Measure.RATIO)
|
|
87
|
+
>>> style = ndp.PlotStyle(title="Prices", x_label="Price (euros)")
|
|
88
|
+
>>> plot = ndp.Plot.histogram(flats, chart, style)
|
|
89
|
+
>>> plot.show()
|
|
90
|
+
"""
|
|
91
|
+
if chart is None:
|
|
92
|
+
chart = HistogramChart()
|
|
93
|
+
|
|
94
|
+
values = read_sample_values(data, chart.columns, None, HISTOGRAM_CHART_NAME)
|
|
95
|
+
require_bins_on_values(chart.bins, values.value_type)
|
|
96
|
+
series_count = len(values.series)
|
|
97
|
+
require_color_count(chart.colors, series_count)
|
|
98
|
+
layer = ChartLayer(chart, values)
|
|
99
|
+
plot = cls._create_from_layer(layer, style)
|
|
100
|
+
|
|
101
|
+
return plot
|
|
102
|
+
|
|
103
|
+
@classmethod
|
|
104
|
+
@checked_arguments
|
|
105
|
+
def box(cls, data: Table | Array, chart: BoxChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
106
|
+
"""
|
|
107
|
+
Return a Plot summing up the spread of columns of numbers or times of day as boxes.
|
|
108
|
+
|
|
109
|
+
For a Table, ``BoxChart.columns`` names the columns drawn, and ``BoxChart.group_by`` may split their rows into
|
|
110
|
+
groups. For an Array of one or two dimensions, each column is a box.
|
|
111
|
+
|
|
112
|
+
.. versionadded:: 0.1.0
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
data
|
|
117
|
+
The Table or the Array drawn.
|
|
118
|
+
chart
|
|
119
|
+
The columns drawn, their groups, the outliers and the colors.
|
|
120
|
+
The default ``BoxChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
121
|
+
style
|
|
122
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
123
|
+
|
|
124
|
+
Returns
|
|
125
|
+
-------
|
|
126
|
+
Self
|
|
127
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
128
|
+
|
|
129
|
+
Raises
|
|
130
|
+
------
|
|
131
|
+
InvalidTypeError
|
|
132
|
+
When an argument is not of the type its annotation names.
|
|
133
|
+
InvalidChartDataError
|
|
134
|
+
When a Table has no ``columns``, or an Array has ``columns`` or ``group_by``.
|
|
135
|
+
ColumnNotFoundError
|
|
136
|
+
When a column does not exist.
|
|
137
|
+
IncompatibleTypesError
|
|
138
|
+
When a drawn column holds neither numbers nor times of day, the columns mix them, or ``group_by`` holds
|
|
139
|
+
neither texts, booleans nor times of day.
|
|
140
|
+
DimensionError
|
|
141
|
+
When an Array has more than two dimensions.
|
|
142
|
+
InvalidColorCountError
|
|
143
|
+
When the colors of the chart are not one per column.
|
|
144
|
+
|
|
145
|
+
Examples
|
|
146
|
+
--------
|
|
147
|
+
>>> import numdaplot as ndp
|
|
148
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Paris", "Lyon", "Pau", "Paris", "Lyon", "Pau"])
|
|
149
|
+
>>> prices = ndp.Array.from_list([14.0, 9.5, 7.0, 16.5, 10.0, 8.5, 15.0, 11.5, 6.0])
|
|
150
|
+
>>> flats = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
151
|
+
>>> chart = ndp.BoxChart(columns=["price"], group_by="city")
|
|
152
|
+
>>> style = ndp.PlotStyle(y_label="Price per night (euros)")
|
|
153
|
+
>>> plot = ndp.Plot.box(flats, chart, style)
|
|
154
|
+
>>> plot.show()
|
|
155
|
+
"""
|
|
156
|
+
if chart is None:
|
|
157
|
+
chart = BoxChart()
|
|
158
|
+
|
|
159
|
+
values = read_sample_values(data, chart.columns, chart.group_by, BOX_CHART_NAME)
|
|
160
|
+
series_count = len(values.series)
|
|
161
|
+
require_color_count(chart.colors, series_count)
|
|
162
|
+
layer = ChartLayer(chart, values)
|
|
163
|
+
plot = cls._create_from_layer(layer, style)
|
|
164
|
+
|
|
165
|
+
return plot
|
|
166
|
+
|
|
167
|
+
@classmethod
|
|
168
|
+
@checked_arguments
|
|
169
|
+
def pie(cls, table: Table, chart: PieChart, style: PlotStyle | None = None) -> Self:
|
|
170
|
+
"""
|
|
171
|
+
Return a Plot sharing out the values of a column of a Table as slices of a disc.
|
|
172
|
+
|
|
173
|
+
``PieChart.labels`` names the column of texts labeling the slices and ``PieChart.values`` the column of numbers
|
|
174
|
+
sizing them. A Plot of a pie has no axes, so its style takes no axis label.
|
|
175
|
+
|
|
176
|
+
.. versionadded:: 0.1.0
|
|
177
|
+
|
|
178
|
+
Parameters
|
|
179
|
+
----------
|
|
180
|
+
table
|
|
181
|
+
The Table drawn.
|
|
182
|
+
chart
|
|
183
|
+
The labels, the values, the percentages and the colors.
|
|
184
|
+
style
|
|
185
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
186
|
+
|
|
187
|
+
Returns
|
|
188
|
+
-------
|
|
189
|
+
Self
|
|
190
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
191
|
+
|
|
192
|
+
Raises
|
|
193
|
+
------
|
|
194
|
+
InvalidTypeError
|
|
195
|
+
When an argument is not of the type its annotation names.
|
|
196
|
+
ColumnNotFoundError
|
|
197
|
+
When a column does not exist.
|
|
198
|
+
IncompatibleTypesError
|
|
199
|
+
When ``labels`` does not hold texts, or ``values`` does not hold numbers.
|
|
200
|
+
MissingValueError
|
|
201
|
+
When a label or a value is missing.
|
|
202
|
+
OutOfDomainError
|
|
203
|
+
When a value is negative.
|
|
204
|
+
EmptyTotalError
|
|
205
|
+
When the values add up to 0.
|
|
206
|
+
DuplicateLabelError
|
|
207
|
+
When two slices have the same label.
|
|
208
|
+
InvalidColorCountError
|
|
209
|
+
When the colors of the chart are not one per slice.
|
|
210
|
+
RefusedSettingError
|
|
211
|
+
When the style has an axis setting: ``x_label``, ``y_label``, ``right_label``, ``x_tick_rotation`` or
|
|
212
|
+
``y_tick_rotation``.
|
|
213
|
+
|
|
214
|
+
Warns
|
|
215
|
+
-----
|
|
216
|
+
ReadabilityWarning
|
|
217
|
+
When there are more than 5 slices.
|
|
218
|
+
|
|
219
|
+
Examples
|
|
220
|
+
--------
|
|
221
|
+
>>> import numdaplot as ndp
|
|
222
|
+
>>> devices = ndp.Array.from_list(["Phone", "Computer", "Tablet"])
|
|
223
|
+
>>> visits = ndp.Array.from_list([5400.0, 3100.0, 900.0])
|
|
224
|
+
>>> traffic = ndp.Table.from_arrays({"device": devices, "visits": visits})
|
|
225
|
+
>>> chart = ndp.PieChart(labels="device", values="visits")
|
|
226
|
+
>>> style = ndp.PlotStyle(title="Visits per device")
|
|
227
|
+
>>> plot = ndp.Plot.pie(traffic, chart, style)
|
|
228
|
+
>>> plot.show()
|
|
229
|
+
"""
|
|
230
|
+
values = read_pie_values(table, chart)
|
|
231
|
+
slice_count = len(values.rows)
|
|
232
|
+
require_color_count(chart.colors, slice_count)
|
|
233
|
+
require_no_axis_settings(style)
|
|
234
|
+
layer = ChartLayer(chart, values)
|
|
235
|
+
plot = cls._create_from_layer(layer, style)
|
|
236
|
+
|
|
237
|
+
return plot
|