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,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart drawing where the values of a Table are missing.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.plots.charts.chart import Chart
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class MissingMapChart(Chart):
|
|
14
|
+
"""
|
|
15
|
+
Chart drawing each value of a Table as a cell, dark when missing, made by ``Plot.missing_map``.
|
|
16
|
+
|
|
17
|
+
It has no setting, so ``Plot.missing_map`` creates it itself.
|
|
18
|
+
|
|
19
|
+
.. versionadded:: 0.1.0
|
|
20
|
+
|
|
21
|
+
Examples
|
|
22
|
+
--------
|
|
23
|
+
>>> import numdaplot as ndp
|
|
24
|
+
>>> from numdaplot.plots.charts.missing_map_chart import MissingMapChart
|
|
25
|
+
>>> isinstance(MissingMapChart(), ndp.Chart)
|
|
26
|
+
True
|
|
27
|
+
"""
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Direction of the bars of a BarChart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Orientation(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Direction of the bars 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"], orientation=ndp.Orientation.HORIZONTAL)
|
|
24
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
25
|
+
>>> plot.show()
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
VERTICAL = auto()
|
|
29
|
+
"""
|
|
30
|
+
Bars rising from the horizontal axis. 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"], orientation=ndp.Orientation.VERTICAL)
|
|
40
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
41
|
+
>>> plot.show()
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
HORIZONTAL = auto()
|
|
45
|
+
"""
|
|
46
|
+
Bars extending from the vertical axis, which then holds the ``x`` values.
|
|
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"], orientation=ndp.Orientation.HORIZONTAL)
|
|
56
|
+
>>> plot = ndp.Plot.bar(sales, chart)
|
|
57
|
+
>>> plot.show()
|
|
58
|
+
"""
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Whether a BoxChart draws its outliers.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Outliers(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Whether a ``BoxChart`` draws its outliers, the values beyond its whiskers.
|
|
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, 13.5, 16.0, 14.5, 29.0])
|
|
20
|
+
>>> chart = ndp.BoxChart(outliers=ndp.Outliers.HIDDEN)
|
|
21
|
+
>>> plot = ndp.Plot.box(prices, chart)
|
|
22
|
+
>>> plot.show()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
SHOWN = auto()
|
|
26
|
+
"""
|
|
27
|
+
Each outlier is drawn as a point. 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, 13.5, 16.0, 14.5, 29.0])
|
|
33
|
+
>>> chart = ndp.BoxChart(outliers=ndp.Outliers.SHOWN)
|
|
34
|
+
>>> plot = ndp.Plot.box(prices, chart)
|
|
35
|
+
>>> plot.show()
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
HIDDEN = auto()
|
|
39
|
+
"""
|
|
40
|
+
The outliers are not drawn. They still count in the box and the whiskers.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 29.0])
|
|
46
|
+
>>> chart = ndp.BoxChart(outliers=ndp.Outliers.HIDDEN)
|
|
47
|
+
>>> plot = ndp.Plot.box(prices, chart)
|
|
48
|
+
>>> plot.show()
|
|
49
|
+
"""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Whether the slices of a PieChart show their share.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Percentages(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Whether the slices of a ``PieChart`` show their share of the total.
|
|
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
|
+
>>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
|
|
21
|
+
>>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
|
|
22
|
+
>>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.HIDDEN)
|
|
23
|
+
>>> plot = ndp.Plot.pie(shares, chart)
|
|
24
|
+
>>> plot.show()
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
SHOWN = auto()
|
|
28
|
+
"""
|
|
29
|
+
Each slice shows its share with one decimal, such as ``42.5%``. Default value.
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> import numdaplot as ndp
|
|
34
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
35
|
+
>>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
|
|
36
|
+
>>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
|
|
37
|
+
>>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.SHOWN)
|
|
38
|
+
>>> plot = ndp.Plot.pie(shares, chart)
|
|
39
|
+
>>> plot.show()
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
HIDDEN = auto()
|
|
43
|
+
"""
|
|
44
|
+
The slices only show their label.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
50
|
+
>>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
|
|
51
|
+
>>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
|
|
52
|
+
>>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.HIDDEN)
|
|
53
|
+
>>> plot = ndp.Plot.pie(shares, chart)
|
|
54
|
+
>>> plot.show()
|
|
55
|
+
"""
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart sharing out a total as slices of a disc.
|
|
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
|
|
12
|
+
from numdaplot.plots.charts.percentages import Percentages
|
|
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_column_name
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class PieChart(Chart):
|
|
21
|
+
"""
|
|
22
|
+
Chart drawing each row of a Table as a slice of a disc, sized by its share of the total, used by ``Plot.pie``.
|
|
23
|
+
|
|
24
|
+
The slices start at the top and follow each other clockwise, in the order of the rows, each labeled with
|
|
25
|
+
its text. Every value must be present and positive or 0, and every label must be different. Beyond 5 slices,
|
|
26
|
+
a ``ReadabilityWarning`` suggests a ``BarChart``.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
labels
|
|
33
|
+
The column of texts, booleans or times of day (written ``HH:MM``) naming the slices.
|
|
34
|
+
values
|
|
35
|
+
The column of numbers sizing the slices.
|
|
36
|
+
percentages
|
|
37
|
+
Whether each slice shows its share, such as ``42.5%``, ``Percentages.SHOWN`` by default.
|
|
38
|
+
colors
|
|
39
|
+
One color per slice, the colors of the default cycle when omitted. The chart keeps its own list.
|
|
40
|
+
|
|
41
|
+
Raises
|
|
42
|
+
------
|
|
43
|
+
InvalidTypeError
|
|
44
|
+
When a setting is not of the type its annotation names.
|
|
45
|
+
InvalidColumnNameError
|
|
46
|
+
When ``labels`` or ``values`` is an empty text.
|
|
47
|
+
EmptyListError
|
|
48
|
+
When ``colors`` is an empty list.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numdaplot as ndp
|
|
53
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
54
|
+
>>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
|
|
55
|
+
>>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
|
|
56
|
+
>>> chart = ndp.PieChart(labels="city", values="sales")
|
|
57
|
+
>>> plot = ndp.Plot.pie(shares, chart)
|
|
58
|
+
>>> plot.show()
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
labels: str
|
|
62
|
+
values: str
|
|
63
|
+
percentages: Percentages = Percentages.SHOWN
|
|
64
|
+
colors: Sequence[Color | CustomColor] | None = None
|
|
65
|
+
|
|
66
|
+
def __post_init__(self) -> None:
|
|
67
|
+
"""
|
|
68
|
+
Check the colors and replace them with a copy that only the chart holds.
|
|
69
|
+
|
|
70
|
+
.. versionadded:: 0.1.0
|
|
71
|
+
|
|
72
|
+
Raises
|
|
73
|
+
------
|
|
74
|
+
InvalidTypeError
|
|
75
|
+
When a setting is not of the type its annotation names.
|
|
76
|
+
InvalidColumnNameError
|
|
77
|
+
When ``labels`` or ``values`` is an empty text.
|
|
78
|
+
EmptyListError
|
|
79
|
+
When ``colors`` is an empty list.
|
|
80
|
+
"""
|
|
81
|
+
require_field_types(self)
|
|
82
|
+
|
|
83
|
+
require_column_name(self.labels)
|
|
84
|
+
require_column_name(self.values)
|
|
85
|
+
|
|
86
|
+
colors_copy = copy_colors(self.colors)
|
|
87
|
+
object.__setattr__(self, "colors", colors_copy)
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart drawing each row as a point.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import math
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
|
|
10
|
+
from numdaplot.errors.conflicting_settings_error import ConflictingSettingsError
|
|
11
|
+
from numdaplot.errors.invalid_opacity_error import InvalidOpacityError
|
|
12
|
+
from numdaplot.errors.invalid_point_size_error import InvalidPointSizeError
|
|
13
|
+
from numdaplot.errors.refused_setting_error import RefusedSettingError
|
|
14
|
+
from numdaplot.plots.charts.chart import Chart
|
|
15
|
+
from numdaplot.plots.charts.color_scale import ColorScale
|
|
16
|
+
from numdaplot.plots.charts.marker_shape import MarkerShape
|
|
17
|
+
from numdaplot.plots.style.color import Color
|
|
18
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
19
|
+
from numdaplot.settings.field_types import require_field_types
|
|
20
|
+
from numdaplot.tables.columns.column_names import require_optional_column_name
|
|
21
|
+
|
|
22
|
+
CHART_NAME = "ScatterChart"
|
|
23
|
+
COLOR_SETTING = "color"
|
|
24
|
+
COLOR_BY_SETTING = "color_by"
|
|
25
|
+
NO_MARKER_NAME = "MarkerShape.NONE"
|
|
26
|
+
POINT_SIZE_SETTING = "point_size"
|
|
27
|
+
SIZE_BY_SETTING = "size_by"
|
|
28
|
+
SCALE_WITHOUT_COLOR_BY = "scale without color_by"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class ScatterChart(Chart):
|
|
33
|
+
"""
|
|
34
|
+
Chart drawing each row as a point, used by ``Plot.scatter``.
|
|
35
|
+
|
|
36
|
+
A row with a missing value in one of the columns used is not drawn. In a dense cloud, a low ``opacity`` shows where
|
|
37
|
+
the points gather, and a small ``point_size`` separates them. The last group drawn stays on top of the others.
|
|
38
|
+
|
|
39
|
+
.. versionadded:: 0.1.0
|
|
40
|
+
|
|
41
|
+
Parameters
|
|
42
|
+
----------
|
|
43
|
+
x
|
|
44
|
+
For a Table, the column of the horizontal positions: numbers, dates, datetimes, times of day, texts or
|
|
45
|
+
booleans, the row numbers when omitted. An Array takes none, its rows being numbered. Times of day are placed
|
|
46
|
+
on an axis of one day labeled ``HH:MM``.
|
|
47
|
+
y
|
|
48
|
+
For a Table, the column of the vertical positions, holding numbers or times of day, the latter on an axis
|
|
49
|
+
labeled ``HH:MM``. A Table needs it. An Array takes none: when omitted, each of its columns is a series of
|
|
50
|
+
points.
|
|
51
|
+
color
|
|
52
|
+
The color of every point, the first color of the default cycle when omitted. With an Array of
|
|
53
|
+
several columns, the series take the colors of the default cycle and ``color`` is refused.
|
|
54
|
+
color_by
|
|
55
|
+
For a Table, the column coloring each point: numbers give a color scale shown next to the axes, texts, booleans
|
|
56
|
+
and times of day give one color per value, named in the legend, times being written ``HH:MM``. Every point
|
|
57
|
+
takes the same color when omitted.
|
|
58
|
+
size_by
|
|
59
|
+
For a Table, the column of numbers sizing each point, from the smallest to the largest value. Every point has
|
|
60
|
+
the same size when omitted.
|
|
61
|
+
marker
|
|
62
|
+
The shape of the points, ``MarkerShape.CIRCLE`` by default.
|
|
63
|
+
opacity
|
|
64
|
+
How opaque the points are, above 0 and up to 1, ``1.0`` by default. The legend and the color scale stay opaque.
|
|
65
|
+
point_size
|
|
66
|
+
The diameter of every point, in typographic points, 6 when omitted.
|
|
67
|
+
scale
|
|
68
|
+
The colors of a ``color_by`` column of numbers, ``ColorScale.VIRIDIS`` when omitted. It needs such a column.
|
|
69
|
+
``BLUES``, ``REDS``, ``GREENS`` and ``GRAYS`` skip their lightest colors, so that every point stays visible.
|
|
70
|
+
``RED_BLUE`` keeps white for 0, so the points close to 0 stay pale.
|
|
71
|
+
|
|
72
|
+
Raises
|
|
73
|
+
------
|
|
74
|
+
InvalidTypeError
|
|
75
|
+
When a setting is not of the type its annotation names.
|
|
76
|
+
InvalidColumnNameError
|
|
77
|
+
When ``x``, ``y``, ``color_by`` or ``size_by`` is an empty text.
|
|
78
|
+
ConflictingSettingsError
|
|
79
|
+
When ``color`` and ``color_by`` are both given, or ``point_size`` and ``size_by``.
|
|
80
|
+
RefusedSettingError
|
|
81
|
+
When ``marker`` is ``MarkerShape.NONE``, which would draw nothing, or ``scale`` is given without ``color_by``.
|
|
82
|
+
InvalidOpacityError
|
|
83
|
+
When ``opacity`` is 0 or lower, greater than 1, or not a number.
|
|
84
|
+
InvalidPointSizeError
|
|
85
|
+
When ``point_size`` is 0 or lower, infinite, or not a number.
|
|
86
|
+
|
|
87
|
+
Examples
|
|
88
|
+
--------
|
|
89
|
+
>>> import numdaplot as ndp
|
|
90
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0, 52.0])
|
|
91
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0, 190.0])
|
|
92
|
+
>>> cities = ndp.Array.from_list(["Paris", "Paris", "Lyon", "Lyon", "Pau"])
|
|
93
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices, "city": cities})
|
|
94
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", color_by="city", size_by="surface")
|
|
95
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
96
|
+
>>> plot.show()
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
x: str | None = None
|
|
100
|
+
y: str | None = None
|
|
101
|
+
color: Color | CustomColor | None = None
|
|
102
|
+
color_by: str | None = None
|
|
103
|
+
size_by: str | None = None
|
|
104
|
+
marker: MarkerShape = MarkerShape.CIRCLE
|
|
105
|
+
opacity: float = 1.0
|
|
106
|
+
point_size: float | None = None
|
|
107
|
+
scale: ColorScale | None = None
|
|
108
|
+
|
|
109
|
+
def __post_init__(self) -> None:
|
|
110
|
+
"""
|
|
111
|
+
Check that the color and the size settings exclude each other, and that the points can be drawn.
|
|
112
|
+
|
|
113
|
+
.. versionadded:: 0.1.0
|
|
114
|
+
|
|
115
|
+
Raises
|
|
116
|
+
------
|
|
117
|
+
InvalidTypeError
|
|
118
|
+
When a setting is not of the type its annotation names.
|
|
119
|
+
InvalidColumnNameError
|
|
120
|
+
When ``x``, ``y``, ``color_by`` or ``size_by`` is an empty text.
|
|
121
|
+
ConflictingSettingsError
|
|
122
|
+
When ``color`` and ``color_by`` are both given, or ``point_size`` and ``size_by``.
|
|
123
|
+
RefusedSettingError
|
|
124
|
+
When ``marker`` is ``MarkerShape.NONE``, or ``scale`` is given without ``color_by``.
|
|
125
|
+
InvalidOpacityError
|
|
126
|
+
When ``opacity`` is 0 or lower, greater than 1, or not a number.
|
|
127
|
+
InvalidPointSizeError
|
|
128
|
+
When ``point_size`` is 0 or lower, infinite, or not a number.
|
|
129
|
+
"""
|
|
130
|
+
require_field_types(self)
|
|
131
|
+
|
|
132
|
+
require_optional_column_name(self.x)
|
|
133
|
+
require_optional_column_name(self.y)
|
|
134
|
+
require_optional_column_name(self.color_by)
|
|
135
|
+
require_optional_column_name(self.size_by)
|
|
136
|
+
|
|
137
|
+
has_both_colors = self.color is not None and self.color_by is not None
|
|
138
|
+
if has_both_colors:
|
|
139
|
+
raise ConflictingSettingsError(COLOR_SETTING, COLOR_BY_SETTING)
|
|
140
|
+
|
|
141
|
+
if self.marker == MarkerShape.NONE:
|
|
142
|
+
raise RefusedSettingError(NO_MARKER_NAME, CHART_NAME)
|
|
143
|
+
|
|
144
|
+
has_scale_alone = self.scale is not None and self.color_by is None
|
|
145
|
+
if has_scale_alone:
|
|
146
|
+
raise RefusedSettingError(SCALE_WITHOUT_COLOR_BY, CHART_NAME)
|
|
147
|
+
|
|
148
|
+
has_both_sizes = self.point_size is not None and self.size_by is not None
|
|
149
|
+
if has_both_sizes:
|
|
150
|
+
raise ConflictingSettingsError(POINT_SIZE_SETTING, SIZE_BY_SETTING)
|
|
151
|
+
|
|
152
|
+
is_drawable_opacity = 0 < self.opacity <= 1
|
|
153
|
+
if not is_drawable_opacity:
|
|
154
|
+
raise InvalidOpacityError(self.opacity)
|
|
155
|
+
|
|
156
|
+
if self.point_size is not None:
|
|
157
|
+
is_drawable_size = 0 < self.point_size < math.inf
|
|
158
|
+
if not is_drawable_size:
|
|
159
|
+
raise InvalidPointSizeError(self.point_size)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Vertical axis a chart added to a Plot is measured on.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ValueAxis(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Vertical axis a chart added to a Plot with ``add_line``, ``add_bar`` or ``add_scatter`` is measured on.
|
|
13
|
+
|
|
14
|
+
A chart on the right axis gets its own scale, so values of different sizes, such as a number of sales and
|
|
15
|
+
a price, can share a Plot.
|
|
16
|
+
|
|
17
|
+
.. versionadded:: 0.1.0
|
|
18
|
+
|
|
19
|
+
Examples
|
|
20
|
+
--------
|
|
21
|
+
>>> import numdaplot as ndp
|
|
22
|
+
>>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
|
|
23
|
+
>>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
|
|
24
|
+
>>> prices = ndp.Array.from_list([12.5, 11.0, 14.0, 10.5])
|
|
25
|
+
>>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "price": prices})
|
|
26
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
|
|
27
|
+
>>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]), style)
|
|
28
|
+
>>> line = ndp.LineChart(x="month", y=["price"], marker=ndp.MarkerShape.CIRCLE)
|
|
29
|
+
>>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.RIGHT)
|
|
30
|
+
>>> both.show()
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
LEFT = auto()
|
|
34
|
+
"""
|
|
35
|
+
The axis on the left, shared with the first chart of the Plot. Default value.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
|
|
41
|
+
>>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
|
|
42
|
+
>>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 140.0])
|
|
43
|
+
>>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
|
|
44
|
+
>>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]))
|
|
45
|
+
>>> line = ndp.LineChart(x="month", y=["target"], line=ndp.LineType.DASHED)
|
|
46
|
+
>>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.LEFT)
|
|
47
|
+
>>> both.show()
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
RIGHT = auto()
|
|
51
|
+
"""
|
|
52
|
+
A second axis on the right, with its own scale and label.
|
|
53
|
+
|
|
54
|
+
Examples
|
|
55
|
+
--------
|
|
56
|
+
>>> import numdaplot as ndp
|
|
57
|
+
>>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
|
|
58
|
+
>>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
|
|
59
|
+
>>> prices = ndp.Array.from_list([12.5, 11.0, 14.0, 10.5])
|
|
60
|
+
>>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "price": prices})
|
|
61
|
+
>>> style = ndp.PlotStyle(y_label="Sales", right_label="Price (euros)", legend=ndp.LegendPosition.UPPER_LEFT)
|
|
62
|
+
>>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]), style)
|
|
63
|
+
>>> line = ndp.LineChart(x="month", y=["price"], marker=ndp.MarkerShape.CIRCLE)
|
|
64
|
+
>>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.RIGHT)
|
|
65
|
+
>>> both.show()
|
|
66
|
+
"""
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values a chart draws from the columns of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
import numpy
|
|
10
|
+
from numpy.typing import NDArray
|
|
11
|
+
|
|
12
|
+
from numdaplot.arrays.array import Array
|
|
13
|
+
from numdaplot.arrays.array_data import read_stored_values
|
|
14
|
+
from numdaplot.arrays.operations.type_requirements import require_family
|
|
15
|
+
from numdaplot.data_types.numpy_mapping import from_numpy_dtype
|
|
16
|
+
from numdaplot.data_types.type import Type
|
|
17
|
+
from numdaplot.data_types.value_family import ValueFamily, find_family
|
|
18
|
+
from numdaplot.errors.dimension_error import DimensionError
|
|
19
|
+
from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
|
|
20
|
+
from numdaplot.plots.data.column_reading import count_hours, find_value_families
|
|
21
|
+
from numdaplot.plots.data.position_kind import PositionKind
|
|
22
|
+
|
|
23
|
+
ONE_DIMENSION = 1
|
|
24
|
+
TWO_DIMENSIONS = 2
|
|
25
|
+
FLOAT_DTYPE = numpy.dtype(numpy.float64)
|
|
26
|
+
VALUE_LABEL = "Value"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def read_array_values(array: Array, chart_name: str) -> ChartValues:
|
|
30
|
+
"""
|
|
31
|
+
Return the positions and the series a chart draws from an Array of numbers or times of day.
|
|
32
|
+
|
|
33
|
+
Only a chart measuring times of day accepts them. Each column is a series named after its number, and each row
|
|
34
|
+
is placed at its number.
|
|
35
|
+
A one-dimensional Array is a single column.
|
|
36
|
+
|
|
37
|
+
.. versionadded:: 0.1.0
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
array
|
|
42
|
+
An Array of numbers or times of day, of one or two dimensions.
|
|
43
|
+
chart_name
|
|
44
|
+
Name of the chart class, shown in error messages.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
ChartValues
|
|
49
|
+
The row numbers as positions, and one series per column.
|
|
50
|
+
|
|
51
|
+
Raises
|
|
52
|
+
------
|
|
53
|
+
IncompatibleTypesError
|
|
54
|
+
When the Array holds neither numbers nor times of day for a chart measuring them.
|
|
55
|
+
DimensionError
|
|
56
|
+
When the Array has more than two dimensions.
|
|
57
|
+
|
|
58
|
+
Examples
|
|
59
|
+
--------
|
|
60
|
+
>>> import numdaplot as ndp
|
|
61
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
62
|
+
>>> grid = ndp.Array.from_list([[1, 2], [3, 4]])
|
|
63
|
+
>>> read_array_values(grid, "LineChart").series[1].values
|
|
64
|
+
array([2., 4.])
|
|
65
|
+
"""
|
|
66
|
+
values = read_stored_values(array)
|
|
67
|
+
value_families = find_value_families(chart_name)
|
|
68
|
+
require_family(values, value_families, chart_name)
|
|
69
|
+
dimension_count = values.ndim
|
|
70
|
+
if dimension_count > TWO_DIMENSIONS:
|
|
71
|
+
raise DimensionError(chart_name, dimension_count)
|
|
72
|
+
|
|
73
|
+
if dimension_count == ONE_DIMENSION:
|
|
74
|
+
values = values.reshape(-1, 1)
|
|
75
|
+
|
|
76
|
+
value_type = from_numpy_dtype(values.dtype)
|
|
77
|
+
numbers = read_array_numbers(values, value_type)
|
|
78
|
+
row_count, column_count = values.shape
|
|
79
|
+
rows = numpy.arange(row_count)
|
|
80
|
+
row_numbers = rows.astype(FLOAT_DTYPE)
|
|
81
|
+
positions = Positions(PositionKind.NUMBERS, row_numbers, None)
|
|
82
|
+
series = list[Series]()
|
|
83
|
+
|
|
84
|
+
for i in range(column_count):
|
|
85
|
+
column_name = str(i)
|
|
86
|
+
column_numbers = numbers[:, i]
|
|
87
|
+
column_series = Series(column_name, column_numbers)
|
|
88
|
+
series.append(column_series)
|
|
89
|
+
|
|
90
|
+
chart_values = ChartValues(positions, series, rows, VALUE_LABEL, value_type)
|
|
91
|
+
|
|
92
|
+
return chart_values
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def read_array_numbers(values: NDArray[Any], value_type: Type) -> NDArray[numpy.float64]:
|
|
96
|
+
"""
|
|
97
|
+
Return the values of an Array as float64 numbers, a time of day being its hours since midnight.
|
|
98
|
+
|
|
99
|
+
.. versionadded:: 0.1.0
|
|
100
|
+
|
|
101
|
+
Parameters
|
|
102
|
+
----------
|
|
103
|
+
values
|
|
104
|
+
The stored values of an Array of numbers or times of day.
|
|
105
|
+
value_type
|
|
106
|
+
The type of the values.
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
NDArray[numpy.float64]
|
|
111
|
+
The numbers, of the same shape, NaN where a time of day is missing.
|
|
112
|
+
|
|
113
|
+
Examples
|
|
114
|
+
--------
|
|
115
|
+
>>> import numpy
|
|
116
|
+
>>> import numdaplot as ndp
|
|
117
|
+
>>> from numdaplot.plots.data.array_values import read_array_numbers
|
|
118
|
+
>>> read_array_numbers(numpy.array([5400000000], dtype="timedelta64[us]"), ndp.Type.TIME)
|
|
119
|
+
array([1.5])
|
|
120
|
+
"""
|
|
121
|
+
value_family = find_family(value_type)
|
|
122
|
+
if value_family == ValueFamily.TIME:
|
|
123
|
+
hours = count_hours(values)
|
|
124
|
+
return hours
|
|
125
|
+
|
|
126
|
+
numbers = values.astype(FLOAT_DTYPE)
|
|
127
|
+
|
|
128
|
+
return numbers
|