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,147 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Color scales of a HeatmapChart and of a ScatterChart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ColorScale(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Color scales of a ``HeatmapChart`` and of a ``ScatterChart``, from the smallest value to the largest one.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
20
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
21
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
22
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
23
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
24
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.BLUES)
|
|
25
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
26
|
+
>>> plot.show()
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
VIRIDIS = auto()
|
|
30
|
+
"""
|
|
31
|
+
From dark purple for the smallest values to yellow for the largest. Default value.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
37
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
38
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
39
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
40
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
41
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.VIRIDIS)
|
|
42
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
43
|
+
>>> plot.show()
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
BLUES = auto()
|
|
47
|
+
"""
|
|
48
|
+
From white for the smallest values to dark blue for the largest.
|
|
49
|
+
|
|
50
|
+
Examples
|
|
51
|
+
--------
|
|
52
|
+
>>> import numdaplot as ndp
|
|
53
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
54
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
55
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
56
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
57
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
58
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.BLUES)
|
|
59
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
60
|
+
>>> plot.show()
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
REDS = auto()
|
|
64
|
+
"""
|
|
65
|
+
From white for the smallest values to dark red for the largest.
|
|
66
|
+
|
|
67
|
+
Examples
|
|
68
|
+
--------
|
|
69
|
+
>>> import numdaplot as ndp
|
|
70
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
71
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
72
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
73
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
74
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
75
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.REDS)
|
|
76
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
77
|
+
>>> plot.show()
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
RED_BLUE = auto()
|
|
81
|
+
"""
|
|
82
|
+
From blue for the smallest values to red for the largest, through white. When the values are on both
|
|
83
|
+
sides of 0, the scale is centered on 0, so white means 0.
|
|
84
|
+
|
|
85
|
+
Examples
|
|
86
|
+
--------
|
|
87
|
+
>>> import numdaplot as ndp
|
|
88
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
89
|
+
>>> january = ndp.Array.from_list([1.5, -2.0, 0.5])
|
|
90
|
+
>>> february = ndp.Array.from_list([-0.5, 1.0, 2.5])
|
|
91
|
+
>>> march = ndp.Array.from_list([-3.0, 0.5, 1.0])
|
|
92
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
93
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.RED_BLUE)
|
|
94
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
95
|
+
>>> plot.show()
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
GREENS = auto()
|
|
99
|
+
"""
|
|
100
|
+
From white for the smallest values to dark green for the largest.
|
|
101
|
+
|
|
102
|
+
Examples
|
|
103
|
+
--------
|
|
104
|
+
>>> import numdaplot as ndp
|
|
105
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
106
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
107
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
108
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
109
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
110
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.GREENS)
|
|
111
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
112
|
+
>>> plot.show()
|
|
113
|
+
"""
|
|
114
|
+
|
|
115
|
+
GRAYS = auto()
|
|
116
|
+
"""
|
|
117
|
+
From white for the smallest values to black for the largest, for a printing in black and white.
|
|
118
|
+
|
|
119
|
+
Examples
|
|
120
|
+
--------
|
|
121
|
+
>>> import numdaplot as ndp
|
|
122
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
123
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
124
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
125
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
126
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
127
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.GRAYS)
|
|
128
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
129
|
+
>>> plot.show()
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
CIVIDIS = auto()
|
|
133
|
+
"""
|
|
134
|
+
From dark blue for the smallest values to yellow for the largest, readable with most forms of color blindness.
|
|
135
|
+
|
|
136
|
+
Examples
|
|
137
|
+
--------
|
|
138
|
+
>>> import numdaplot as ndp
|
|
139
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
140
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
141
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
142
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
143
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
144
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", scale=ndp.ColorScale.CIVIDIS)
|
|
145
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
146
|
+
>>> plot.show()
|
|
147
|
+
"""
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart coloring each value of a grid of numbers.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.plots.charts.cell_values import CellValues
|
|
10
|
+
from numdaplot.plots.charts.chart import Chart
|
|
11
|
+
from numdaplot.plots.charts.chart_settings import copy_columns
|
|
12
|
+
from numdaplot.plots.charts.color_scale import ColorScale
|
|
13
|
+
from numdaplot.settings.field_types import require_field_types
|
|
14
|
+
from numdaplot.tables.columns.column_names import require_optional_column_name
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class HeatmapChart(Chart):
|
|
19
|
+
"""
|
|
20
|
+
Chart drawing each value as a cell colored along a color scale, used by ``Plot.heatmap``.
|
|
21
|
+
|
|
22
|
+
The columns are side by side and the rows go down from the first one. A color bar next to the cells shows
|
|
23
|
+
the scale. A missing value leaves its cell light gray.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
columns
|
|
30
|
+
For a Table, the columns drawn, holding numbers. A Table needs it, even for a single column. An Array of one or
|
|
31
|
+
two dimensions takes none: when omitted, each of its columns is drawn.
|
|
32
|
+
labels
|
|
33
|
+
For a Table, the column labeling the rows: numbers, dates, datetimes, times of day (labeled ``HH:MM``), texts or
|
|
34
|
+
booleans, the row numbers when omitted. A row whose label text is missing is left out. An Array takes none, its
|
|
35
|
+
rows being numbered.
|
|
36
|
+
scale
|
|
37
|
+
The colors of the cells, ``ColorScale.VIRIDIS`` by default.
|
|
38
|
+
values
|
|
39
|
+
Whether each cell shows its value, ``CellValues.HIDDEN`` by default.
|
|
40
|
+
|
|
41
|
+
Raises
|
|
42
|
+
------
|
|
43
|
+
InvalidTypeError
|
|
44
|
+
When a setting is not of the type its annotation names.
|
|
45
|
+
InvalidColumnNameError
|
|
46
|
+
When ``labels`` or a name in ``columns`` is an empty text.
|
|
47
|
+
EmptyListError
|
|
48
|
+
When ``columns`` is an empty list.
|
|
49
|
+
DuplicateColumnError
|
|
50
|
+
When a column name appears twice in ``columns``.
|
|
51
|
+
|
|
52
|
+
Examples
|
|
53
|
+
--------
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
|
|
56
|
+
>>> january = ndp.Array.from_list([5.5, 3.0, 8.0])
|
|
57
|
+
>>> february = ndp.Array.from_list([6.0, 4.5, 9.0])
|
|
58
|
+
>>> march = ndp.Array.from_list([9.5, 8.0, 11.5])
|
|
59
|
+
>>> temperatures = ndp.Table.from_arrays({"city": cities, "jan": january, "feb": february, "mar": march})
|
|
60
|
+
>>> chart = ndp.HeatmapChart(columns=["jan", "feb", "mar"], labels="city", values=ndp.CellValues.SHOWN)
|
|
61
|
+
>>> plot = ndp.Plot.heatmap(temperatures, chart)
|
|
62
|
+
>>> plot.show()
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
columns: list[str] | None = None
|
|
66
|
+
labels: str | None = None
|
|
67
|
+
scale: ColorScale = ColorScale.VIRIDIS
|
|
68
|
+
values: CellValues = CellValues.HIDDEN
|
|
69
|
+
|
|
70
|
+
def __post_init__(self) -> None:
|
|
71
|
+
"""
|
|
72
|
+
Check the columns and replace them with a copy that only the chart holds.
|
|
73
|
+
|
|
74
|
+
.. versionadded:: 0.1.0
|
|
75
|
+
|
|
76
|
+
Raises
|
|
77
|
+
------
|
|
78
|
+
InvalidTypeError
|
|
79
|
+
When a setting is not of the type its annotation names.
|
|
80
|
+
InvalidColumnNameError
|
|
81
|
+
When ``labels`` or a name in ``columns`` is an empty text.
|
|
82
|
+
EmptyListError
|
|
83
|
+
When ``columns`` is an empty list.
|
|
84
|
+
DuplicateColumnError
|
|
85
|
+
When a column name appears twice in ``columns``.
|
|
86
|
+
"""
|
|
87
|
+
require_field_types(self)
|
|
88
|
+
|
|
89
|
+
require_optional_column_name(self.labels)
|
|
90
|
+
|
|
91
|
+
columns_copy = copy_columns(self.columns)
|
|
92
|
+
object.__setattr__(self, "columns", columns_copy)
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart counting the values of each bin.
|
|
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.bin_count import BinCount
|
|
11
|
+
from numdaplot.plots.charts.bin_width import BinWidth
|
|
12
|
+
from numdaplot.plots.charts.chart import Chart
|
|
13
|
+
from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
|
|
14
|
+
from numdaplot.plots.style.color import Color
|
|
15
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
16
|
+
from numdaplot.ratios.measure import Measure
|
|
17
|
+
from numdaplot.settings.field_types import require_field_types
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class HistogramChart(Chart):
|
|
22
|
+
"""
|
|
23
|
+
Chart drawing how many values of each column fall in each bin, used by ``Plot.histogram``.
|
|
24
|
+
|
|
25
|
+
Several columns share the same bins and are drawn over each other, half transparent. Missing values are
|
|
26
|
+
left out.
|
|
27
|
+
|
|
28
|
+
.. versionadded:: 0.1.0
|
|
29
|
+
|
|
30
|
+
Parameters
|
|
31
|
+
----------
|
|
32
|
+
columns
|
|
33
|
+
For a Table, the columns drawn, holding numbers or times of day, not both. A Table needs it, even for a
|
|
34
|
+
single column. An Array takes none: when omitted, each of its columns is drawn.
|
|
35
|
+
bins
|
|
36
|
+
The bins, ``BinCount(10)`` for numbers and one bin per hour from 00:00 to 24:00 for times of day when
|
|
37
|
+
omitted, or ``BinWidth`` for bins of a given width: a number for numbers, a duration for times of day.
|
|
38
|
+
measure
|
|
39
|
+
``Measure.COUNT`` by default for the number of values of each bin, ``Measure.RATIO`` for their share
|
|
40
|
+
of the values of the column.
|
|
41
|
+
colors
|
|
42
|
+
One color per column, the colors of the default cycle when omitted. The chart keeps its own list.
|
|
43
|
+
|
|
44
|
+
Raises
|
|
45
|
+
------
|
|
46
|
+
InvalidTypeError
|
|
47
|
+
When a setting is not of the type its annotation names.
|
|
48
|
+
InvalidColumnNameError
|
|
49
|
+
When a name in ``columns`` is an empty text.
|
|
50
|
+
EmptyListError
|
|
51
|
+
When ``columns`` or ``colors`` is an empty list.
|
|
52
|
+
DuplicateColumnError
|
|
53
|
+
When a column name appears twice in ``columns``.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import numdaplot as ndp
|
|
58
|
+
>>> prices_2025 = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 15.0])
|
|
59
|
+
>>> prices_2026 = ndp.Array.from_list([14.0, 17.5, 16.0, 19.0, 15.5, 18.0, 16.5, 17.0])
|
|
60
|
+
>>> prices = ndp.Table.from_arrays({"2025": prices_2025, "2026": prices_2026})
|
|
61
|
+
>>> chart = ndp.HistogramChart(columns=["2025", "2026"], bins=ndp.BinWidth(1.0))
|
|
62
|
+
>>> plot = ndp.Plot.histogram(prices, chart)
|
|
63
|
+
>>> plot.show()
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
columns: list[str] | None = None
|
|
67
|
+
bins: BinCount | BinWidth | None = None
|
|
68
|
+
measure: Measure = Measure.COUNT
|
|
69
|
+
colors: Sequence[Color | CustomColor] | None = None
|
|
70
|
+
|
|
71
|
+
def __post_init__(self) -> None:
|
|
72
|
+
"""
|
|
73
|
+
Check the columns and the colors and replace them with copies that only the chart holds.
|
|
74
|
+
|
|
75
|
+
.. versionadded:: 0.1.0
|
|
76
|
+
|
|
77
|
+
Raises
|
|
78
|
+
------
|
|
79
|
+
InvalidTypeError
|
|
80
|
+
When a setting is not of the type its annotation names.
|
|
81
|
+
InvalidColumnNameError
|
|
82
|
+
When a name in ``columns`` is an empty text.
|
|
83
|
+
EmptyListError
|
|
84
|
+
When ``columns`` or ``colors`` is an empty list.
|
|
85
|
+
DuplicateColumnError
|
|
86
|
+
When a column name appears twice in ``columns``.
|
|
87
|
+
"""
|
|
88
|
+
require_field_types(self)
|
|
89
|
+
|
|
90
|
+
columns_copy = copy_columns(self.columns)
|
|
91
|
+
colors_copy = copy_colors(self.colors)
|
|
92
|
+
object.__setattr__(self, "columns", columns_copy)
|
|
93
|
+
object.__setattr__(self, "colors", colors_copy)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart drawing each series as a line.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
|
|
10
|
+
from numdaplot.plots.charts.chart import Chart
|
|
11
|
+
from numdaplot.plots.charts.chart_settings import copy_colors, copy_columns
|
|
12
|
+
from numdaplot.plots.charts.line_type import LineType
|
|
13
|
+
from numdaplot.plots.charts.marker_shape import MarkerShape
|
|
14
|
+
from numdaplot.plots.style.color import Color
|
|
15
|
+
from numdaplot.plots.style.custom_color import CustomColor
|
|
16
|
+
from numdaplot.settings.field_types import require_field_types
|
|
17
|
+
from numdaplot.tables.columns.column_names import require_optional_column_name
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class LineChart(Chart):
|
|
22
|
+
"""
|
|
23
|
+
Chart drawing each series as a line joining its values, used by ``Plot.line``.
|
|
24
|
+
|
|
25
|
+
A missing value breaks the line, which starts again at the next present value.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
x
|
|
32
|
+
For a Table, the column of the horizontal positions: numbers, dates, datetimes, times of day, texts or
|
|
33
|
+
booleans, the row numbers when omitted. An Array takes none, its rows being numbered. Times of day are placed
|
|
34
|
+
on an axis of one day labeled ``HH:MM``.
|
|
35
|
+
y
|
|
36
|
+
For a Table, the columns drawn, holding numbers or times of day, not both, one line each. A Table needs it,
|
|
37
|
+
even for a single column. An Array takes none: when omitted, each of its columns is a line. Times of day are
|
|
38
|
+
measured on an axis labeled ``HH:MM``.
|
|
39
|
+
colors
|
|
40
|
+
One color per line, the colors of the default cycle when omitted. The chart keeps its own list.
|
|
41
|
+
line
|
|
42
|
+
How the lines are drawn, ``LineType.SOLID`` by default.
|
|
43
|
+
marker
|
|
44
|
+
The shape drawn at each value, ``MarkerShape.NONE`` by default.
|
|
45
|
+
|
|
46
|
+
Raises
|
|
47
|
+
------
|
|
48
|
+
InvalidTypeError
|
|
49
|
+
When a setting is not of the type its annotation names.
|
|
50
|
+
InvalidColumnNameError
|
|
51
|
+
When ``x`` or a name in ``y`` is an empty text.
|
|
52
|
+
EmptyListError
|
|
53
|
+
When ``y`` or ``colors`` is an empty list.
|
|
54
|
+
DuplicateColumnError
|
|
55
|
+
When a column name appears twice in ``y``.
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> import numdaplot as ndp
|
|
60
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
61
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
62
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, None, 10.0])
|
|
63
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
64
|
+
>>> colors = [ndp.Color.BLUE, ndp.CustomColor("#ff8800")]
|
|
65
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"], colors=colors, marker=ndp.MarkerShape.CIRCLE)
|
|
66
|
+
>>> plot = ndp.Plot.line(sales, chart)
|
|
67
|
+
>>> plot.show()
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
x: str | None = None
|
|
71
|
+
y: list[str] | None = None
|
|
72
|
+
colors: Sequence[Color | CustomColor] | None = None
|
|
73
|
+
line: LineType = LineType.SOLID
|
|
74
|
+
marker: MarkerShape = MarkerShape.NONE
|
|
75
|
+
|
|
76
|
+
def __post_init__(self) -> None:
|
|
77
|
+
"""
|
|
78
|
+
Check the columns and the colors and replace them with copies that only the chart holds.
|
|
79
|
+
|
|
80
|
+
.. versionadded:: 0.1.0
|
|
81
|
+
|
|
82
|
+
Raises
|
|
83
|
+
------
|
|
84
|
+
InvalidTypeError
|
|
85
|
+
When a setting is not of the type its annotation names.
|
|
86
|
+
InvalidColumnNameError
|
|
87
|
+
When ``x`` or a name in ``y`` is an empty text.
|
|
88
|
+
EmptyListError
|
|
89
|
+
When ``y`` or ``colors`` is an empty list.
|
|
90
|
+
DuplicateColumnError
|
|
91
|
+
When a column name appears twice in ``y``.
|
|
92
|
+
"""
|
|
93
|
+
require_field_types(self)
|
|
94
|
+
|
|
95
|
+
require_optional_column_name(self.x)
|
|
96
|
+
|
|
97
|
+
columns_copy = copy_columns(self.y)
|
|
98
|
+
colors_copy = copy_colors(self.colors)
|
|
99
|
+
object.__setattr__(self, "y", columns_copy)
|
|
100
|
+
object.__setattr__(self, "colors", colors_copy)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""
|
|
2
|
+
How the lines of a LineChart are drawn.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LineType(Enum):
|
|
11
|
+
"""
|
|
12
|
+
How the lines of a ``LineChart`` are drawn.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
20
|
+
>>> chart = ndp.LineChart(line=ndp.LineType.DASHED)
|
|
21
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
22
|
+
>>> plot.show()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
SOLID = auto()
|
|
26
|
+
"""
|
|
27
|
+
A continuous line. Default value.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
33
|
+
>>> chart = ndp.LineChart(line=ndp.LineType.SOLID)
|
|
34
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
35
|
+
>>> plot.show()
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
DASHED = auto()
|
|
39
|
+
"""
|
|
40
|
+
A line of dashes.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
46
|
+
>>> chart = ndp.LineChart(line=ndp.LineType.DASHED)
|
|
47
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
48
|
+
>>> plot.show()
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
DOTTED = auto()
|
|
52
|
+
"""
|
|
53
|
+
A line of dots.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import numdaplot as ndp
|
|
58
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
59
|
+
>>> chart = ndp.LineChart(line=ndp.LineType.DOTTED)
|
|
60
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
61
|
+
>>> plot.show()
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
DASH_DOT = auto()
|
|
65
|
+
"""
|
|
66
|
+
A line of dashes and dots in turn.
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> import numdaplot as ndp
|
|
71
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
72
|
+
>>> chart = ndp.LineChart(line=ndp.LineType.DASH_DOT)
|
|
73
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
74
|
+
>>> plot.show()
|
|
75
|
+
"""
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shapes drawn at the values of a chart.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MarkerShape(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Shapes drawn at the values of a ``LineChart`` or a ``ScatterChart``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
20
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
21
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
22
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.SQUARE)
|
|
23
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
24
|
+
>>> plot.show()
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
NONE = auto()
|
|
28
|
+
"""
|
|
29
|
+
No marker, only the line. Default value of ``LineChart``, refused by ``ScatterChart``.
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> import numdaplot as ndp
|
|
34
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
35
|
+
>>> chart = ndp.LineChart(marker=ndp.MarkerShape.NONE)
|
|
36
|
+
>>> plot = ndp.Plot.line(prices, chart)
|
|
37
|
+
>>> plot.show()
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
CIRCLE = auto()
|
|
41
|
+
"""
|
|
42
|
+
A disc. Default value of ``ScatterChart``.
|
|
43
|
+
|
|
44
|
+
Examples
|
|
45
|
+
--------
|
|
46
|
+
>>> import numdaplot as ndp
|
|
47
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
48
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
49
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
50
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.CIRCLE)
|
|
51
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
52
|
+
>>> plot.show()
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
SQUARE = auto()
|
|
56
|
+
"""
|
|
57
|
+
A square.
|
|
58
|
+
|
|
59
|
+
Examples
|
|
60
|
+
--------
|
|
61
|
+
>>> import numdaplot as ndp
|
|
62
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
63
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
64
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
65
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.SQUARE)
|
|
66
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
67
|
+
>>> plot.show()
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
TRIANGLE = auto()
|
|
71
|
+
"""
|
|
72
|
+
A triangle pointing up.
|
|
73
|
+
|
|
74
|
+
Examples
|
|
75
|
+
--------
|
|
76
|
+
>>> import numdaplot as ndp
|
|
77
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
78
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
79
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
80
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.TRIANGLE)
|
|
81
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
82
|
+
>>> plot.show()
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
CROSS = auto()
|
|
86
|
+
"""
|
|
87
|
+
A cross made of two diagonal strokes.
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
--------
|
|
91
|
+
>>> import numdaplot as ndp
|
|
92
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
93
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
94
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
95
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.CROSS)
|
|
96
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
97
|
+
>>> plot.show()
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
DIAMOND = auto()
|
|
101
|
+
"""
|
|
102
|
+
A diamond.
|
|
103
|
+
|
|
104
|
+
Examples
|
|
105
|
+
--------
|
|
106
|
+
>>> import numdaplot as ndp
|
|
107
|
+
>>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0])
|
|
108
|
+
>>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0])
|
|
109
|
+
>>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices})
|
|
110
|
+
>>> chart = ndp.ScatterChart(x="surface", y="price", marker=ndp.MarkerShape.DIAMOND)
|
|
111
|
+
>>> plot = ndp.Plot.scatter(flats, chart)
|
|
112
|
+
>>> plot.show()
|
|
113
|
+
"""
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Chart drawing the missing values of each column of a Table as bars.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.plots.charts.chart import Chart
|
|
10
|
+
from numdaplot.ratios.measure import Measure
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class MissingChart(Chart):
|
|
16
|
+
"""
|
|
17
|
+
Chart drawing one bar per column of a Table, as high as its missing values, used by ``Plot.missing_by_column``.
|
|
18
|
+
|
|
19
|
+
Every column has its bar, even without missing value.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
measure
|
|
26
|
+
``Measure.COUNT`` by default for the number of missing values of each column, ``Measure.RATIO`` for their
|
|
27
|
+
share, on an axis from 0 to 1.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Nice", "Pau"])
|
|
39
|
+
>>> prices = ndp.Array.from_list([12.0, None, None, 15.5])
|
|
40
|
+
>>> rooms = ndp.Array.from_list([2, 3, 1, 4])
|
|
41
|
+
>>> flats = ndp.Table.from_arrays({"city": cities, "price": prices, "rooms": rooms})
|
|
42
|
+
>>> chart = ndp.MissingChart(measure=ndp.Measure.RATIO)
|
|
43
|
+
>>> plot = ndp.Plot.missing_by_column(flats, chart)
|
|
44
|
+
>>> plot.show()
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
measure: Measure = Measure.COUNT
|
|
48
|
+
|
|
49
|
+
def __post_init__(self) -> None:
|
|
50
|
+
"""
|
|
51
|
+
Check the type of every setting.
|
|
52
|
+
|
|
53
|
+
.. versionadded:: 0.1.0
|
|
54
|
+
|
|
55
|
+
Raises
|
|
56
|
+
------
|
|
57
|
+
InvalidTypeError
|
|
58
|
+
When a setting is not of the type its annotation names.
|
|
59
|
+
"""
|
|
60
|
+
require_field_types(self)
|