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,124 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Output of a Plot: display, image files and matplotlib figures.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from matplotlib.figure import Figure
|
|
8
|
+
|
|
9
|
+
from numdaplot.plots.drawing.plot_drawing import build_figure
|
|
10
|
+
from numdaplot.plots.output.image_saving import write_image
|
|
11
|
+
from numdaplot.plots.output.plot_display import show_drawing
|
|
12
|
+
from numdaplot.plots.output.shown_object import ShownObject
|
|
13
|
+
from numdaplot.plots.plot_data import PlotData
|
|
14
|
+
from numdaplot.plots.style.image_options import ImageOptions
|
|
15
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
16
|
+
from numdaplot.tables.conflict import Conflict
|
|
17
|
+
from numdaplot.tables.files.file_paths import FilePath
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PlotOutput(PlotData):
|
|
21
|
+
"""
|
|
22
|
+
Output of a Plot: display, image files and matplotlib figures.
|
|
23
|
+
|
|
24
|
+
Use ``ndp.Plot``; this group only adds the output methods.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def to_matplotlib(self) -> Figure:
|
|
30
|
+
"""
|
|
31
|
+
Return a new matplotlib figure of the Plot, to change it with matplotlib.
|
|
32
|
+
|
|
33
|
+
Changing the figure never changes the Plot. The figure is not managed by ``matplotlib.pyplot``, so
|
|
34
|
+
a notebook does not display it on its own.
|
|
35
|
+
|
|
36
|
+
.. versionadded:: 0.1.0
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
matplotlib.figure.Figure
|
|
41
|
+
The figure, drawn on a single matplotlib ``Axes``.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
|
|
47
|
+
>>> style = ndp.PlotStyle(title="Prices")
|
|
48
|
+
>>> figure = ndp.Plot.line(prices, style=style).to_matplotlib()
|
|
49
|
+
>>> figure.axes[0].get_title()
|
|
50
|
+
'Prices'
|
|
51
|
+
>>> figure.axes[0].lines[0].get_ydata()
|
|
52
|
+
array([12. , 15.5, 14. ])
|
|
53
|
+
"""
|
|
54
|
+
drawing = self._describe_drawing()
|
|
55
|
+
figure = build_figure(drawing)
|
|
56
|
+
|
|
57
|
+
return figure
|
|
58
|
+
|
|
59
|
+
@checked_arguments
|
|
60
|
+
def save(self, path: FilePath, options: ImageOptions | None = None, on_conflict: Conflict = Conflict.ERROR) -> None:
|
|
61
|
+
"""
|
|
62
|
+
Save the Plot as an image, in the format named by the extension of the path.
|
|
63
|
+
|
|
64
|
+
``.png`` gives an image made of pixels, ``.svg`` and ``.pdf`` images made of lines and texts that stay
|
|
65
|
+
sharp at any zoom. The image has the size of the style, 640 by 480 pixels for a PNG image by default.
|
|
66
|
+
|
|
67
|
+
.. versionadded:: 0.1.0
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
path
|
|
72
|
+
The path of the image, a ``FilePath`` such as ``"chart.png"`` or ``Path("images/chart.svg")``, ending with
|
|
73
|
+
``.png``, ``.svg`` or ``.pdf``.
|
|
74
|
+
options
|
|
75
|
+
The resolution of a PNG image, 100 dots per inch when omitted. SVG and PDF images take none.
|
|
76
|
+
on_conflict
|
|
77
|
+
``ERROR`` by default, refusing to overwrite an existing file, or ``REPLACE`` to overwrite it.
|
|
78
|
+
|
|
79
|
+
Raises
|
|
80
|
+
------
|
|
81
|
+
InvalidTypeError
|
|
82
|
+
When an argument is not of the type its annotation names.
|
|
83
|
+
UnsupportedImageFormatError
|
|
84
|
+
When the path does not end with ``.png``, ``.svg`` or ``.pdf``.
|
|
85
|
+
RefusedSettingError
|
|
86
|
+
When options are given for an SVG or PDF image.
|
|
87
|
+
FileExistsError
|
|
88
|
+
When a file exists at the path and ``on_conflict`` is ``ERROR``.
|
|
89
|
+
FileAccessError
|
|
90
|
+
When the file system refuses the file: missing folder, missing permission and so on.
|
|
91
|
+
|
|
92
|
+
Examples
|
|
93
|
+
--------
|
|
94
|
+
>>> import tempfile
|
|
95
|
+
>>> from pathlib import Path
|
|
96
|
+
>>> import numdaplot as ndp
|
|
97
|
+
>>> path = Path(tempfile.mkdtemp()) / "prices.svg"
|
|
98
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
|
|
99
|
+
>>> plot = ndp.Plot.line(prices)
|
|
100
|
+
>>> plot.save(path)
|
|
101
|
+
>>> path.read_text().startswith("<?xml")
|
|
102
|
+
True
|
|
103
|
+
"""
|
|
104
|
+
drawing = self._describe_drawing()
|
|
105
|
+
write_image(drawing, path, options, on_conflict)
|
|
106
|
+
|
|
107
|
+
def show(self) -> None:
|
|
108
|
+
"""
|
|
109
|
+
Show the Plot: as an image in a Jupyter notebook, in a matplotlib window anywhere else.
|
|
110
|
+
|
|
111
|
+
In a script, the window stays open until it is closed. When no window can be opened, because Python has no
|
|
112
|
+
``tkinter`` or runs on a server, nothing is shown and a ``DisplayWarning`` suggests saving the Plot instead.
|
|
113
|
+
|
|
114
|
+
.. versionadded:: 0.1.0
|
|
115
|
+
|
|
116
|
+
Examples
|
|
117
|
+
--------
|
|
118
|
+
>>> import numdaplot as ndp
|
|
119
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
120
|
+
>>> plot = ndp.Plot.bar(prices)
|
|
121
|
+
>>> plot.show()
|
|
122
|
+
"""
|
|
123
|
+
drawing = self._describe_drawing()
|
|
124
|
+
show_drawing(drawing, ShownObject.PLOT)
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Charts drawn over the charts of a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import replace
|
|
8
|
+
from typing import Self
|
|
9
|
+
|
|
10
|
+
from numdaplot.arrays.array import Array
|
|
11
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
12
|
+
from numdaplot.plots.charts.bar_chart import BarChart
|
|
13
|
+
from numdaplot.plots.charts.line_chart import LineChart
|
|
14
|
+
from numdaplot.plots.charts.scatter_chart import ScatterChart
|
|
15
|
+
from numdaplot.plots.charts.value_axis import ValueAxis
|
|
16
|
+
from numdaplot.plots.drawing.layer_alignment import align_layers
|
|
17
|
+
from numdaplot.plots.layer_reading import read_bar_layer, read_line_layer, read_scatter_layer
|
|
18
|
+
from numdaplot.plots.overlay_checks import (
|
|
19
|
+
require_overlay_base,
|
|
20
|
+
require_same_positions,
|
|
21
|
+
require_same_values,
|
|
22
|
+
require_vertical_bars,
|
|
23
|
+
)
|
|
24
|
+
from numdaplot.plots.plot_data import PlotData
|
|
25
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
26
|
+
from numdaplot.tables.table import Table
|
|
27
|
+
|
|
28
|
+
ADD_LINE_NAME = "add_line"
|
|
29
|
+
ADD_BAR_NAME = "add_bar"
|
|
30
|
+
ADD_SCATTER_NAME = "add_scatter"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class PlotOverlays(PlotData):
|
|
34
|
+
"""
|
|
35
|
+
Charts drawn over the charts of a Plot.
|
|
36
|
+
|
|
37
|
+
Use ``ndp.Plot``; this group only adds the ``add_*`` methods.
|
|
38
|
+
|
|
39
|
+
.. versionadded:: 0.1.0
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
@checked_arguments
|
|
43
|
+
def add_line(self, data: Table | Array, chart: LineChart | None = None, axis: ValueAxis = ValueAxis.LEFT) -> Self:
|
|
44
|
+
"""
|
|
45
|
+
Return a new Plot with lines added over the charts of this one.
|
|
46
|
+
|
|
47
|
+
The lines take the colors of the default cycle after the ones already used. Over bars or texts, their
|
|
48
|
+
``x`` values are placed on the labels of the Plot, new labels following the others.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Parameters
|
|
53
|
+
----------
|
|
54
|
+
data
|
|
55
|
+
The Table or the Array of the lines, which may differ from the one of the Plot.
|
|
56
|
+
chart
|
|
57
|
+
The columns drawn and the look of the lines.
|
|
58
|
+
The default ``LineChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
59
|
+
axis
|
|
60
|
+
``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
|
|
61
|
+
their own on the right.
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
Self
|
|
66
|
+
A new Plot; this one is left unchanged.
|
|
67
|
+
|
|
68
|
+
Raises
|
|
69
|
+
------
|
|
70
|
+
InvalidTypeError
|
|
71
|
+
When an argument is not of the type its annotation names.
|
|
72
|
+
RefusedSettingError
|
|
73
|
+
When the Plot does not draw lines, vertical bars or points.
|
|
74
|
+
IncompatibleChartsError
|
|
75
|
+
When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
|
|
76
|
+
or when one measures numbers and the other times of day on the same axis.
|
|
77
|
+
DuplicateLabelError
|
|
78
|
+
When a label appears twice in the ``x`` values of one chart placed on labels.
|
|
79
|
+
InvalidChartDataError
|
|
80
|
+
When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
|
|
81
|
+
InvalidColorCountError
|
|
82
|
+
When the colors of the chart are not one per line.
|
|
83
|
+
|
|
84
|
+
Examples
|
|
85
|
+
--------
|
|
86
|
+
>>> import numdaplot as ndp
|
|
87
|
+
>>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
|
|
88
|
+
>>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
|
|
89
|
+
>>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 140.0])
|
|
90
|
+
>>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
|
|
91
|
+
>>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]))
|
|
92
|
+
>>> line = ndp.LineChart(x="month", y=["target"], marker=ndp.MarkerShape.CIRCLE)
|
|
93
|
+
>>> both = plot.add_line(shop, line)
|
|
94
|
+
>>> both.show()
|
|
95
|
+
"""
|
|
96
|
+
if chart is None:
|
|
97
|
+
chart = LineChart()
|
|
98
|
+
|
|
99
|
+
layer = read_line_layer(data, chart)
|
|
100
|
+
added_plot = self._add_layer(layer, axis, ADD_LINE_NAME)
|
|
101
|
+
|
|
102
|
+
return added_plot
|
|
103
|
+
|
|
104
|
+
@checked_arguments
|
|
105
|
+
def add_bar(self, data: Table | Array, chart: BarChart | None = None, axis: ValueAxis = ValueAxis.LEFT) -> Self:
|
|
106
|
+
"""
|
|
107
|
+
Return a new Plot with vertical bars added over the charts of this one.
|
|
108
|
+
|
|
109
|
+
The bars are drawn over the ones already there, at the same positions: to draw bars side by side, give
|
|
110
|
+
several columns to a single ``BarChart``. Their ``x`` values are placed on the labels of the Plot, new
|
|
111
|
+
labels following the others.
|
|
112
|
+
|
|
113
|
+
.. versionadded:: 0.1.0
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
data
|
|
118
|
+
The Table or the Array of the bars, which may differ from the one of the Plot.
|
|
119
|
+
chart
|
|
120
|
+
The columns drawn and the look of the bars, which must be vertical.
|
|
121
|
+
The default ``BarChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
122
|
+
axis
|
|
123
|
+
``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
|
|
124
|
+
their own on the right.
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
Self
|
|
129
|
+
A new Plot; this one is left unchanged.
|
|
130
|
+
|
|
131
|
+
Raises
|
|
132
|
+
------
|
|
133
|
+
InvalidTypeError
|
|
134
|
+
When an argument is not of the type its annotation names.
|
|
135
|
+
RefusedSettingError
|
|
136
|
+
When the bars are horizontal, or the Plot does not draw lines, vertical bars or points.
|
|
137
|
+
IncompatibleChartsError
|
|
138
|
+
When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
|
|
139
|
+
or when one measures numbers and the other times of day on the same axis.
|
|
140
|
+
DuplicateLabelError
|
|
141
|
+
When a label appears twice in the ``x`` values of one chart.
|
|
142
|
+
InvalidChartDataError
|
|
143
|
+
When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
|
|
144
|
+
InvalidColorCountError
|
|
145
|
+
When the colors of the chart are not one per series.
|
|
146
|
+
|
|
147
|
+
Examples
|
|
148
|
+
--------
|
|
149
|
+
>>> import numdaplot as ndp
|
|
150
|
+
>>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
|
|
151
|
+
>>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
|
|
152
|
+
>>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 160.0])
|
|
153
|
+
>>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
|
|
154
|
+
>>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["target"], colors=[ndp.CustomColor("#d9d9d9")]))
|
|
155
|
+
>>> bars = ndp.BarChart(x="month", y=["sales"], colors=[ndp.Color.BLUE])
|
|
156
|
+
>>> both = plot.add_bar(shop, bars)
|
|
157
|
+
>>> both.show()
|
|
158
|
+
"""
|
|
159
|
+
if chart is None:
|
|
160
|
+
chart = BarChart()
|
|
161
|
+
|
|
162
|
+
require_vertical_bars(chart, ADD_BAR_NAME)
|
|
163
|
+
layer = read_bar_layer(data, chart)
|
|
164
|
+
added_plot = self._add_layer(layer, axis, ADD_BAR_NAME)
|
|
165
|
+
|
|
166
|
+
return added_plot
|
|
167
|
+
|
|
168
|
+
@checked_arguments
|
|
169
|
+
def add_scatter(
|
|
170
|
+
self, data: Table | Array, chart: ScatterChart | None = None, axis: ValueAxis = ValueAxis.LEFT
|
|
171
|
+
) -> Self:
|
|
172
|
+
"""
|
|
173
|
+
Return a new Plot with points added over the charts of this one.
|
|
174
|
+
|
|
175
|
+
The points take the color of the default cycle after the ones already used, unless ``color`` or
|
|
176
|
+
``color_by`` is given. Over bars or texts, their ``x`` values are placed on the labels of the Plot.
|
|
177
|
+
|
|
178
|
+
.. versionadded:: 0.1.0
|
|
179
|
+
|
|
180
|
+
Parameters
|
|
181
|
+
----------
|
|
182
|
+
data
|
|
183
|
+
The Table or the Array of the points, which may differ from the one of the Plot.
|
|
184
|
+
chart
|
|
185
|
+
The columns drawn and the look of the points.
|
|
186
|
+
The default ``ScatterChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
187
|
+
axis
|
|
188
|
+
``ValueAxis.LEFT`` by default to share the scale of the Plot, ``ValueAxis.RIGHT`` for a scale of
|
|
189
|
+
their own on the right.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
Self
|
|
194
|
+
A new Plot; this one is left unchanged.
|
|
195
|
+
|
|
196
|
+
Raises
|
|
197
|
+
------
|
|
198
|
+
InvalidTypeError
|
|
199
|
+
When an argument is not of the type its annotation names.
|
|
200
|
+
RefusedSettingError
|
|
201
|
+
When the Plot does not draw lines, vertical bars or points.
|
|
202
|
+
IncompatibleChartsError
|
|
203
|
+
When the ``x`` values are not of the kind of the ones of the Plot: numbers, dates, texts or times of day;
|
|
204
|
+
or when one measures numbers and the other times of day on the same axis.
|
|
205
|
+
DuplicateLabelError
|
|
206
|
+
When a label appears twice in the ``x`` values of one chart placed on labels.
|
|
207
|
+
InvalidChartDataError
|
|
208
|
+
When a Table has no ``y`` column, or an Array has a column setting.
|
|
209
|
+
InvalidColorCountError
|
|
210
|
+
When ``color`` is given for an Array of several columns.
|
|
211
|
+
|
|
212
|
+
Examples
|
|
213
|
+
--------
|
|
214
|
+
>>> import numdaplot as ndp
|
|
215
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4, 5, 6])
|
|
216
|
+
>>> trend = ndp.Array.from_list([10.0, 12.0, 14.0, 16.0, 18.0, 20.0])
|
|
217
|
+
>>> measures = ndp.Array.from_list([10.5, 11.2, 14.8, 15.1, 18.9, 19.4])
|
|
218
|
+
>>> readings = ndp.Table.from_arrays({"day": days, "trend": trend, "measure": measures})
|
|
219
|
+
>>> plot = ndp.Plot.line(readings, ndp.LineChart(x="day", y=["trend"]))
|
|
220
|
+
>>> points = ndp.ScatterChart(x="day", y="measure")
|
|
221
|
+
>>> both = plot.add_scatter(readings, points)
|
|
222
|
+
>>> both.show()
|
|
223
|
+
"""
|
|
224
|
+
if chart is None:
|
|
225
|
+
chart = ScatterChart()
|
|
226
|
+
|
|
227
|
+
layer = read_scatter_layer(data, chart)
|
|
228
|
+
added_plot = self._add_layer(layer, axis, ADD_SCATTER_NAME)
|
|
229
|
+
|
|
230
|
+
return added_plot
|
|
231
|
+
|
|
232
|
+
def _add_layer(self, layer: ChartLayer, axis: ValueAxis, method_name: str) -> Self:
|
|
233
|
+
"""
|
|
234
|
+
Return a new Plot with a chart added after the ones of this one, once checked against them.
|
|
235
|
+
|
|
236
|
+
.. versionadded:: 0.1.0
|
|
237
|
+
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
layer
|
|
241
|
+
The chart added and its values.
|
|
242
|
+
axis
|
|
243
|
+
The vertical axis the chart is measured on.
|
|
244
|
+
method_name
|
|
245
|
+
The method adding the chart, shown in error messages.
|
|
246
|
+
|
|
247
|
+
Returns
|
|
248
|
+
-------
|
|
249
|
+
Self
|
|
250
|
+
The new Plot, with the style of this one.
|
|
251
|
+
|
|
252
|
+
Raises
|
|
253
|
+
------
|
|
254
|
+
RefusedSettingError
|
|
255
|
+
When the Plot does not draw lines, vertical bars or points.
|
|
256
|
+
IncompatibleChartsError
|
|
257
|
+
When the ``x`` values are not of the kind of the ones of the Plot, or when one measures numbers and the
|
|
258
|
+
other times of day on the same axis.
|
|
259
|
+
DuplicateLabelError
|
|
260
|
+
When a label appears twice in the ``x`` values of one chart placed on labels.
|
|
261
|
+
"""
|
|
262
|
+
first_layer = self._layers[0]
|
|
263
|
+
require_overlay_base(first_layer, method_name)
|
|
264
|
+
require_same_positions(first_layer, layer)
|
|
265
|
+
require_same_values(self._layers, layer, axis)
|
|
266
|
+
axis_layer = replace(layer, value_axis=axis)
|
|
267
|
+
layers = [*self._layers, axis_layer]
|
|
268
|
+
# Aligning the charts on their labels checks them, so a wrong chart is refused when it is added.
|
|
269
|
+
align_layers(layers)
|
|
270
|
+
plot_class = type(self)
|
|
271
|
+
added_plot = plot_class._create(layers, self._style)
|
|
272
|
+
|
|
273
|
+
return added_plot
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Creation of a Plot giving an overview of the values of a Table or an Array.
|
|
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.heatmap_chart import HeatmapChart
|
|
12
|
+
from numdaplot.plots.charts.missing_chart import MissingChart
|
|
13
|
+
from numdaplot.plots.charts.missing_map_chart import MissingMapChart
|
|
14
|
+
from numdaplot.plots.data.heatmap_values import read_heatmap_values
|
|
15
|
+
from numdaplot.plots.data.missing_cells import read_missing_cells, read_missing_counts
|
|
16
|
+
from numdaplot.plots.plot_data import PlotData
|
|
17
|
+
from numdaplot.plots.style.plot_style import PlotStyle
|
|
18
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
19
|
+
from numdaplot.tables.table import Table
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PlotOverviewCreation(PlotData):
|
|
23
|
+
"""
|
|
24
|
+
Creation of a Plot giving an overview of the values of a Table or an Array.
|
|
25
|
+
|
|
26
|
+
Use ``ndp.Plot.heatmap``, ``ndp.Plot.missing_by_column`` and ``ndp.Plot.missing_map``.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@classmethod
|
|
32
|
+
@checked_arguments
|
|
33
|
+
def heatmap(cls, data: Table | Array, chart: HeatmapChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
34
|
+
"""
|
|
35
|
+
Return a Plot coloring each value of columns of numbers along a color scale.
|
|
36
|
+
|
|
37
|
+
For a Table, ``HeatmapChart.columns`` names the columns drawn and ``HeatmapChart.labels`` the column labeling
|
|
38
|
+
the rows.
|
|
39
|
+
For an Array of one or two dimensions, each column is drawn and each row is labeled with its number.
|
|
40
|
+
When there are more rows or columns than the image can show, each band shows the mean of its cells, without
|
|
41
|
+
their values written, with a ``ReadabilityWarning``.
|
|
42
|
+
|
|
43
|
+
.. versionadded:: 0.1.0
|
|
44
|
+
|
|
45
|
+
Parameters
|
|
46
|
+
----------
|
|
47
|
+
data
|
|
48
|
+
The Table or the Array drawn.
|
|
49
|
+
chart
|
|
50
|
+
The columns drawn, the row labels, the color scale and the cell values.
|
|
51
|
+
The default ``HeatmapChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
52
|
+
style
|
|
53
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
54
|
+
|
|
55
|
+
Returns
|
|
56
|
+
-------
|
|
57
|
+
Self
|
|
58
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
59
|
+
|
|
60
|
+
Raises
|
|
61
|
+
------
|
|
62
|
+
InvalidTypeError
|
|
63
|
+
When an argument is not of the type its annotation names.
|
|
64
|
+
InvalidChartDataError
|
|
65
|
+
When a Table has no ``columns``, or an Array has ``columns`` or ``labels``.
|
|
66
|
+
ColumnNotFoundError
|
|
67
|
+
When a column does not exist.
|
|
68
|
+
IncompatibleTypesError
|
|
69
|
+
When ``labels`` holds booleans or durations, or a drawn column does not hold numbers.
|
|
70
|
+
DimensionError
|
|
71
|
+
When an Array has more than two dimensions.
|
|
72
|
+
|
|
73
|
+
Warns
|
|
74
|
+
-----
|
|
75
|
+
ReadabilityWarning
|
|
76
|
+
When the cells are merged into bands.
|
|
77
|
+
|
|
78
|
+
Examples
|
|
79
|
+
--------
|
|
80
|
+
>>> import numdaplot as ndp
|
|
81
|
+
>>> days = ndp.Array.from_list(["Mon", "Tue", "Wed", "Thu", "Fri"])
|
|
82
|
+
>>> morning = ndp.Array.from_list([12.0, 15.0, 9.0, 14.0, 20.0])
|
|
83
|
+
>>> noon = ndp.Array.from_list([30.0, 28.0, 25.0, 33.0, 41.0])
|
|
84
|
+
>>> evening = ndp.Array.from_list([18.0, 22.0, None, 19.0, 35.0])
|
|
85
|
+
>>> orders = ndp.Table.from_arrays({"day": days, "morning": morning, "noon": noon, "evening": evening})
|
|
86
|
+
>>> chart = ndp.HeatmapChart(columns=["morning", "noon", "evening"], labels="day", values=ndp.CellValues.SHOWN)
|
|
87
|
+
>>> style = ndp.PlotStyle(title="Orders")
|
|
88
|
+
>>> plot = ndp.Plot.heatmap(orders, chart, style)
|
|
89
|
+
>>> plot.show()
|
|
90
|
+
"""
|
|
91
|
+
if chart is None:
|
|
92
|
+
chart = HeatmapChart()
|
|
93
|
+
|
|
94
|
+
values = read_heatmap_values(data, chart)
|
|
95
|
+
layer = ChartLayer(chart, values)
|
|
96
|
+
plot = cls._create_from_layer(layer, style)
|
|
97
|
+
|
|
98
|
+
return plot
|
|
99
|
+
|
|
100
|
+
@classmethod
|
|
101
|
+
@checked_arguments
|
|
102
|
+
def missing_by_column(cls, table: Table, chart: MissingChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
103
|
+
"""
|
|
104
|
+
Return a Plot drawing one bar per column of a Table, as high as its missing values.
|
|
105
|
+
|
|
106
|
+
Above each bar are its number of missing values and their share of the rows, written on one line going upwards
|
|
107
|
+
when the bars are too narrow, and left out when they are too narrow for that.
|
|
108
|
+
|
|
109
|
+
.. versionadded:: 0.1.0
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
table
|
|
114
|
+
The Table whose missing values are counted.
|
|
115
|
+
chart
|
|
116
|
+
The measure, the number of missing values of each column when omitted.
|
|
117
|
+
style
|
|
118
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
119
|
+
|
|
120
|
+
Returns
|
|
121
|
+
-------
|
|
122
|
+
Self
|
|
123
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
124
|
+
|
|
125
|
+
Raises
|
|
126
|
+
------
|
|
127
|
+
InvalidTypeError
|
|
128
|
+
When an argument is not of the type its annotation names.
|
|
129
|
+
|
|
130
|
+
Examples
|
|
131
|
+
--------
|
|
132
|
+
>>> import numdaplot as ndp
|
|
133
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Nice", "Pau", "Lyon"])
|
|
134
|
+
>>> prices = ndp.Array.from_list([12.0, None, None, 15.5, None])
|
|
135
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, None, 60.0, 52.0])
|
|
136
|
+
>>> flats = ndp.Table.from_arrays({"city": cities, "price": prices, "surface": surfaces})
|
|
137
|
+
>>> style = ndp.PlotStyle(title="Missing values")
|
|
138
|
+
>>> plot = ndp.Plot.missing_by_column(flats, style=style)
|
|
139
|
+
>>> plot.show()
|
|
140
|
+
"""
|
|
141
|
+
if chart is None:
|
|
142
|
+
chart = MissingChart()
|
|
143
|
+
|
|
144
|
+
values = read_missing_counts(table, chart.measure)
|
|
145
|
+
layer = ChartLayer(chart, values)
|
|
146
|
+
plot = cls._create_from_layer(layer, style)
|
|
147
|
+
|
|
148
|
+
return plot
|
|
149
|
+
|
|
150
|
+
@classmethod
|
|
151
|
+
@checked_arguments
|
|
152
|
+
def missing_map(cls, table: Table, style: PlotStyle | None = None) -> Self:
|
|
153
|
+
"""
|
|
154
|
+
Return a Plot drawing each value of a Table as a cell, light gray when present and dark when missing.
|
|
155
|
+
|
|
156
|
+
The columns are side by side and the rows go down from the first one, which shows whether the missing
|
|
157
|
+
values gather in some rows or columns. When there are more rows or columns than the image can show, each mark
|
|
158
|
+
stands for at least one missing value among the cells it covers, so no missing value is lost. The legend gives
|
|
159
|
+
the total of missing values.
|
|
160
|
+
|
|
161
|
+
.. versionadded:: 0.1.0
|
|
162
|
+
|
|
163
|
+
Parameters
|
|
164
|
+
----------
|
|
165
|
+
table
|
|
166
|
+
The Table whose missing values are drawn.
|
|
167
|
+
style
|
|
168
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
169
|
+
|
|
170
|
+
Returns
|
|
171
|
+
-------
|
|
172
|
+
Self
|
|
173
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
174
|
+
|
|
175
|
+
Raises
|
|
176
|
+
------
|
|
177
|
+
InvalidTypeError
|
|
178
|
+
When an argument is not of the type its annotation names.
|
|
179
|
+
|
|
180
|
+
Examples
|
|
181
|
+
--------
|
|
182
|
+
>>> import numdaplot as ndp
|
|
183
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Nice", "Pau", "Lyon", "Nice", "Paris", "Pau"])
|
|
184
|
+
>>> prices = ndp.Array.from_list([12.0, None, None, 15.5, None, 18.0, 11.0, 14.0])
|
|
185
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, None, 60.0, 52.0, 41.0, None, 38.0])
|
|
186
|
+
>>> flats = ndp.Table.from_arrays({"city": cities, "price": prices, "surface": surfaces})
|
|
187
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.OUTSIDE_RIGHT)
|
|
188
|
+
>>> plot = ndp.Plot.missing_map(flats, style)
|
|
189
|
+
>>> plot.show()
|
|
190
|
+
"""
|
|
191
|
+
values = read_missing_cells(table)
|
|
192
|
+
layer = ChartLayer(MissingMapChart(), values)
|
|
193
|
+
plot = cls._create_from_layer(layer, style)
|
|
194
|
+
|
|
195
|
+
return plot
|