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,83 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Kinds of values a chart places along its ``x`` axis.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PositionKind(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Kinds of values a chart places along its ``x`` axis, each drawn with its own kind of axis.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
20
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
21
|
+
>>> read_array_values(prices, "LineChart").positions.kind
|
|
22
|
+
<PositionKind.NUMBERS: 1>
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
NUMBERS = auto()
|
|
26
|
+
"""
|
|
27
|
+
Numbers, placed on a numbered axis.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
33
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
34
|
+
>>> read_array_values(prices, "LineChart").positions.kind
|
|
35
|
+
<PositionKind.NUMBERS: 1>
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
MOMENTS = auto()
|
|
39
|
+
"""
|
|
40
|
+
Dates or datetimes, placed on a time axis.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> from datetime import date
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
47
|
+
>>> days = ndp.Array.from_list([date(2026, 1, 1), date(2026, 1, 2)])
|
|
48
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
49
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
|
|
50
|
+
>>> read_table_values(sales, "day", ["price"], "LineChart").positions.kind
|
|
51
|
+
<PositionKind.MOMENTS: 2>
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
TEXTS = auto()
|
|
55
|
+
"""
|
|
56
|
+
Texts, each placed at its own position labeled with it.
|
|
57
|
+
|
|
58
|
+
Examples
|
|
59
|
+
--------
|
|
60
|
+
>>> import numdaplot as ndp
|
|
61
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
62
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon"])
|
|
63
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
64
|
+
>>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
65
|
+
>>> read_table_values(sales, "city", ["price"], "LineChart").positions.kind
|
|
66
|
+
<PositionKind.TEXTS: 3>
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
TIMES = auto()
|
|
70
|
+
"""
|
|
71
|
+
Times of day, placed on an axis of one day labeled ``HH:MM``.
|
|
72
|
+
|
|
73
|
+
Examples
|
|
74
|
+
--------
|
|
75
|
+
>>> from datetime import time
|
|
76
|
+
>>> import numdaplot as ndp
|
|
77
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
78
|
+
>>> hours = ndp.Array.from_list([time(8), time(17, 30)])
|
|
79
|
+
>>> counts = ndp.Array.from_list([12.0, 15.5])
|
|
80
|
+
>>> traffic = ndp.Table.from_arrays({"hour": hours, "count": counts})
|
|
81
|
+
>>> read_table_values(traffic, "hour", ["count"], "LineChart").positions.kind
|
|
82
|
+
<PositionKind.TIMES: 4>
|
|
83
|
+
"""
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Charts of a Plot with their columns shown under new names.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import dataclasses
|
|
8
|
+
from typing import cast
|
|
9
|
+
|
|
10
|
+
import numpy
|
|
11
|
+
|
|
12
|
+
from numdaplot.plots.chart_layer import ChartLayer
|
|
13
|
+
from numdaplot.plots.data.chart_values import ChartValues, Series
|
|
14
|
+
from numdaplot.plots.data.missing_cells import MissingCounts
|
|
15
|
+
from numdaplot.plots.data.point_values import PointValues
|
|
16
|
+
from numdaplot.plots.data.sample_values import SampleValues
|
|
17
|
+
from numdaplot.plots.data.table_values import name_columns
|
|
18
|
+
from numdaplot.tables.columns.renaming import Renaming
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def rename_layers(layers: list[ChartLayer], renaming: Renaming | None) -> list[ChartLayer]:
|
|
22
|
+
"""
|
|
23
|
+
Return the charts of a Plot with their columns shown under their new names.
|
|
24
|
+
|
|
25
|
+
.. versionadded:: 0.1.0
|
|
26
|
+
|
|
27
|
+
Parameters
|
|
28
|
+
----------
|
|
29
|
+
layers
|
|
30
|
+
Every chart of the Plot.
|
|
31
|
+
renaming
|
|
32
|
+
The names under which some columns are shown, or None to keep every name.
|
|
33
|
+
|
|
34
|
+
Returns
|
|
35
|
+
-------
|
|
36
|
+
list[ChartLayer]
|
|
37
|
+
New charts whose names, and the default labels built from them, are the shown names.
|
|
38
|
+
|
|
39
|
+
Examples
|
|
40
|
+
--------
|
|
41
|
+
>>> import numdaplot as ndp
|
|
42
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
43
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
44
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_layers
|
|
45
|
+
>>> grid = ndp.Array.from_list([[12.0, 8.0]])
|
|
46
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_array_values(grid, "LineChart"))
|
|
47
|
+
>>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="0", new_name="Paris")])
|
|
48
|
+
>>> [series.name for series in rename_layers([layer], renaming)[0].values.series]
|
|
49
|
+
['Paris', '1']
|
|
50
|
+
"""
|
|
51
|
+
if renaming is None:
|
|
52
|
+
return layers
|
|
53
|
+
|
|
54
|
+
new_names = {change.old_name: change.new_name for change in renaming.changes}
|
|
55
|
+
renamed_layers = list[ChartLayer]()
|
|
56
|
+
for layer in layers:
|
|
57
|
+
renamed_layer = rename_layer(layer, new_names)
|
|
58
|
+
renamed_layers.append(renamed_layer)
|
|
59
|
+
|
|
60
|
+
return renamed_layers
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def rename_layer(layer: ChartLayer, new_names: dict[str, str]) -> ChartLayer:
|
|
64
|
+
"""
|
|
65
|
+
Return one chart with its columns shown under their new names.
|
|
66
|
+
|
|
67
|
+
.. versionadded:: 0.1.0
|
|
68
|
+
|
|
69
|
+
Parameters
|
|
70
|
+
----------
|
|
71
|
+
layer
|
|
72
|
+
A chart and its values.
|
|
73
|
+
new_names
|
|
74
|
+
The new name of each renamed column.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
ChartLayer
|
|
79
|
+
A new chart, with renamed values and points.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
>>> import numdaplot as ndp
|
|
84
|
+
>>> from numdaplot.plots.chart_layer import ChartLayer
|
|
85
|
+
>>> from numdaplot.plots.data.array_values import read_array_values
|
|
86
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_layer
|
|
87
|
+
>>> layer = ChartLayer(ndp.LineChart(), read_array_values(ndp.Array.from_list([12.0]), "LineChart"))
|
|
88
|
+
>>> rename_layer(layer, {"0": "Paris"}).values.series[0].name
|
|
89
|
+
'Paris'
|
|
90
|
+
"""
|
|
91
|
+
renamed_values = rename_values(layer.values, new_names)
|
|
92
|
+
renamed_points = layer.points
|
|
93
|
+
if layer.points is not None:
|
|
94
|
+
renamed_points = rename_points(layer.points, new_names)
|
|
95
|
+
|
|
96
|
+
renamed_layer = dataclasses.replace(layer, values=renamed_values, points=renamed_points)
|
|
97
|
+
|
|
98
|
+
return renamed_layer
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def rename_values(values: ChartValues | SampleValues, new_names: dict[str, str]) -> ChartValues | SampleValues:
|
|
102
|
+
"""
|
|
103
|
+
Return the values of one chart with their columns shown under their new names.
|
|
104
|
+
|
|
105
|
+
The label of the axis of the values follows when it names the drawn columns.
|
|
106
|
+
|
|
107
|
+
.. versionadded:: 0.1.0
|
|
108
|
+
|
|
109
|
+
Parameters
|
|
110
|
+
----------
|
|
111
|
+
values
|
|
112
|
+
The values of a chart.
|
|
113
|
+
new_names
|
|
114
|
+
The new name of each renamed column.
|
|
115
|
+
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
ChartValues or SampleValues
|
|
119
|
+
New values of the same kind.
|
|
120
|
+
|
|
121
|
+
Examples
|
|
122
|
+
--------
|
|
123
|
+
>>> import numdaplot as ndp
|
|
124
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
125
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_values
|
|
126
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5])
|
|
127
|
+
>>> sales = ndp.Table.from_arrays({"price": prices})
|
|
128
|
+
>>> rename_values(read_table_values(sales, None, ["price"], "LineChart"), {"price": "Price"}).value_name
|
|
129
|
+
'Price'
|
|
130
|
+
"""
|
|
131
|
+
if isinstance(values, MissingCounts):
|
|
132
|
+
renamed_counts = rename_missing_counts(values, new_names)
|
|
133
|
+
return renamed_counts
|
|
134
|
+
|
|
135
|
+
renamed_series = rename_series(values.series, new_names)
|
|
136
|
+
renamed_value_name = rename_value_name(values, renamed_series)
|
|
137
|
+
if isinstance(values, SampleValues):
|
|
138
|
+
renamed_group_name = rename_optional(values.group_name, new_names)
|
|
139
|
+
renamed_samples = dataclasses.replace(
|
|
140
|
+
values, series=renamed_series, group_name=renamed_group_name, value_name=renamed_value_name
|
|
141
|
+
)
|
|
142
|
+
return renamed_samples
|
|
143
|
+
|
|
144
|
+
renamed_position_name = rename_optional(values.positions.name, new_names)
|
|
145
|
+
renamed_positions = dataclasses.replace(values.positions, name=renamed_position_name)
|
|
146
|
+
renamed_chart_values = dataclasses.replace(
|
|
147
|
+
values, positions=renamed_positions, series=renamed_series, value_name=renamed_value_name
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
return renamed_chart_values
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def rename_missing_counts(counts: MissingCounts, new_names: dict[str, str]) -> MissingCounts:
|
|
154
|
+
"""
|
|
155
|
+
Return the counts of a missing value chart with its columns shown under their new names.
|
|
156
|
+
|
|
157
|
+
.. versionadded:: 0.1.0
|
|
158
|
+
|
|
159
|
+
Parameters
|
|
160
|
+
----------
|
|
161
|
+
counts
|
|
162
|
+
The counts, one position per column of the Table.
|
|
163
|
+
new_names
|
|
164
|
+
The new name of each renamed column.
|
|
165
|
+
|
|
166
|
+
Returns
|
|
167
|
+
-------
|
|
168
|
+
MissingCounts
|
|
169
|
+
New counts whose positions are the shown names.
|
|
170
|
+
|
|
171
|
+
Examples
|
|
172
|
+
--------
|
|
173
|
+
>>> import numdaplot as ndp
|
|
174
|
+
>>> from numdaplot.plots.data.missing_cells import read_missing_counts
|
|
175
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_missing_counts
|
|
176
|
+
>>> flats = ndp.Table.from_arrays({"price": ndp.Array.from_list([12.0, None])})
|
|
177
|
+
>>> counts = read_missing_counts(flats, ndp.Measure.COUNT)
|
|
178
|
+
>>> rename_missing_counts(counts, {"price": "Price"}).positions.values.tolist()
|
|
179
|
+
['Price']
|
|
180
|
+
"""
|
|
181
|
+
raw_columns = counts.positions.values.tolist()
|
|
182
|
+
column_names = cast(list[str], raw_columns)
|
|
183
|
+
shown_names = list[str]()
|
|
184
|
+
for column_name in column_names:
|
|
185
|
+
shown_name = new_names.get(column_name, column_name)
|
|
186
|
+
shown_names.append(shown_name)
|
|
187
|
+
|
|
188
|
+
position_dtype = counts.positions.values.dtype
|
|
189
|
+
shown_values = numpy.array(shown_names, dtype=position_dtype)
|
|
190
|
+
renamed_positions = dataclasses.replace(counts.positions, values=shown_values)
|
|
191
|
+
renamed_counts = dataclasses.replace(counts, positions=renamed_positions)
|
|
192
|
+
|
|
193
|
+
return renamed_counts
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def rename_series(series: list[Series], new_names: dict[str, str]) -> list[Series]:
|
|
197
|
+
"""
|
|
198
|
+
Return series named after the shown names of their columns.
|
|
199
|
+
|
|
200
|
+
.. versionadded:: 0.1.0
|
|
201
|
+
|
|
202
|
+
Parameters
|
|
203
|
+
----------
|
|
204
|
+
series
|
|
205
|
+
The series of a chart.
|
|
206
|
+
new_names
|
|
207
|
+
The new name of each renamed column.
|
|
208
|
+
|
|
209
|
+
Returns
|
|
210
|
+
-------
|
|
211
|
+
list[Series]
|
|
212
|
+
New series with the same numbers.
|
|
213
|
+
|
|
214
|
+
Examples
|
|
215
|
+
--------
|
|
216
|
+
>>> import numpy
|
|
217
|
+
>>> from numdaplot.plots.data.chart_values import Series
|
|
218
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_series
|
|
219
|
+
>>> rename_series([Series("price", numpy.array([12.0]))], {"price": "Price"})[0].name
|
|
220
|
+
'Price'
|
|
221
|
+
"""
|
|
222
|
+
renamed_series = list[Series]()
|
|
223
|
+
for one_series in series:
|
|
224
|
+
shown_name = new_names.get(one_series.name, one_series.name)
|
|
225
|
+
shown_series = dataclasses.replace(one_series, name=shown_name)
|
|
226
|
+
renamed_series.append(shown_series)
|
|
227
|
+
|
|
228
|
+
return renamed_series
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def rename_value_name(values: ChartValues | SampleValues, renamed_series: list[Series]) -> str | None:
|
|
232
|
+
"""
|
|
233
|
+
Return the label of the axis of the values, following the series when it names them.
|
|
234
|
+
|
|
235
|
+
.. versionadded:: 0.1.0
|
|
236
|
+
|
|
237
|
+
Parameters
|
|
238
|
+
----------
|
|
239
|
+
values
|
|
240
|
+
The values of a chart, with their series under their column names.
|
|
241
|
+
renamed_series
|
|
242
|
+
The same series under their shown names.
|
|
243
|
+
|
|
244
|
+
Returns
|
|
245
|
+
-------
|
|
246
|
+
str or None
|
|
247
|
+
The names of the renamed series when the label names the series, the label unchanged otherwise, such as
|
|
248
|
+
``"value"`` for an Array.
|
|
249
|
+
|
|
250
|
+
Examples
|
|
251
|
+
--------
|
|
252
|
+
>>> import numdaplot as ndp
|
|
253
|
+
>>> from numdaplot.plots.data.table_values import read_table_values
|
|
254
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_series, rename_value_name
|
|
255
|
+
>>> prices = ndp.Array.from_list([12.0])
|
|
256
|
+
>>> costs = ndp.Array.from_list([8.0])
|
|
257
|
+
>>> sales = ndp.Table.from_arrays({"price": prices, "cost": costs})
|
|
258
|
+
>>> values = read_table_values(sales, None, ["price", "cost"], "LineChart")
|
|
259
|
+
>>> rename_value_name(values, rename_series(values.series, {"cost": "Cost"}))
|
|
260
|
+
'price, Cost'
|
|
261
|
+
"""
|
|
262
|
+
if values.value_name is None:
|
|
263
|
+
return None
|
|
264
|
+
|
|
265
|
+
column_names = [one_series.name for one_series in values.series]
|
|
266
|
+
shown_names = [one_series.name for one_series in renamed_series]
|
|
267
|
+
if column_names == []:
|
|
268
|
+
return values.value_name
|
|
269
|
+
|
|
270
|
+
column_label = name_columns(column_names)
|
|
271
|
+
if values.value_name != column_label:
|
|
272
|
+
return values.value_name
|
|
273
|
+
|
|
274
|
+
shown_label = name_columns(shown_names)
|
|
275
|
+
|
|
276
|
+
return shown_label
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def rename_points(points: PointValues, new_names: dict[str, str]) -> PointValues:
|
|
280
|
+
"""
|
|
281
|
+
Return the colors and the sizes of points with their columns shown under their new names.
|
|
282
|
+
|
|
283
|
+
.. versionadded:: 0.1.0
|
|
284
|
+
|
|
285
|
+
Parameters
|
|
286
|
+
----------
|
|
287
|
+
points
|
|
288
|
+
The colors and the sizes of a scatter chart.
|
|
289
|
+
new_names
|
|
290
|
+
The new name of each renamed column.
|
|
291
|
+
|
|
292
|
+
Returns
|
|
293
|
+
-------
|
|
294
|
+
PointValues
|
|
295
|
+
New points with the same colors and sizes.
|
|
296
|
+
|
|
297
|
+
Examples
|
|
298
|
+
--------
|
|
299
|
+
>>> from numdaplot.plots.data.point_values import PointValues
|
|
300
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_points
|
|
301
|
+
>>> rename_points(PointValues("zone", None, None, None), {"zone": "Zone"}).color_name
|
|
302
|
+
'Zone'
|
|
303
|
+
"""
|
|
304
|
+
color_name = rename_optional(points.color_name, new_names)
|
|
305
|
+
size_name = rename_optional(points.size_name, new_names)
|
|
306
|
+
renamed_points = dataclasses.replace(points, color_name=color_name, size_name=size_name)
|
|
307
|
+
|
|
308
|
+
return renamed_points
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
def rename_optional(name: str | None, new_names: dict[str, str]) -> str | None:
|
|
312
|
+
"""
|
|
313
|
+
Return the shown name of a column, when there is a column.
|
|
314
|
+
|
|
315
|
+
.. versionadded:: 0.1.0
|
|
316
|
+
|
|
317
|
+
Parameters
|
|
318
|
+
----------
|
|
319
|
+
name
|
|
320
|
+
A column name, or None.
|
|
321
|
+
new_names
|
|
322
|
+
The new name of each renamed column.
|
|
323
|
+
|
|
324
|
+
Returns
|
|
325
|
+
-------
|
|
326
|
+
str or None
|
|
327
|
+
The new name, the name itself when it is not renamed, or None.
|
|
328
|
+
|
|
329
|
+
Examples
|
|
330
|
+
--------
|
|
331
|
+
>>> from numdaplot.plots.data.renamed_layers import rename_optional
|
|
332
|
+
>>> rename_optional("day", {"day": "Day"}), rename_optional("hour", {"day": "Day"}), rename_optional(None, {})
|
|
333
|
+
('Day', 'hour', None)
|
|
334
|
+
"""
|
|
335
|
+
if name is None:
|
|
336
|
+
return None
|
|
337
|
+
|
|
338
|
+
shown_name = new_names.get(name, name)
|
|
339
|
+
|
|
340
|
+
return shown_name
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Values a histogram or a box chart sums up, read from a Table or an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
import numpy
|
|
11
|
+
from numpy.typing import NDArray
|
|
12
|
+
|
|
13
|
+
from numdaplot.arrays.array import Array
|
|
14
|
+
from numdaplot.data_types.type import Type
|
|
15
|
+
from numdaplot.plots.data.array_values import read_array_values
|
|
16
|
+
from numdaplot.plots.data.chart_data import require_column_setting, require_no_column_settings
|
|
17
|
+
from numdaplot.plots.data.chart_values import Series
|
|
18
|
+
from numdaplot.plots.data.column_reading import read_texts
|
|
19
|
+
from numdaplot.plots.data.table_values import name_columns, read_series
|
|
20
|
+
from numdaplot.tables.columns.column_names import require_known_columns
|
|
21
|
+
from numdaplot.tables.table import Table
|
|
22
|
+
from numdaplot.tables.table_data import read_stored_frame
|
|
23
|
+
|
|
24
|
+
COLUMNS_SETTING = "columns"
|
|
25
|
+
GROUP_SETTING = "group_by"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True, eq=False)
|
|
29
|
+
class SampleValues:
|
|
30
|
+
"""
|
|
31
|
+
The columns of numbers or times of day a histogram or a box chart sums up, and the groups splitting their rows.
|
|
32
|
+
|
|
33
|
+
.. versionadded:: 0.1.0
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
series
|
|
38
|
+
One series per column, NaN where a value is missing, a time of day being its hours since midnight.
|
|
39
|
+
groups
|
|
40
|
+
The group of each row, None where it is missing, or None without ``group_by``.
|
|
41
|
+
group_name
|
|
42
|
+
The ``group_by`` column, or None.
|
|
43
|
+
value_name
|
|
44
|
+
The default label of the axis of the values: the name of the single column of a Table, None otherwise.
|
|
45
|
+
value_type
|
|
46
|
+
The type of the first series, of the family of every series: numbers or times of day.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numpy
|
|
51
|
+
>>> import numdaplot as ndp
|
|
52
|
+
>>> from numdaplot.plots.data.chart_values import Series
|
|
53
|
+
>>> from numdaplot.plots.data.sample_values import SampleValues
|
|
54
|
+
>>> SampleValues([Series("price", numpy.array([12.0]))], None, None, "price", ndp.Type.FLOAT64).value_name
|
|
55
|
+
'price'
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
series: list[Series]
|
|
59
|
+
groups: NDArray[Any] | None
|
|
60
|
+
group_name: str | None
|
|
61
|
+
value_name: str | None
|
|
62
|
+
value_type: Type
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def read_sample_values(
|
|
66
|
+
data: Table | Array, column_names: list[str] | None, group_name: str | None, chart_name: str
|
|
67
|
+
) -> SampleValues:
|
|
68
|
+
"""
|
|
69
|
+
Return the columns a histogram or a box chart sums up, and their groups.
|
|
70
|
+
|
|
71
|
+
.. versionadded:: 0.1.0
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
data
|
|
76
|
+
The Table or the Array drawn.
|
|
77
|
+
column_names
|
|
78
|
+
The columns of a Table, None for an Array, whose columns are all read.
|
|
79
|
+
group_name
|
|
80
|
+
The ``group_by`` column of a Table, holding texts, booleans or times of day, or None.
|
|
81
|
+
chart_name
|
|
82
|
+
Name of the chart class, shown in error messages.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
SampleValues
|
|
87
|
+
One series per column, and the group of each row.
|
|
88
|
+
|
|
89
|
+
Raises
|
|
90
|
+
------
|
|
91
|
+
InvalidChartDataError
|
|
92
|
+
When a Table has no columns, or an Array has columns or ``group_by``.
|
|
93
|
+
ColumnNotFoundError
|
|
94
|
+
When a column does not exist.
|
|
95
|
+
IncompatibleTypesError
|
|
96
|
+
When a column holds neither numbers nor times of day, the columns mix them, or ``group_by`` holds
|
|
97
|
+
neither texts, booleans nor times of day.
|
|
98
|
+
DimensionError
|
|
99
|
+
When an Array has more than two dimensions.
|
|
100
|
+
|
|
101
|
+
Examples
|
|
102
|
+
--------
|
|
103
|
+
>>> import numdaplot as ndp
|
|
104
|
+
>>> from numdaplot.plots.data.sample_values import read_sample_values
|
|
105
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon"])
|
|
106
|
+
>>> prices = ndp.Array.from_list([12.0, 9.5])
|
|
107
|
+
>>> flats = ndp.Table.from_arrays({"city": cities, "price": prices})
|
|
108
|
+
>>> read_sample_values(flats, ["price"], "city", "BoxChart").groups
|
|
109
|
+
array(['Paris', 'Lyon'], dtype=object)
|
|
110
|
+
"""
|
|
111
|
+
if isinstance(data, Array):
|
|
112
|
+
column_settings = dict[str, object]({COLUMNS_SETTING: column_names, GROUP_SETTING: group_name})
|
|
113
|
+
require_no_column_settings(chart_name, column_settings)
|
|
114
|
+
array_values = read_array_values(data, chart_name)
|
|
115
|
+
array_samples = SampleValues(array_values.series, None, None, array_values.value_name, array_values.value_type)
|
|
116
|
+
return array_samples
|
|
117
|
+
|
|
118
|
+
required_names = require_column_setting(chart_name, COLUMNS_SETTING, column_names)
|
|
119
|
+
frame = read_stored_frame(data)
|
|
120
|
+
known_names = frame.columns.tolist()
|
|
121
|
+
require_known_columns(required_names, known_names)
|
|
122
|
+
series, value_type = read_series(frame, required_names, chart_name)
|
|
123
|
+
value_name = name_columns(required_names)
|
|
124
|
+
groups = None
|
|
125
|
+
if group_name is not None:
|
|
126
|
+
require_known_columns([group_name], known_names)
|
|
127
|
+
groups = read_texts(frame[group_name], chart_name)
|
|
128
|
+
|
|
129
|
+
table_samples = SampleValues(series, groups, group_name, value_name, value_type)
|
|
130
|
+
|
|
131
|
+
return table_samples
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def drop_missing_numbers(numbers: NDArray[numpy.float64]) -> NDArray[numpy.float64]:
|
|
135
|
+
"""
|
|
136
|
+
Return the numbers that are present, in their order.
|
|
137
|
+
|
|
138
|
+
.. versionadded:: 0.1.0
|
|
139
|
+
|
|
140
|
+
Parameters
|
|
141
|
+
----------
|
|
142
|
+
numbers
|
|
143
|
+
Numbers, NaN where a value is missing.
|
|
144
|
+
|
|
145
|
+
Returns
|
|
146
|
+
-------
|
|
147
|
+
NDArray[numpy.float64]
|
|
148
|
+
The numbers without NaN.
|
|
149
|
+
|
|
150
|
+
Examples
|
|
151
|
+
--------
|
|
152
|
+
>>> import numpy
|
|
153
|
+
>>> from numdaplot.plots.data.sample_values import drop_missing_numbers
|
|
154
|
+
>>> drop_missing_numbers(numpy.array([3.0, numpy.nan, 1.0]))
|
|
155
|
+
array([3., 1.])
|
|
156
|
+
"""
|
|
157
|
+
present = ~numpy.isnan(numbers)
|
|
158
|
+
present_numbers = numbers[present]
|
|
159
|
+
|
|
160
|
+
return present_numbers
|