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,98 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart drawing each value as a bar.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
|
|
10
|
+
from numdaplot.plots.charts.bar_layout import BarLayout
|
|
11
|
+
from numdaplot.plots.charts.chart import Chart
|
|
12
|
+
from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
|
|
13
|
+
from numdaplot.plots.charts.orientation import Orientation
|
|
14
|
+
from numdaplot.plots.style.color import Color
|
|
15
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
16
|
+
from numdaplot.settings.field_types import require_field_types
|
|
17
|
+
from numdaplot.tables.columns.column_names import require_optional_column_name
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class BarChart(Chart):
|
|
22
|
+
"""
|
|
23
|
+
Chart drawing each value as a bar, used by ``Plot.bar``.
|
|
24
|
+
|
|
25
|
+
Each ``x`` value gets its own position, labeled with that value, in the order of the rows. A missing value
|
|
26
|
+
draws no bar, and a row whose ``x`` text is missing is left out.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
x
|
|
33
|
+
For a Table, the column labeling the bars: numbers, dates, datetimes, times of day (labeled ``HH:MM``), texts
|
|
34
|
+
or booleans, the row numbers when omitted. An Array takes none, its rows being numbered.
|
|
35
|
+
y
|
|
36
|
+
For a Table, the columns drawn, holding numbers, one series of bars each. A Table needs it, even for a single
|
|
37
|
+
column. An Array takes none: when omitted, each of its columns is a series.
|
|
38
|
+
orientation
|
|
39
|
+
The direction of the bars, ``Orientation.VERTICAL`` by default.
|
|
40
|
+
layout
|
|
41
|
+
How the bars of several series share a position, ``BarLayout.GROUPED`` by default.
|
|
42
|
+
colors
|
|
43
|
+
One color per series, the colors of the default cycle when omitted. The chart keeps its own list.
|
|
44
|
+
|
|
45
|
+
Raises
|
|
46
|
+
------
|
|
47
|
+
InvalidTypeError
|
|
48
|
+
When a setting is not of the type its annotation names.
|
|
49
|
+
InvalidColumnNameError
|
|
50
|
+
When ``x`` or a name in ``y`` is an empty text.
|
|
51
|
+
EmptyListError
|
|
52
|
+
When ``y`` or ``colors`` is an empty list.
|
|
53
|
+
DuplicateColumnError
|
|
54
|
+
When a column name appears twice in ``y``.
|
|
55
|
+
|
|
56
|
+
Examples
|
|
57
|
+
--------
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
60
|
+
>>> sales_2025 = ndp.Array.from_list([120.0, 80.0, 45.0])
|
|
61
|
+
>>> sales_2026 = ndp.Array.from_list([150.0, 95.0, 40.0])
|
|
62
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "2025": sales_2025, "2026": sales_2026})
|
|
63
|
+
>>> chart = ndp.BarChart(x="city", y=["2025", "2026"])
|
|
64
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
65
|
+
>>> plot.show()
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
x: str | None = None
|
|
69
|
+
y: list[str] | None = None
|
|
70
|
+
orientation: Orientation = Orientation.VERTICAL
|
|
71
|
+
layout: BarLayout = BarLayout.GROUPED
|
|
72
|
+
colors: Sequence[Color | CustomColor] | None = None
|
|
73
|
+
|
|
74
|
+
def __post_init__(self) -> None:
|
|
75
|
+
"""
|
|
76
|
+
Check the columns and the colors and replace them with copies that only the chart holds.
|
|
77
|
+
|
|
78
|
+
.. versionadded:: 0.1.0
|
|
79
|
+
|
|
80
|
+
Raises
|
|
81
|
+
------
|
|
82
|
+
InvalidTypeError
|
|
83
|
+
When a setting is not of the type its annotation names.
|
|
84
|
+
InvalidColumnNameError
|
|
85
|
+
When ``x`` or a name in ``y`` is an empty text.
|
|
86
|
+
EmptyListError
|
|
87
|
+
When ``y`` or ``colors`` is an empty list.
|
|
88
|
+
DuplicateColumnError
|
|
89
|
+
When a column name appears twice in ``y``.
|
|
90
|
+
"""
|
|
91
|
+
require_field_types(self)
|
|
92
|
+
|
|
93
|
+
require_optional_column_name(self.x)
|
|
94
|
+
|
|
95
|
+
columns_copy = copy_columns(self.y)
|
|
96
|
+
colors_copy = copy_colors(self.colors)
|
|
97
|
+
object.__setattr__(self, "y", columns_copy)
|
|
98
|
+
object.__setattr__(self, "colors", colors_copy)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
How the bars of several series share a position of a BarChart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BarLayout(Enum):
|
|
11
|
+
"""
|
|
12
|
+
How the bars of several series share a position of a ``BarChart``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
20
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
21
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
22
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
23
|
+
>>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.STACKED)
|
|
24
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
25
|
+
>>> plot.show()
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
GROUPED = auto()
|
|
29
|
+
"""
|
|
30
|
+
Side by side. Default value.
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
36
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
37
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
38
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
39
|
+
>>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.GROUPED)
|
|
40
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
41
|
+
>>> plot.show()
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
STACKED = auto()
|
|
45
|
+
"""
|
|
46
|
+
On top of each other, positive values above zero and negative values below it.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numdaplot as ndp
|
|
51
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
52
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
53
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
54
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
55
|
+
>>> chart = ndp.BarChart(x="day", y=["price", "cost"], layout=ndp.BarLayout.STACKED)
|
|
56
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
57
|
+
>>> plot.show()
|
|
58
|
+
"""
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Bins of a histogram given by their number.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_count_error import InvalidCountError
|
|
10
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
|
|
12
|
+
MINIMUM_BIN_COUNT = 1
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class BinCount:
|
|
17
|
+
"""
|
|
18
|
+
Bins of a ``HistogramChart`` given by their number, of the same width from the smallest to the largest value.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
count
|
|
25
|
+
The number of bins, at least 1.
|
|
26
|
+
|
|
27
|
+
Raises
|
|
28
|
+
------
|
|
29
|
+
InvalidTypeError
|
|
30
|
+
When a setting is not of the type its annotation names.
|
|
31
|
+
InvalidCountError
|
|
32
|
+
When the count is lower than 1.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 15.0])
|
|
38
|
+
>>> chart = ndp.HistogramChart(bins=ndp.BinCount(4))
|
|
39
|
+
>>> plot = ndp.Plot.histogram(prices, chart)
|
|
40
|
+
>>> plot.show()
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
count: int
|
|
44
|
+
|
|
45
|
+
def __post_init__(self) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Check the number of bins.
|
|
48
|
+
|
|
49
|
+
.. versionadded:: 0.1.0
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
InvalidTypeError
|
|
54
|
+
When a setting is not of the type its annotation names.
|
|
55
|
+
InvalidCountError
|
|
56
|
+
When the count is lower than 1.
|
|
57
|
+
"""
|
|
58
|
+
require_field_types(self)
|
|
59
|
+
|
|
60
|
+
if self.count < MINIMUM_BIN_COUNT:
|
|
61
|
+
raise InvalidCountError(self.count, MINIMUM_BIN_COUNT)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Bins of a histogram given by their width.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from datetime import timedelta
|
|
9
|
+
|
|
10
|
+
from numdaplot.errors.invalid_bin_width_error import InvalidBinWidthError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
NO_DURATION = timedelta(0)
|
|
14
|
+
LONGEST_DURATION = timedelta(days=1)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class BinWidth:
|
|
19
|
+
"""
|
|
20
|
+
Bins of a ``HistogramChart`` given by their width, their bounds being multiples of it.
|
|
21
|
+
|
|
22
|
+
With a width of 5, the bins are 10 to 15, 15 to 20 and so on, whatever the smallest value. Times of day take
|
|
23
|
+
a duration: with ``timedelta(minutes=30)``, the bins are 08:00 to 08:30, 08:30 to 09:00 and so on.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
width
|
|
30
|
+
The width of each bin: a number above 0 for numbers, a duration above 0 and of at most a day for times of
|
|
31
|
+
day.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
InvalidTypeError
|
|
36
|
+
When a setting is not of the type its annotation names.
|
|
37
|
+
InvalidBinWidthError
|
|
38
|
+
When the width is 0 or negative, or a duration beyond a day.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 21.0])
|
|
44
|
+
>>> chart = ndp.HistogramChart(bins=ndp.BinWidth(2.5))
|
|
45
|
+
>>> plot = ndp.Plot.histogram(prices, chart)
|
|
46
|
+
>>> plot.show()
|
|
47
|
+
>>> from datetime import time, timedelta
|
|
48
|
+
>>> hours = ndp.Array.from_list([time(8, 10), time(8, 40), time(9, 5), time(17, 50)])
|
|
49
|
+
>>> half_hours = ndp.HistogramChart(bins=ndp.BinWidth(timedelta(minutes=30)))
|
|
50
|
+
>>> ndp.Plot.histogram(hours, half_hours).show()
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
width: float | timedelta
|
|
54
|
+
|
|
55
|
+
def __post_init__(self) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Check the width of the bins.
|
|
58
|
+
|
|
59
|
+
.. versionadded:: 0.1.0
|
|
60
|
+
|
|
61
|
+
Raises
|
|
62
|
+
------
|
|
63
|
+
InvalidTypeError
|
|
64
|
+
When a setting is not of the type its annotation names.
|
|
65
|
+
InvalidBinWidthError
|
|
66
|
+
When the width is 0 or negative, or a duration beyond a day.
|
|
67
|
+
"""
|
|
68
|
+
require_field_types(self)
|
|
69
|
+
|
|
70
|
+
if isinstance(self.width, timedelta):
|
|
71
|
+
is_outside_day = self.width <= NO_DURATION or self.width > LONGEST_DURATION
|
|
72
|
+
if is_outside_day:
|
|
73
|
+
raise InvalidBinWidthError(self.width)
|
|
74
|
+
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
if self.width <= 0:
|
|
78
|
+
raise InvalidBinWidthError(self.width)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart summing up the spread of values as boxes.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
|
|
10
|
+
from numdaplot.plots.charts.chart import Chart
|
|
11
|
+
from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
|
|
12
|
+
from numdaplot.plots.charts.outliers import Outliers
|
|
13
|
+
from numdaplot.plots.style.color import Color
|
|
14
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
15
|
+
from numdaplot.settings.field_types import require_field_types
|
|
16
|
+
from numdaplot.tables.columns.column_names import require_optional_column_name
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class BoxChart(Chart):
|
|
21
|
+
"""
|
|
22
|
+
Chart summing up the spread of the values of each column as a box, used by ``Plot.box``.
|
|
23
|
+
|
|
24
|
+
The box goes from the first to the third quartile, with a line at the median. The whiskers reach the
|
|
25
|
+
furthest values within 1.5 box heights of the box, and the values beyond them are outliers. Missing values
|
|
26
|
+
are left out.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
columns
|
|
33
|
+
For a Table, the columns drawn, holding numbers or times of day, not both. A Table needs it, even for a
|
|
34
|
+
single column. An Array takes none: when omitted, each of its columns is drawn. Times of day are measured on
|
|
35
|
+
an axis labeled ``HH:MM``.
|
|
36
|
+
group_by
|
|
37
|
+
For a Table, a column of texts, categories, booleans or times of day (written ``HH:MM``) splitting the rows into
|
|
38
|
+
groups, each drawn at its own position in alphabetical order, with the boxes of the columns side by side. A row
|
|
39
|
+
whose group is missing is left out. One box per column when omitted.
|
|
40
|
+
outliers
|
|
41
|
+
Whether the outliers are drawn, ``Outliers.SHOWN`` by default.
|
|
42
|
+
colors
|
|
43
|
+
One color per column, the colors of the default cycle when omitted. The chart keeps its own list.
|
|
44
|
+
|
|
45
|
+
Raises
|
|
46
|
+
------
|
|
47
|
+
InvalidTypeError
|
|
48
|
+
When a setting is not of the type its annotation names.
|
|
49
|
+
InvalidColumnNameError
|
|
50
|
+
When ``group_by`` or a name in ``columns`` is an empty text.
|
|
51
|
+
EmptyListError
|
|
52
|
+
When ``columns`` or ``colors`` is an empty list.
|
|
53
|
+
DuplicateColumnError
|
|
54
|
+
When a column name appears twice in ``columns``.
|
|
55
|
+
|
|
56
|
+
Examples
|
|
57
|
+
--------
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon", "Paris", "Lyon"])
|
|
60
|
+
>>> prices_2025 = ndp.Array.from_list([12.0, 9.5, 14.0, 10.0, 13.5, 8.0, 15.0, 11.0])
|
|
61
|
+
>>> prices_2026 = ndp.Array.from_list([14.0, 10.5, 16.0, 11.0, 15.5, 9.0, 17.0, 12.5])
|
|
62
|
+
>>> prices = ndp.Table.from_arrays({"city": cities, "2025": prices_2025, "2026": prices_2026})
|
|
63
|
+
>>> chart = ndp.BoxChart(columns=["2025", "2026"], group_by="city")
|
|
64
|
+
>>> plot = ndp.Plot.box(prices, chart)
|
|
65
|
+
>>> plot.show()
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
columns: list[str] | None = None
|
|
69
|
+
group_by: str | None = None
|
|
70
|
+
outliers: Outliers = Outliers.SHOWN
|
|
71
|
+
colors: Sequence[Color | CustomColor] | None = None
|
|
72
|
+
|
|
73
|
+
def __post_init__(self) -> None:
|
|
74
|
+
"""
|
|
75
|
+
Check the columns and the colors and replace them with copies that only the chart holds.
|
|
76
|
+
|
|
77
|
+
.. versionadded:: 0.1.0
|
|
78
|
+
|
|
79
|
+
Raises
|
|
80
|
+
------
|
|
81
|
+
InvalidTypeError
|
|
82
|
+
When a setting is not of the type its annotation names.
|
|
83
|
+
InvalidColumnNameError
|
|
84
|
+
When ``group_by`` or a name in ``columns`` is an empty text.
|
|
85
|
+
EmptyListError
|
|
86
|
+
When ``columns`` or ``colors`` is an empty list.
|
|
87
|
+
DuplicateColumnError
|
|
88
|
+
When a column name appears twice in ``columns``.
|
|
89
|
+
"""
|
|
90
|
+
require_field_types(self)
|
|
91
|
+
|
|
92
|
+
require_optional_column_name(self.group_by)
|
|
93
|
+
|
|
94
|
+
columns_copy = copy_columns(self.columns)
|
|
95
|
+
colors_copy = copy_colors(self.colors)
|
|
96
|
+
object.__setattr__(self, "columns", columns_copy)
|
|
97
|
+
object.__setattr__(self, "colors", colors_copy)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Whether the cells of a HeatmapChart show their value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CellValues(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Whether the cells of a ``HeatmapChart`` show their value.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
20
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
21
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
22
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
23
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
24
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.SHOWN)
|
|
25
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
26
|
+
>>> plot.show()
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
SHOWN = auto()
|
|
30
|
+
"""
|
|
31
|
+
Each cell shows its value with at most two decimals, in black or white to stay readable.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
37
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
38
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
39
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
40
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
41
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.SHOWN)
|
|
42
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
43
|
+
>>> plot.show()
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
HIDDEN = auto()
|
|
47
|
+
"""
|
|
48
|
+
The cells only show their color. Default value.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numdaplot as ndp
|
|
53
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
54
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
55
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
56
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
57
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
58
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.HIDDEN)
|
|
59
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
60
|
+
>>> plot.show()
|
|
61
|
+
"""
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base class of every chart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
8
|
+
|
|
9
|
+
CONSTRUCTOR_OPERATION = "Creating a Chart with ndp.Chart()"
|
|
10
|
+
CONSTRUCTOR_ALTERNATIVE = "a chart such as ndp.LineChart"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Chart:
|
|
14
|
+
"""
|
|
15
|
+
Base class of every chart, which says what a Plot draws and how its series look.
|
|
16
|
+
|
|
17
|
+
A chart is immutable and checks its settings when it is created.
|
|
18
|
+
|
|
19
|
+
Only its subclasses are created: calling ``ndp.Chart()`` raises ``RefusedOperationError``.
|
|
20
|
+
|
|
21
|
+
Every chart, each passed to its own creation method of ``Plot``:
|
|
22
|
+
|
|
23
|
+
|Chart|What it draws|Example|
|
|
24
|
+
|---|---|---|
|
|
25
|
+
|``LineChart``|Each series as a line, with ``Plot.line``|``ndp.LineChart(x="month", y=["sales"])``|
|
|
26
|
+
|``BarChart``|Each value as a bar, with ``Plot.bar``|``ndp.BarChart(x="city", y=["sales"])``|
|
|
27
|
+
|``ScatterChart``|Each row as a point, with ``Plot.scatter``|``ndp.ScatterChart(x="price", y="stock")``|
|
|
28
|
+
|``HistogramChart``|The values per bin, with ``Plot.histogram``|``ndp.HistogramChart(columns=["price"])``|
|
|
29
|
+
|``BoxChart``|The spread of each column as a box, with ``Plot.box``|``ndp.BoxChart(columns=["price"])``|
|
|
30
|
+
|``PieChart``|Each row as a slice of a pie, with ``Plot.pie``|``ndp.PieChart(labels="city", values="sales")``|
|
|
31
|
+
|``HeatmapChart``|Each value as a colored cell, with ``Plot.heatmap``|``ndp.HeatmapChart()``|
|
|
32
|
+
|``MissingChart``|The missing values per column, with ``Plot.missing_by_column``|``ndp.MissingChart()``|
|
|
33
|
+
|
|
34
|
+
.. versionadded:: 0.1.0
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
40
|
+
>>> bar_plot = ndp.Plot.bar(prices, ndp.BarChart(orientation=ndp.Orientation.HORIZONTAL))
|
|
41
|
+
>>> bar_plot.show()
|
|
42
|
+
>>> line_plot = ndp.Plot.line(prices, ndp.LineChart(marker=ndp.MarkerShape.CIRCLE))
|
|
43
|
+
>>> line_plot.show()
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Refuse the creation of the base class itself, and let a subclass be created.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Raises
|
|
53
|
+
------
|
|
54
|
+
RefusedOperationError
|
|
55
|
+
When the created object is a Chart and not one of its subclasses.
|
|
56
|
+
"""
|
|
57
|
+
created_class = type(self)
|
|
58
|
+
if created_class is Chart:
|
|
59
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Checks shared by the column and color settings of the charts.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.empty_list_error import EmptyListError
|
|
10
|
+
from numdaplot.plots.style.color import Color
|
|
11
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
12
|
+
from numdaplot.tables.columns.column_names import require_column_names
|
|
13
|
+
|
|
14
|
+
COLUMN_ITEM_NAME = "column"
|
|
15
|
+
COLOR_ITEM_NAME = "color"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def copy_columns(columns: list[str] | None) -> list[str] | None:
|
|
19
|
+
"""
|
|
20
|
+
Check the names of the columns a chart draws and return a copy that only the chart holds.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
columns
|
|
27
|
+
The names of the columns, or None for an Array.
|
|
28
|
+
|
|
29
|
+
Returns
|
|
30
|
+
-------
|
|
31
|
+
list[str] or None
|
|
32
|
+
A copy of the names, or None.
|
|
33
|
+
|
|
34
|
+
Raises
|
|
35
|
+
------
|
|
36
|
+
EmptyListError
|
|
37
|
+
When the list is empty.
|
|
38
|
+
InvalidColumnNameError
|
|
39
|
+
When a column name is an empty text.
|
|
40
|
+
DuplicateColumnError
|
|
41
|
+
When a name appears twice.
|
|
42
|
+
|
|
43
|
+
Examples
|
|
44
|
+
--------
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> from numdaplot.plots.charts.chart_settings import copy_columns
|
|
47
|
+
>>> try:
|
|
48
|
+
... copy_columns(["price", "price"])
|
|
49
|
+
... except ndp.DuplicateColumnError as error:
|
|
50
|
+
... print(error)
|
|
51
|
+
The column name 'price' appears more than once.
|
|
52
|
+
"""
|
|
53
|
+
if columns is None:
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
if columns == []:
|
|
57
|
+
raise EmptyListError(COLUMN_ITEM_NAME)
|
|
58
|
+
|
|
59
|
+
require_column_names(columns)
|
|
60
|
+
columns_copy = list(columns)
|
|
61
|
+
|
|
62
|
+
return columns_copy
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def copy_colors(colors: Sequence[Color | CustomColor] | None) -> list[Color | CustomColor] | None:
|
|
66
|
+
"""
|
|
67
|
+
Check the colors of the series of a chart and return a copy that only the chart holds.
|
|
68
|
+
|
|
69
|
+
.. versionadded:: 0.1.0
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
colors
|
|
74
|
+
One color per series, in a list or another sequence, or None for the colors of the default cycle.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
list[Color | CustomColor] or None
|
|
79
|
+
A copy of the colors, or None.
|
|
80
|
+
|
|
81
|
+
Raises
|
|
82
|
+
------
|
|
83
|
+
EmptyListError
|
|
84
|
+
When the list is empty.
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> import numdaplot as ndp
|
|
89
|
+
>>> from numdaplot.plots.charts.chart_settings import copy_colors
|
|
90
|
+
>>> try:
|
|
91
|
+
... copy_colors([])
|
|
92
|
+
... except ndp.EmptyListError as error:
|
|
93
|
+
... print(error)
|
|
94
|
+
Expected at least one color, got an empty list.
|
|
95
|
+
"""
|
|
96
|
+
if colors is None:
|
|
97
|
+
return None
|
|
98
|
+
|
|
99
|
+
color_count = len(colors)
|
|
100
|
+
if color_count == 0:
|
|
101
|
+
raise EmptyListError(COLOR_ITEM_NAME)
|
|
102
|
+
|
|
103
|
+
colors_copy = list(colors)
|
|
104
|
+
|
|
105
|
+
return colors_copy
|