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,213 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Creation of a Plot of lines, bars or points, the charts ``add_*`` can also draw over a Plot.
|
|
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.charts.bar_chart import BarChart
|
|
11
|
+
from numdaplot.plots.charts.line_chart import LineChart
|
|
12
|
+
from numdaplot.plots.charts.scatter_chart import ScatterChart
|
|
13
|
+
from numdaplot.plots.layer_reading import read_bar_layer, read_line_layer, read_scatter_layer
|
|
14
|
+
from numdaplot.plots.plot_data import PlotData
|
|
15
|
+
from numdaplot.plots.style.plot_style import PlotStyle
|
|
16
|
+
from numdaplot.settings.argument_types import checked_arguments
|
|
17
|
+
from numdaplot.tables.table import Table
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class PlotSeriesCreation(PlotData):
|
|
21
|
+
"""
|
|
22
|
+
Creation of a Plot of lines, bars or points.
|
|
23
|
+
|
|
24
|
+
Use ``ndp.Plot.line``, ``ndp.Plot.bar`` and ``ndp.Plot.scatter``.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
@checked_arguments
|
|
31
|
+
def line(cls, data: Table | Array, chart: LineChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
32
|
+
"""
|
|
33
|
+
Return a Plot drawing columns of numbers or times of day as lines.
|
|
34
|
+
|
|
35
|
+
For a Table, ``LineChart.y`` names the columns drawn and ``LineChart.x`` the column of the positions. For an
|
|
36
|
+
Array of one or two dimensions, each column is a line and each row is placed at its number.
|
|
37
|
+
|
|
38
|
+
.. versionadded:: 0.1.0
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
data
|
|
43
|
+
The Table or the Array drawn.
|
|
44
|
+
chart
|
|
45
|
+
The columns drawn and the look of the lines.
|
|
46
|
+
The default ``LineChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
47
|
+
style
|
|
48
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
Self
|
|
53
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
54
|
+
|
|
55
|
+
Raises
|
|
56
|
+
------
|
|
57
|
+
InvalidTypeError
|
|
58
|
+
When an argument is not of the type its annotation names.
|
|
59
|
+
InvalidChartDataError
|
|
60
|
+
When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
|
|
61
|
+
ColumnNotFoundError
|
|
62
|
+
When a column does not exist.
|
|
63
|
+
IncompatibleTypesError
|
|
64
|
+
When ``x`` holds booleans or durations, or a drawn column holds neither numbers nor times of day, or the
|
|
65
|
+
drawn columns mix them.
|
|
66
|
+
DimensionError
|
|
67
|
+
When an Array has more than two dimensions.
|
|
68
|
+
InvalidColorCountError
|
|
69
|
+
When the colors of the chart are not one per line.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> import numdaplot as ndp
|
|
74
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4, 5])
|
|
75
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 16.0])
|
|
76
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, None, 10.5])
|
|
77
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
78
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"], marker=ndp.MarkerShape.CIRCLE)
|
|
79
|
+
>>> style = ndp.PlotStyle(title="Sales", y_label="Euros")
|
|
80
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
81
|
+
>>> plot.show()
|
|
82
|
+
"""
|
|
83
|
+
if chart is None:
|
|
84
|
+
chart = LineChart()
|
|
85
|
+
|
|
86
|
+
layer = read_line_layer(data, chart)
|
|
87
|
+
plot = cls._create_from_layer(layer, style)
|
|
88
|
+
|
|
89
|
+
return plot
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
@checked_arguments
|
|
93
|
+
def bar(cls, data: Table | Array, chart: BarChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
94
|
+
"""
|
|
95
|
+
Return a Plot drawing columns of numbers as bars.
|
|
96
|
+
|
|
97
|
+
For a Table, ``BarChart.y`` names the columns drawn and ``BarChart.x`` the column labeling the bars. For an
|
|
98
|
+
Array of one or two dimensions, each column is a series of bars and each row is labeled with its number.
|
|
99
|
+
|
|
100
|
+
.. versionadded:: 0.1.0
|
|
101
|
+
|
|
102
|
+
Parameters
|
|
103
|
+
----------
|
|
104
|
+
data
|
|
105
|
+
The Table or the Array drawn.
|
|
106
|
+
chart
|
|
107
|
+
The columns drawn and the look of the bars.
|
|
108
|
+
The default ``BarChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
109
|
+
style
|
|
110
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
111
|
+
|
|
112
|
+
Returns
|
|
113
|
+
-------
|
|
114
|
+
Self
|
|
115
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
116
|
+
|
|
117
|
+
Raises
|
|
118
|
+
------
|
|
119
|
+
InvalidTypeError
|
|
120
|
+
When an argument is not of the type its annotation names.
|
|
121
|
+
InvalidChartDataError
|
|
122
|
+
When a Table has no ``y`` columns, or an Array has ``x`` or ``y`` columns.
|
|
123
|
+
ColumnNotFoundError
|
|
124
|
+
When a column does not exist.
|
|
125
|
+
IncompatibleTypesError
|
|
126
|
+
When ``x`` holds booleans or durations, or a drawn column does not hold numbers.
|
|
127
|
+
DimensionError
|
|
128
|
+
When an Array has more than two dimensions.
|
|
129
|
+
InvalidColorCountError
|
|
130
|
+
When the colors of the chart are not one per series.
|
|
131
|
+
|
|
132
|
+
Examples
|
|
133
|
+
--------
|
|
134
|
+
>>> import numdaplot as ndp
|
|
135
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau", "Nice"])
|
|
136
|
+
>>> sales_2025 = ndp.Array.from_list([120.0, 80.0, 45.0, 60.0])
|
|
137
|
+
>>> sales_2026 = ndp.Array.from_list([150.0, 95.0, 40.0, 70.0])
|
|
138
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "2025": sales_2025, "2026": sales_2026})
|
|
139
|
+
>>> chart = ndp.BarChart(x="city", y=["2025", "2026"], layout=ndp.BarLayout.STACKED)
|
|
140
|
+
>>> style = ndp.PlotStyle(title="Sales per city", y_label="Thousands of euros")
|
|
141
|
+
>>> plot = ndp.Plot.bar(sales, chart, style)
|
|
142
|
+
>>> plot.show()
|
|
143
|
+
"""
|
|
144
|
+
if chart is None:
|
|
145
|
+
chart = BarChart()
|
|
146
|
+
|
|
147
|
+
layer = read_bar_layer(data, chart)
|
|
148
|
+
plot = cls._create_from_layer(layer, style)
|
|
149
|
+
|
|
150
|
+
return plot
|
|
151
|
+
|
|
152
|
+
@classmethod
|
|
153
|
+
@checked_arguments
|
|
154
|
+
def scatter(cls, data: Table | Array, chart: ScatterChart | None = None, style: PlotStyle | None = None) -> Self:
|
|
155
|
+
"""
|
|
156
|
+
Return a Plot drawing each row as a point.
|
|
157
|
+
|
|
158
|
+
For a Table, ``ScatterChart.y`` names the column of the vertical positions and ``ScatterChart.x`` the column of
|
|
159
|
+
the horizontal ones, and the points can be colored and sized by other columns. For an Array of one or two
|
|
160
|
+
dimensions, each column is a series of points and each row is placed at its number.
|
|
161
|
+
|
|
162
|
+
.. versionadded:: 0.1.0
|
|
163
|
+
|
|
164
|
+
Parameters
|
|
165
|
+
----------
|
|
166
|
+
data
|
|
167
|
+
The Table or the Array drawn.
|
|
168
|
+
chart
|
|
169
|
+
The columns drawn and the look of the points.
|
|
170
|
+
The default ``ScatterChart`` when omitted, which draws an Array: a Table needs the columns named.
|
|
171
|
+
style
|
|
172
|
+
The look of the Plot, the default ``PlotStyle`` when omitted.
|
|
173
|
+
|
|
174
|
+
Returns
|
|
175
|
+
-------
|
|
176
|
+
Self
|
|
177
|
+
The Plot, which ``show`` displays and ``save`` writes as an image.
|
|
178
|
+
|
|
179
|
+
Raises
|
|
180
|
+
------
|
|
181
|
+
InvalidTypeError
|
|
182
|
+
When an argument is not of the type its annotation names.
|
|
183
|
+
InvalidChartDataError
|
|
184
|
+
When a Table has no ``y`` column, or an Array has a column setting.
|
|
185
|
+
ColumnNotFoundError
|
|
186
|
+
When a column does not exist.
|
|
187
|
+
IncompatibleTypesError
|
|
188
|
+
When ``x`` holds booleans or durations, ``y`` holds neither numbers nor times of day, ``size_by`` does
|
|
189
|
+
not hold numbers, or ``color_by`` holds neither numbers, texts, booleans nor times of day.
|
|
190
|
+
DimensionError
|
|
191
|
+
When an Array has more than two dimensions.
|
|
192
|
+
InvalidColorCountError
|
|
193
|
+
When ``color`` is given for an Array of several columns.
|
|
194
|
+
|
|
195
|
+
Examples
|
|
196
|
+
--------
|
|
197
|
+
>>> import numdaplot as ndp
|
|
198
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0, 52.0, 38.0])
|
|
199
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0, 190.0, 160.0])
|
|
200
|
+
>>> rooms = ndp.Array.from_list([1, 2, 3, 4, 3, 2])
|
|
201
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices, "rooms": rooms})
|
|
202
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", color_by="rooms")
|
|
203
|
+
>>> style = ndp.PlotStyle(x_label="Surface (m2)", y_label="Price (thousands of euros)")
|
|
204
|
+
>>> plot = ndp.Plot.scatter(flats, chart, style)
|
|
205
|
+
>>> plot.show()
|
|
206
|
+
"""
|
|
207
|
+
if chart is None:
|
|
208
|
+
chart = ScatterChart()
|
|
209
|
+
|
|
210
|
+
layer = read_scatter_layer(data, chart)
|
|
211
|
+
plot = cls._create_from_layer(layer, style)
|
|
212
|
+
|
|
213
|
+
return plot
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check of the style of a chart without axes.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.refused_setting_error import RefusedSettingError
|
|
8
|
+
from numdaplot.plots.style.plot_style import PlotStyle
|
|
9
|
+
|
|
10
|
+
CHART_NAME = "PieChart"
|
|
11
|
+
X_LABEL_SETTING = "x_label"
|
|
12
|
+
Y_LABEL_SETTING = "y_label"
|
|
13
|
+
RIGHT_LABEL_SETTING = "right_label"
|
|
14
|
+
X_TICK_ROTATION_SETTING = "x_tick_rotation"
|
|
15
|
+
Y_TICK_ROTATION_SETTING = "y_tick_rotation"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def require_no_axis_settings(style: PlotStyle | None) -> None:
|
|
19
|
+
"""
|
|
20
|
+
Check that the style of a pie has no axis setting, a pie having no axes.
|
|
21
|
+
|
|
22
|
+
The grid lines and the legend keep their default values, so a pie leaves them without effect.
|
|
23
|
+
|
|
24
|
+
.. versionadded:: 0.1.0
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
style
|
|
29
|
+
The style given, or None.
|
|
30
|
+
|
|
31
|
+
Raises
|
|
32
|
+
------
|
|
33
|
+
RefusedSettingError
|
|
34
|
+
When the style has an ``x_label``, a ``y_label``, a ``right_label``, an ``x_tick_rotation`` or a
|
|
35
|
+
``y_tick_rotation``.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> from numdaplot.plots.style.axis_settings import require_no_axis_settings
|
|
41
|
+
>>> try:
|
|
42
|
+
... require_no_axis_settings(ndp.PlotStyle(x_tick_rotation=45))
|
|
43
|
+
... except ndp.RefusedSettingError as error:
|
|
44
|
+
... print(error)
|
|
45
|
+
PieChart does not accept x_tick_rotation.
|
|
46
|
+
"""
|
|
47
|
+
if style is None:
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
axis_settings = [
|
|
51
|
+
(X_LABEL_SETTING, style.x_label),
|
|
52
|
+
(Y_LABEL_SETTING, style.y_label),
|
|
53
|
+
(RIGHT_LABEL_SETTING, style.right_label),
|
|
54
|
+
(X_TICK_ROTATION_SETTING, style.x_tick_rotation),
|
|
55
|
+
(Y_TICK_ROTATION_SETTING, style.y_tick_rotation),
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
for setting_name, setting_value in axis_settings:
|
|
59
|
+
if setting_value is not None:
|
|
60
|
+
raise RefusedSettingError(setting_name, CHART_NAME)
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Named colors of the series of a chart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Color(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Named colors of the series of a chart: the ten colors of the default cycle, then black.
|
|
13
|
+
|
|
14
|
+
Write any other color with ``CustomColor``.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Examples
|
|
19
|
+
--------
|
|
20
|
+
>>> import numdaplot as ndp
|
|
21
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
22
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.GREEN])
|
|
23
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
24
|
+
>>> plot.show()
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
BLUE = auto()
|
|
28
|
+
"""
|
|
29
|
+
Blue, ``#1f77b4``, the first color of the default cycle.
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> import numdaplot as ndp
|
|
34
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
35
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.BLUE])
|
|
36
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
37
|
+
>>> plot.show()
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
ORANGE = auto()
|
|
41
|
+
"""
|
|
42
|
+
Orange, ``#ff7f0e``.
|
|
43
|
+
|
|
44
|
+
Examples
|
|
45
|
+
--------
|
|
46
|
+
>>> import numdaplot as ndp
|
|
47
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
48
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.ORANGE])
|
|
49
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
50
|
+
>>> plot.show()
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
GREEN = auto()
|
|
54
|
+
"""
|
|
55
|
+
Green, ``#2ca02c``.
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> import numdaplot as ndp
|
|
60
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
61
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.GREEN])
|
|
62
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
63
|
+
>>> plot.show()
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
RED = auto()
|
|
67
|
+
"""
|
|
68
|
+
Red, ``#d62728``.
|
|
69
|
+
|
|
70
|
+
Examples
|
|
71
|
+
--------
|
|
72
|
+
>>> import numdaplot as ndp
|
|
73
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
74
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.RED])
|
|
75
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
76
|
+
>>> plot.show()
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
PURPLE = auto()
|
|
80
|
+
"""
|
|
81
|
+
Purple, ``#9467bd``.
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> import numdaplot as ndp
|
|
86
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
87
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.PURPLE])
|
|
88
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
89
|
+
>>> plot.show()
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
BROWN = auto()
|
|
93
|
+
"""
|
|
94
|
+
Brown, ``#8c564b``.
|
|
95
|
+
|
|
96
|
+
Examples
|
|
97
|
+
--------
|
|
98
|
+
>>> import numdaplot as ndp
|
|
99
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
100
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.BROWN])
|
|
101
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
102
|
+
>>> plot.show()
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
PINK = auto()
|
|
106
|
+
"""
|
|
107
|
+
Pink, ``#e377c2``.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> import numdaplot as ndp
|
|
112
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
113
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.PINK])
|
|
114
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
115
|
+
>>> plot.show()
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
GRAY = auto()
|
|
119
|
+
"""
|
|
120
|
+
Gray, ``#7f7f7f``.
|
|
121
|
+
|
|
122
|
+
Examples
|
|
123
|
+
--------
|
|
124
|
+
>>> import numdaplot as ndp
|
|
125
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
126
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.GRAY])
|
|
127
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
128
|
+
>>> plot.show()
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
OLIVE = auto()
|
|
132
|
+
"""
|
|
133
|
+
Olive, ``#bcbd22``.
|
|
134
|
+
|
|
135
|
+
Examples
|
|
136
|
+
--------
|
|
137
|
+
>>> import numdaplot as ndp
|
|
138
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
139
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.OLIVE])
|
|
140
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
141
|
+
>>> plot.show()
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
CYAN = auto()
|
|
145
|
+
"""
|
|
146
|
+
Cyan, ``#17becf``.
|
|
147
|
+
|
|
148
|
+
Examples
|
|
149
|
+
--------
|
|
150
|
+
>>> import numdaplot as ndp
|
|
151
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
152
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.CYAN])
|
|
153
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
154
|
+
>>> plot.show()
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
BLACK = auto()
|
|
158
|
+
"""
|
|
159
|
+
Black, ``#000000``.
|
|
160
|
+
|
|
161
|
+
Examples
|
|
162
|
+
--------
|
|
163
|
+
>>> import numdaplot as ndp
|
|
164
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
165
|
+
>>> chart = ndp.LineChart(colors=[ndp.Color.BLACK])
|
|
166
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
167
|
+
>>> plot.show()
|
|
168
|
+
"""
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A color of a chart written as ``#rrggbb``.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
|
|
10
|
+
from numdaplot.errors.invalid_color_error import InvalidColorError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
COLOR_PATTERN = re.compile(r"#[0-9a-fA-F]{6}")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class CustomColor:
|
|
18
|
+
"""
|
|
19
|
+
A color of a chart written as ``#`` followed by its red, green and blue parts in hexadecimal.
|
|
20
|
+
|
|
21
|
+
Accepted wherever a ``Color`` is, for the colors the named ones do not cover.
|
|
22
|
+
|
|
23
|
+
.. versionadded:: 0.1.0
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
code
|
|
28
|
+
The color, such as ``"#ff8800"`` for orange, in lowercase or uppercase.
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
InvalidColorError
|
|
35
|
+
When the code is not ``#`` followed by six hexadecimal digits.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
41
|
+
>>> chart = ndp.LineChart(colors=[ndp.CustomColor("#ff8800")])
|
|
42
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
43
|
+
>>> plot.show()
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
code: str
|
|
47
|
+
|
|
48
|
+
def __post_init__(self) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Check that the code is ``#`` followed by six hexadecimal digits.
|
|
51
|
+
|
|
52
|
+
.. versionadded:: 0.1.0
|
|
53
|
+
|
|
54
|
+
Raises
|
|
55
|
+
------
|
|
56
|
+
InvalidTypeError
|
|
57
|
+
When a setting is not of the type its annotation names.
|
|
58
|
+
InvalidColorError
|
|
59
|
+
When the code is not ``#`` followed by six hexadecimal digits.
|
|
60
|
+
"""
|
|
61
|
+
require_field_types(self)
|
|
62
|
+
|
|
63
|
+
code_match = COLOR_PATTERN.fullmatch(self.code)
|
|
64
|
+
if code_match is None:
|
|
65
|
+
raise InvalidColorError(self.code)
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Whether a Plot draws grid lines behind its values.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class GridLines(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Whether a Plot draws light grid lines behind its values, used by ``PlotStyle``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
20
|
+
>>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.HIDDEN)
|
|
21
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
22
|
+
>>> plot.show()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
SHOWN = auto()
|
|
26
|
+
"""
|
|
27
|
+
Light grid lines at each tick of the axes. Default value.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
33
|
+
>>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.SHOWN)
|
|
34
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
35
|
+
>>> plot.show()
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
HIDDEN = auto()
|
|
39
|
+
"""
|
|
40
|
+
No grid lines.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
46
|
+
>>> style = ndp.PlotStyle(grid_lines=ndp.GridLines.HIDDEN)
|
|
47
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
48
|
+
>>> plot.show()
|
|
49
|
+
"""
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Settings of a PNG image of a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_resolution_error import InvalidResolutionError
|
|
10
|
+
from numdaplot.settings.field_types import require_field_types
|
|
11
|
+
|
|
12
|
+
DEFAULT_DPI = 100
|
|
13
|
+
MINIMUM_DPI = 1
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class ImageOptions:
|
|
18
|
+
"""
|
|
19
|
+
Settings of a PNG image of a Plot, used by ``Plot.save``.
|
|
20
|
+
|
|
21
|
+
The format of an image always comes from the extension of its path. SVG and PDF images are drawn with
|
|
22
|
+
lines and texts, so they have no resolution and refuse these options.
|
|
23
|
+
|
|
24
|
+
.. versionadded:: 0.1.0
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
dpi
|
|
29
|
+
The number of pixels per inch of the image, 100 by default. It only changes the sharpness: a Plot of
|
|
30
|
+
6.4 by 4.8 inches gives 640 by 480 pixels at 100, and 1280 by 960 pixels at 200.
|
|
31
|
+
|
|
32
|
+
Raises
|
|
33
|
+
------
|
|
34
|
+
InvalidTypeError
|
|
35
|
+
When a setting is not of the type its annotation names.
|
|
36
|
+
InvalidResolutionError
|
|
37
|
+
When ``dpi`` is lower than 1.
|
|
38
|
+
|
|
39
|
+
Examples
|
|
40
|
+
--------
|
|
41
|
+
>>> import tempfile
|
|
42
|
+
>>> from pathlib import Path
|
|
43
|
+
>>> from matplotlib.image import imread
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> path = Path(tempfile.mkdtemp()) / "prices.png"
|
|
46
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
47
|
+
>>> plot = ndp.Plot.line(prices)
|
|
48
|
+
>>> plot.save(path, ndp.ImageOptions(dpi=200))
|
|
49
|
+
>>> imread(path).shape
|
|
50
|
+
(960, 1280, 4)
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
dpi: int = DEFAULT_DPI
|
|
54
|
+
|
|
55
|
+
def __post_init__(self) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Check that the resolution is at least 1 dot per inch.
|
|
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
|
+
InvalidResolutionError
|
|
66
|
+
When ``dpi`` is lower than 1.
|
|
67
|
+
"""
|
|
68
|
+
require_field_types(self)
|
|
69
|
+
|
|
70
|
+
if self.dpi < MINIMUM_DPI:
|
|
71
|
+
raise InvalidResolutionError(self.dpi)
|