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,319 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alignment of the charts of a Plot on shared ``x`` labels.
|
|
3
|
+
|
|
4
|
+
When bars or texts are overlaid, each ``x`` value is a label at its own position. The charts then share the
|
|
5
|
+
labels of all of them: the labels of the first chart in its order, followed by the new labels of the next ones,
|
|
6
|
+
and each value is placed on its label.
|
|
7
|
+
|
|
8
|
+
.. versionadded:: 0.1.0
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from dataclasses import replace
|
|
12
|
+
from typing import Any, cast
|
|
13
|
+
|
|
14
|
+
import numpy
|
|
15
|
+
from numpy.typing import NDArray
|
|
16
|
+
|
|
17
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
18
|
+
from numdaplot.plots.charts.bar_chart import BarChart
|
|
19
|
+
from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
|
|
20
|
+
from numdaplot.plots.data.point_values import PointValues
|
|
21
|
+
from numdaplot.plots.data.position_kind import PositionKind
|
|
22
|
+
from numdaplot.plots.data.unique_labels import require_unique_labels
|
|
23
|
+
from numdaplot.plots.drawing.position_axis import write_position_labels
|
|
24
|
+
|
|
25
|
+
MINIMUM_SHARING_LAYERS = 2
|
|
26
|
+
NO_SOURCE = -1
|
|
27
|
+
TEXT_DTYPE = numpy.dtype(object)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def align_layers(layers: list[ChartLayer]) -> list[ChartLayer]:
|
|
31
|
+
"""
|
|
32
|
+
Return the charts of a Plot placed on the same labels, when several of them share label positions.
|
|
33
|
+
|
|
34
|
+
.. versionadded:: 0.1.0
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
layers
|
|
39
|
+
The charts of the Plot and their values.
|
|
40
|
+
|
|
41
|
+
Returns
|
|
42
|
+
-------
|
|
43
|
+
list[ChartLayer]
|
|
44
|
+
The same charts, on the merged labels when bars or texts are overlaid, unchanged otherwise.
|
|
45
|
+
|
|
46
|
+
Raises
|
|
47
|
+
------
|
|
48
|
+
DuplicateLabelError
|
|
49
|
+
When a label appears twice in the ``x`` values of one overlaid chart.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> import numdaplot as ndp
|
|
54
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
55
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
56
|
+
>>> from numdaplot.plots.drawing.layer_alignment import align_layers
|
|
57
|
+
>>> sales = ndp.Table.from_arrays(
|
|
58
|
+
... {"city": ndp.Array.from_list(["Paris", "Lyon"]), "sales": ndp.Array.from_list([120.0, 80.0])}
|
|
59
|
+
... )
|
|
60
|
+
>>> targets = ndp.Table.from_arrays(
|
|
61
|
+
... {"city": ndp.Array.from_list(["Pau", "Paris"]), "target": ndp.Array.from_list([40.0, 130.0])}
|
|
62
|
+
... )
|
|
63
|
+
>>> bars = ChartLayer(ndp.BarChart(), read_table_values(sales, "city", ["sales"], "BarChart"))
|
|
64
|
+
>>> line = ChartLayer(ndp.LineChart(), read_table_values(targets, "city", ["target"], "LineChart"))
|
|
65
|
+
>>> aligned_line = align_layers([bars, line])[1]
|
|
66
|
+
>>> aligned_line.values.positions.values.tolist(), aligned_line.values.series[0].values.tolist()
|
|
67
|
+
(['Paris', 'Lyon', 'Pau'], [130.0, nan, 40.0])
|
|
68
|
+
"""
|
|
69
|
+
shares_labels = needs_shared_labels(layers)
|
|
70
|
+
if not shares_labels:
|
|
71
|
+
return layers
|
|
72
|
+
|
|
73
|
+
layer_labels = [write_layer_labels(layer) for layer in layers]
|
|
74
|
+
merged_labels = merge_labels(layer_labels)
|
|
75
|
+
label_pairs = zip(layers, layer_labels, strict=True)
|
|
76
|
+
aligned_layers = [align_layer(layer, labels, merged_labels) for layer, labels in label_pairs]
|
|
77
|
+
|
|
78
|
+
return aligned_layers
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def needs_shared_labels(layers: list[ChartLayer]) -> bool:
|
|
82
|
+
"""
|
|
83
|
+
Return whether the charts of a Plot place their ``x`` values on shared labels.
|
|
84
|
+
|
|
85
|
+
.. versionadded:: 0.1.0
|
|
86
|
+
|
|
87
|
+
Parameters
|
|
88
|
+
----------
|
|
89
|
+
layers
|
|
90
|
+
The charts of the Plot and their values.
|
|
91
|
+
|
|
92
|
+
Returns
|
|
93
|
+
-------
|
|
94
|
+
bool
|
|
95
|
+
True when several charts are overlaid and one of them draws bars or has texts as ``x`` values.
|
|
96
|
+
|
|
97
|
+
Examples
|
|
98
|
+
--------
|
|
99
|
+
>>> import numdaplot as ndp
|
|
100
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
101
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
102
|
+
>>> from numdaplot.plots.drawing.layer_alignment import needs_shared_labels
|
|
103
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
104
|
+
>>> line = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
|
|
105
|
+
>>> needs_shared_labels([line, line])
|
|
106
|
+
False
|
|
107
|
+
"""
|
|
108
|
+
layer_count = len(layers)
|
|
109
|
+
if layer_count < MINIMUM_SHARING_LAYERS:
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
for layer in layers:
|
|
113
|
+
values = cast(ChartValues, layer.values)
|
|
114
|
+
draws_bars = isinstance(layer.chart, BarChart)
|
|
115
|
+
has_texts = values.positions.kind == PositionKind.TEXTS
|
|
116
|
+
places_labels = draws_bars or has_texts
|
|
117
|
+
if places_labels:
|
|
118
|
+
return True
|
|
119
|
+
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def write_layer_labels(layer: ChartLayer) -> list[str]:
|
|
124
|
+
"""
|
|
125
|
+
Return the label of each ``x`` value of a chart, after checking that none appears twice.
|
|
126
|
+
|
|
127
|
+
.. versionadded:: 0.1.0
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
layer
|
|
132
|
+
A chart and its values.
|
|
133
|
+
|
|
134
|
+
Returns
|
|
135
|
+
-------
|
|
136
|
+
list[str]
|
|
137
|
+
The labels, such as ``"2026-01-01"`` for a date.
|
|
138
|
+
|
|
139
|
+
Raises
|
|
140
|
+
------
|
|
141
|
+
DuplicateLabelError
|
|
142
|
+
When a label appears twice.
|
|
143
|
+
|
|
144
|
+
Examples
|
|
145
|
+
--------
|
|
146
|
+
>>> import numdaplot as ndp
|
|
147
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
148
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
149
|
+
>>> from numdaplot.plots.drawing.layer_alignment import write_layer_labels
|
|
150
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
151
|
+
>>> write_layer_labels(ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart")))
|
|
152
|
+
['0', '1']
|
|
153
|
+
"""
|
|
154
|
+
values = cast(ChartValues, layer.values)
|
|
155
|
+
labels = write_position_labels(values.positions)
|
|
156
|
+
require_unique_labels(labels)
|
|
157
|
+
|
|
158
|
+
return labels
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def merge_labels(layer_labels: list[list[str]]) -> list[str]:
|
|
162
|
+
"""
|
|
163
|
+
Return every label once: the labels of the first chart in its order, then the new labels of the next ones.
|
|
164
|
+
|
|
165
|
+
.. versionadded:: 0.1.0
|
|
166
|
+
|
|
167
|
+
Parameters
|
|
168
|
+
----------
|
|
169
|
+
layer_labels
|
|
170
|
+
The labels of each chart.
|
|
171
|
+
|
|
172
|
+
Returns
|
|
173
|
+
-------
|
|
174
|
+
list[str]
|
|
175
|
+
The merged labels.
|
|
176
|
+
|
|
177
|
+
Examples
|
|
178
|
+
--------
|
|
179
|
+
>>> from numdaplot.plots.drawing.layer_alignment import merge_labels
|
|
180
|
+
>>> merge_labels([["Paris", "Lyon"], ["Pau", "Paris"]])
|
|
181
|
+
['Paris', 'Lyon', 'Pau']
|
|
182
|
+
"""
|
|
183
|
+
merged_labels = dict[str, None]()
|
|
184
|
+
|
|
185
|
+
for labels in layer_labels:
|
|
186
|
+
new_labels = dict.fromkeys(labels)
|
|
187
|
+
merged_labels.update(new_labels)
|
|
188
|
+
|
|
189
|
+
label_list = list(merged_labels)
|
|
190
|
+
|
|
191
|
+
return label_list
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def align_layer(layer: ChartLayer, labels: list[str], merged_labels: list[str]) -> ChartLayer:
|
|
195
|
+
"""
|
|
196
|
+
Return a chart with its values placed on the merged labels, missing where it has no value for a label.
|
|
197
|
+
|
|
198
|
+
.. versionadded:: 0.1.0
|
|
199
|
+
|
|
200
|
+
Parameters
|
|
201
|
+
----------
|
|
202
|
+
layer
|
|
203
|
+
A chart and its values.
|
|
204
|
+
labels
|
|
205
|
+
The label of each of its ``x`` values.
|
|
206
|
+
merged_labels
|
|
207
|
+
The labels shared by every chart of the Plot.
|
|
208
|
+
|
|
209
|
+
Returns
|
|
210
|
+
-------
|
|
211
|
+
ChartLayer
|
|
212
|
+
The chart with text positions, its series and its point values reordered on the merged labels.
|
|
213
|
+
|
|
214
|
+
Examples
|
|
215
|
+
--------
|
|
216
|
+
>>> import numdaplot as ndp
|
|
217
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
218
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
219
|
+
>>> from numdaplot.plots.drawing.layer_alignment import align_layer
|
|
220
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
221
|
+
>>> layer = ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart"))
|
|
222
|
+
>>> align_layer(layer, ["0", "1"], ["1", "2", "0"]).values.series[0].values
|
|
223
|
+
array([15.5, nan, 12. ])
|
|
224
|
+
"""
|
|
225
|
+
values = cast(ChartValues, layer.values)
|
|
226
|
+
label_rows = {label: i for i, label in enumerate(labels)}
|
|
227
|
+
source_rows = [label_rows.get(label, NO_SOURCE) for label in merged_labels]
|
|
228
|
+
sources = numpy.array(source_rows, dtype=numpy.intp)
|
|
229
|
+
merged_values = numpy.array(merged_labels, dtype=TEXT_DTYPE)
|
|
230
|
+
positions = Positions(PositionKind.TEXTS, merged_values, values.positions.name)
|
|
231
|
+
series = [Series(one_series.name, pick_values(one_series.values, sources)) for one_series in values.series]
|
|
232
|
+
label_count = len(merged_labels)
|
|
233
|
+
rows = numpy.arange(label_count)
|
|
234
|
+
aligned_values = ChartValues(positions, series, rows, values.value_name, values.value_type)
|
|
235
|
+
aligned_points = align_points(layer.points, sources)
|
|
236
|
+
aligned_layer = replace(layer, values=aligned_values, points=aligned_points)
|
|
237
|
+
|
|
238
|
+
return aligned_layer
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def align_points(points: PointValues | None, sources: NDArray[numpy.intp]) -> PointValues | None:
|
|
242
|
+
"""
|
|
243
|
+
Return the values coloring and sizing the points of a ScatterChart, reordered on the merged labels.
|
|
244
|
+
|
|
245
|
+
.. versionadded:: 0.1.0
|
|
246
|
+
|
|
247
|
+
Parameters
|
|
248
|
+
----------
|
|
249
|
+
points
|
|
250
|
+
The values of the points, or None for a chart without them.
|
|
251
|
+
sources
|
|
252
|
+
For each merged label, the row of the chart holding its value, or -1 when the chart has none.
|
|
253
|
+
|
|
254
|
+
Returns
|
|
255
|
+
-------
|
|
256
|
+
PointValues or None
|
|
257
|
+
The reordered values, or None.
|
|
258
|
+
|
|
259
|
+
Examples
|
|
260
|
+
--------
|
|
261
|
+
>>> import numpy
|
|
262
|
+
>>> from numdaplot.plots.data.point_values import PointValues
|
|
263
|
+
>>> from numdaplot.plots.drawing.layer_alignment import align_points
|
|
264
|
+
>>> points = PointValues(None, None, "surface", numpy.array([30.0, 45.0]))
|
|
265
|
+
>>> align_points(points, numpy.array([1, -1])).sizes
|
|
266
|
+
array([45., nan])
|
|
267
|
+
"""
|
|
268
|
+
if points is None:
|
|
269
|
+
return None
|
|
270
|
+
|
|
271
|
+
colors = None
|
|
272
|
+
if points.colors is not None:
|
|
273
|
+
colors = pick_values(points.colors, sources)
|
|
274
|
+
|
|
275
|
+
sizes = None
|
|
276
|
+
if points.sizes is not None:
|
|
277
|
+
sizes = pick_values(points.sizes, sources)
|
|
278
|
+
|
|
279
|
+
aligned_points = PointValues(points.color_name, colors, points.size_name, sizes)
|
|
280
|
+
|
|
281
|
+
return aligned_points
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def pick_values(values: NDArray[Any], sources: NDArray[numpy.intp]) -> NDArray[Any]:
|
|
285
|
+
"""
|
|
286
|
+
Return the values at given rows, missing where the row is -1.
|
|
287
|
+
|
|
288
|
+
.. versionadded:: 0.1.0
|
|
289
|
+
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
values
|
|
293
|
+
Numbers, NaN for a missing one, or texts, None for a missing one.
|
|
294
|
+
sources
|
|
295
|
+
The row of each value picked, or -1 for a missing value.
|
|
296
|
+
|
|
297
|
+
Returns
|
|
298
|
+
-------
|
|
299
|
+
NDArray
|
|
300
|
+
The picked values, of the same type: NaN or None where the row is -1.
|
|
301
|
+
|
|
302
|
+
Examples
|
|
303
|
+
--------
|
|
304
|
+
>>> import numpy
|
|
305
|
+
>>> from numdaplot.plots.drawing.layer_alignment import pick_values
|
|
306
|
+
>>> pick_values(numpy.array(["Paris", "Lyon"], dtype=object), numpy.array([1, -1, 0]))
|
|
307
|
+
array(['Lyon', None, 'Paris'], dtype=object)
|
|
308
|
+
"""
|
|
309
|
+
missing_value = None
|
|
310
|
+
if values.dtype != TEXT_DTYPE:
|
|
311
|
+
missing_value = numpy.nan
|
|
312
|
+
|
|
313
|
+
value_count = len(sources)
|
|
314
|
+
picked_values = numpy.full(value_count, missing_value, dtype=values.dtype)
|
|
315
|
+
has_source = sources != NO_SOURCE
|
|
316
|
+
present_sources = sources[has_source]
|
|
317
|
+
picked_values[has_source] = values[present_sources]
|
|
318
|
+
|
|
319
|
+
return picked_values
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Colors of the charts overlaid on a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import replace
|
|
8
|
+
from typing import cast
|
|
9
|
+
|
|
10
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
11
|
+
from numdaplot.plots.charts.bar_chart import BarChart
|
|
12
|
+
from numdaplot.plots.charts.line_chart import LineChart
|
|
13
|
+
from numdaplot.plots.charts.scatter_chart import ScatterChart
|
|
14
|
+
from numdaplot.plots.data.chart_values import ChartValues
|
|
15
|
+
from numdaplot.plots.drawing.series_colors import take_cycle_colors
|
|
16
|
+
|
|
17
|
+
SINGLE_SERIES = 1
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def continue_color_cycle(layers: list[ChartLayer]) -> list[ChartLayer]:
|
|
21
|
+
"""
|
|
22
|
+
Return the charts of a Plot with the default colors following each other from one chart to the next.
|
|
23
|
+
|
|
24
|
+
A chart without chosen colors takes the colors of the default cycle after the ones of the charts before it,
|
|
25
|
+
so blue bars are followed by an orange line.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
layers
|
|
32
|
+
The charts of the Plot and their values.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
list[ChartLayer]
|
|
37
|
+
The same charts, the ones after the first given the colors of the cycle they take.
|
|
38
|
+
|
|
39
|
+
Examples
|
|
40
|
+
--------
|
|
41
|
+
>>> import numdaplot as ndp
|
|
42
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
43
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
44
|
+
>>> from numdaplot.plots.drawing.layer_colors import continue_color_cycle
|
|
45
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
46
|
+
>>> bars = ChartLayer(ndp.BarChart(), read_array_values(prices, "BarChart"))
|
|
47
|
+
>>> line = ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart"))
|
|
48
|
+
>>> continue_color_cycle([bars, line])[1].chart.colors
|
|
49
|
+
[<Color.ORANGE: 2>]
|
|
50
|
+
"""
|
|
51
|
+
colored_layers = list[ChartLayer]()
|
|
52
|
+
used_count = 0
|
|
53
|
+
|
|
54
|
+
for layer in layers:
|
|
55
|
+
values = cast(ChartValues, layer.values)
|
|
56
|
+
series_count = len(values.series)
|
|
57
|
+
colored_layer = give_cycle_colors(layer, used_count, series_count)
|
|
58
|
+
colored_layers.append(colored_layer)
|
|
59
|
+
used_count += series_count
|
|
60
|
+
|
|
61
|
+
return colored_layers
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def give_cycle_colors(layer: ChartLayer, start: int, series_count: int) -> ChartLayer:
|
|
65
|
+
"""
|
|
66
|
+
Return a chart given the colors of the default cycle from a start, when it has no chosen colors.
|
|
67
|
+
|
|
68
|
+
A ScatterChart takes a color for a single series without ``color_by`` only.
|
|
69
|
+
|
|
70
|
+
.. versionadded:: 0.1.0
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
layer
|
|
75
|
+
A chart and its values.
|
|
76
|
+
start
|
|
77
|
+
The number of colors of the cycle used by the charts before it.
|
|
78
|
+
series_count
|
|
79
|
+
The number of series of the chart.
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
ChartLayer
|
|
84
|
+
The chart with its colors, or the same chart when it keeps its own colors or comes first.
|
|
85
|
+
|
|
86
|
+
Examples
|
|
87
|
+
--------
|
|
88
|
+
>>> import numdaplot as ndp
|
|
89
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
90
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
91
|
+
>>> from numdaplot.plots.drawing.layer_colors import give_cycle_colors
|
|
92
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
93
|
+
>>> points = ChartLayer(ndp.ScatterChart(), read_array_values(prices, "ScatterChart"))
|
|
94
|
+
>>> give_cycle_colors(points, 2, 1).chart.color
|
|
95
|
+
<Color.GREEN: 3>
|
|
96
|
+
"""
|
|
97
|
+
if start == 0:
|
|
98
|
+
return layer
|
|
99
|
+
|
|
100
|
+
chart = layer.chart
|
|
101
|
+
cycle_colors = take_cycle_colors(start, series_count)
|
|
102
|
+
if isinstance(chart, LineChart | BarChart):
|
|
103
|
+
if chart.colors is not None:
|
|
104
|
+
return layer
|
|
105
|
+
|
|
106
|
+
colored_chart = replace(chart, colors=cycle_colors)
|
|
107
|
+
colored_layer = replace(layer, chart=colored_chart)
|
|
108
|
+
return colored_layer
|
|
109
|
+
|
|
110
|
+
if not isinstance(chart, ScatterChart):
|
|
111
|
+
return layer
|
|
112
|
+
|
|
113
|
+
is_single_series = series_count == SINGLE_SERIES
|
|
114
|
+
has_no_color = chart.color is None
|
|
115
|
+
has_no_color_by = chart.color_by is None
|
|
116
|
+
takes_cycle_color = is_single_series and has_no_color and has_no_color_by
|
|
117
|
+
if not takes_cycle_color:
|
|
118
|
+
return layer
|
|
119
|
+
|
|
120
|
+
scatter_chart = replace(chart, color=cycle_colors[0])
|
|
121
|
+
scatter_layer = replace(layer, chart=scatter_chart)
|
|
122
|
+
|
|
123
|
+
return scatter_layer
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Drawing of a LineChart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
# The matplotlib stubs leave the keyword arguments of most drawing methods untyped.
|
|
8
|
+
# pyright: reportUnknownMemberType=false
|
|
9
|
+
|
|
10
|
+
from typing import cast
|
|
11
|
+
|
|
12
|
+
from matplotlib.axes import Axes
|
|
13
|
+
|
|
14
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
15
|
+
from numdaplot.plots.charts.line_chart import LineChart
|
|
16
|
+
from numdaplot.plots.charts.line_type import LineType
|
|
17
|
+
from numdaplot.plots.data.chart_values import ChartValues
|
|
18
|
+
from numdaplot.plots.drawing.default_labels import find_position_label
|
|
19
|
+
from numdaplot.plots.drawing.drawn_chart import DrawnChart
|
|
20
|
+
from numdaplot.plots.drawing.grid_axes import GridAxes
|
|
21
|
+
from numdaplot.plots.drawing.marker_codes import MARKER_CODES
|
|
22
|
+
from numdaplot.plots.drawing.position_axis import place_positions
|
|
23
|
+
from numdaplot.plots.drawing.series_colors import choose_series_colors
|
|
24
|
+
|
|
25
|
+
LINE_STYLES = {
|
|
26
|
+
LineType.SOLID: "-",
|
|
27
|
+
LineType.DASHED: "--",
|
|
28
|
+
LineType.DOTTED: ":",
|
|
29
|
+
LineType.DASH_DOT: "-.",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def draw_line_chart(axes: Axes, layer: ChartLayer) -> DrawnChart:
|
|
34
|
+
"""
|
|
35
|
+
Draw each series of a LineChart as a line.
|
|
36
|
+
|
|
37
|
+
.. versionadded:: 0.1.0
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
axes
|
|
42
|
+
The matplotlib axes drawn on.
|
|
43
|
+
layer
|
|
44
|
+
A LineChart and its values.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
DrawnChart
|
|
49
|
+
The default labels, the ``x`` values on the horizontal axis, and grid lines across both axes.
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
InvalidColorCountError
|
|
54
|
+
When the colors of the chart are not one per series.
|
|
55
|
+
|
|
56
|
+
Examples
|
|
57
|
+
--------
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> from matplotlib.figure import Figure
|
|
60
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
61
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
62
|
+
>>> from numdaplot.plots.drawing.line_drawing import draw_line_chart
|
|
63
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
64
|
+
>>> axes = Figure().add_subplot()
|
|
65
|
+
>>> drawn_chart = draw_line_chart(axes, ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart")))
|
|
66
|
+
>>> axes.lines[0].get_ydata()
|
|
67
|
+
array([12. , 15.5])
|
|
68
|
+
"""
|
|
69
|
+
chart = cast(LineChart, layer.chart)
|
|
70
|
+
values = cast(ChartValues, layer.values)
|
|
71
|
+
series_count = len(values.series)
|
|
72
|
+
color_codes = choose_series_colors(chart.colors, series_count)
|
|
73
|
+
coordinates = place_positions(axes, values.positions, False)
|
|
74
|
+
line_style = LINE_STYLES[chart.line]
|
|
75
|
+
marker_code = MARKER_CODES[chart.marker]
|
|
76
|
+
|
|
77
|
+
for series, color_code in zip(values.series, color_codes, strict=True):
|
|
78
|
+
axes.plot(
|
|
79
|
+
coordinates, series.values, color=color_code, linestyle=line_style, marker=marker_code, label=series.name
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
x_label = find_position_label(values.positions)
|
|
83
|
+
drawn_chart = DrawnChart(x_label, values.value_name, False, GridAxes.BOTH, None)
|
|
84
|
+
|
|
85
|
+
return drawn_chart
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
matplotlib codes of the marker shapes.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.plots.charts.marker_shape import MarkerShape
|
|
8
|
+
|
|
9
|
+
MARKER_CODES = {
|
|
10
|
+
MarkerShape.NONE: "",
|
|
11
|
+
MarkerShape.CIRCLE: "o",
|
|
12
|
+
MarkerShape.SQUARE: "s",
|
|
13
|
+
MarkerShape.TRIANGLE: "^",
|
|
14
|
+
MarkerShape.CROSS: "x",
|
|
15
|
+
MarkerShape.DIAMOND: "D",
|
|
16
|
+
}
|
|
17
|
+
"""The matplotlib code of each marker shape, an empty code drawing no marker.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
"""
|