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,149 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Where the legend of a Plot is placed.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class LegendPosition(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Where the legend of a Plot is placed, used by ``PlotStyle``.
|
|
13
|
+
|
|
14
|
+
The legend names the series, and is only drawn when a chart has several of them.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Examples
|
|
19
|
+
--------
|
|
20
|
+
>>> import numdaplot as ndp
|
|
21
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
22
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
23
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
24
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
25
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
26
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
|
|
27
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
28
|
+
>>> plot.show()
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
BEST = auto()
|
|
32
|
+
"""
|
|
33
|
+
Inside the axes, where it hides the fewest values. With an axis on the right, the values of both axes leave little
|
|
34
|
+
room inside: the legend is placed as with ``OUTSIDE_RIGHT``. Default value.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
40
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
41
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
42
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
43
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
44
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.BEST)
|
|
45
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
46
|
+
>>> plot.show()
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
UPPER_LEFT = auto()
|
|
50
|
+
"""
|
|
51
|
+
Inside the axes, in the upper left corner.
|
|
52
|
+
|
|
53
|
+
Examples
|
|
54
|
+
--------
|
|
55
|
+
>>> import numdaplot as ndp
|
|
56
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
57
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
58
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
59
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
60
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
61
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
|
|
62
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
63
|
+
>>> plot.show()
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
UPPER_RIGHT = auto()
|
|
67
|
+
"""
|
|
68
|
+
Inside the axes, in the upper right corner.
|
|
69
|
+
|
|
70
|
+
Examples
|
|
71
|
+
--------
|
|
72
|
+
>>> import numdaplot as ndp
|
|
73
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
74
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
75
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
76
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
77
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
78
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_RIGHT)
|
|
79
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
80
|
+
>>> plot.show()
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
LOWER_LEFT = auto()
|
|
84
|
+
"""
|
|
85
|
+
Inside the axes, in the lower left corner.
|
|
86
|
+
|
|
87
|
+
Examples
|
|
88
|
+
--------
|
|
89
|
+
>>> import numdaplot as ndp
|
|
90
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
91
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
92
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
93
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
94
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
95
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.LOWER_LEFT)
|
|
96
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
97
|
+
>>> plot.show()
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
LOWER_RIGHT = auto()
|
|
101
|
+
"""
|
|
102
|
+
Inside the axes, in the lower right corner.
|
|
103
|
+
|
|
104
|
+
Examples
|
|
105
|
+
--------
|
|
106
|
+
>>> import numdaplot as ndp
|
|
107
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
108
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
109
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
110
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
111
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
112
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.LOWER_RIGHT)
|
|
113
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
114
|
+
>>> plot.show()
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
OUTSIDE_RIGHT = auto()
|
|
118
|
+
"""
|
|
119
|
+
Outside the axes, on their right and past an axis on the right if any, so it never hides a value.
|
|
120
|
+
|
|
121
|
+
Examples
|
|
122
|
+
--------
|
|
123
|
+
>>> import numdaplot as ndp
|
|
124
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
125
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
126
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
127
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
128
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
129
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.OUTSIDE_RIGHT)
|
|
130
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
131
|
+
>>> plot.show()
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
HIDDEN = auto()
|
|
135
|
+
"""
|
|
136
|
+
No legend.
|
|
137
|
+
|
|
138
|
+
Examples
|
|
139
|
+
--------
|
|
140
|
+
>>> import numdaplot as ndp
|
|
141
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
142
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
143
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
144
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
145
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
146
|
+
>>> style = ndp.PlotStyle(legend=ndp.LegendPosition.HIDDEN)
|
|
147
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
148
|
+
>>> plot.show()
|
|
149
|
+
"""
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Look of a whole Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_rotation_error import InvalidRotationError
|
|
10
|
+
from numdaplot.plots.style.grid_lines import GridLines
|
|
11
|
+
from numdaplot.plots.style.legend_position import LegendPosition
|
|
12
|
+
from numdaplot.plots.style.size import Size
|
|
13
|
+
from numdaplot.settings.field_types import require_field_types
|
|
14
|
+
from numdaplot.tables.columns.renaming import Renaming
|
|
15
|
+
|
|
16
|
+
MINIMUM_ROTATION = -90
|
|
17
|
+
MAXIMUM_ROTATION = 90
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass(frozen=True)
|
|
21
|
+
class PlotStyle:
|
|
22
|
+
"""
|
|
23
|
+
Look of a whole Plot: title, axis labels, rotation of the values, legend, grid lines and size.
|
|
24
|
+
|
|
25
|
+
The look of the series, such as their colors, belongs to the chart drawing them.
|
|
26
|
+
|
|
27
|
+
.. versionadded:: 0.1.0
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
title
|
|
32
|
+
The title above the axes: when omitted, the ``y`` label by the ``x`` label such as ``sales by month``, and for a
|
|
33
|
+
map of missing values ``Map of missing values``. An empty text draws no title.
|
|
34
|
+
x_label
|
|
35
|
+
The label of the axis of the ``x`` values: when omitted, the name of the ``x`` column, else ``Row``, or
|
|
36
|
+
``Column`` for a box or a heatmap without group. An empty text draws no label.
|
|
37
|
+
y_label
|
|
38
|
+
The label of the axis of the ``y`` values: when omitted, the names of the ``y`` columns one after the other, the
|
|
39
|
+
first 3 and the number of the others beyond 3, or ``Value`` for an Array. An empty text draws no label.
|
|
40
|
+
right_label
|
|
41
|
+
The label of the axis on the right, drawn when a chart is added with ``ValueAxis.RIGHT``: when omitted, written
|
|
42
|
+
as ``y_label`` for the first chart on the right. An empty text draws no label. It has no effect while no chart
|
|
43
|
+
is on the right.
|
|
44
|
+
x_tick_rotation
|
|
45
|
+
The angle of the labels of the ``x`` values, in degrees from -90 to 90. When omitted, 45 degrees for texts,
|
|
46
|
+
dates, datetimes and numbers without enough room, and no rotation for other numbers and for the texts on the
|
|
47
|
+
left of horizontal bars. Labels without enough room at this angle are left out, one out of as many as needed
|
|
48
|
+
from the first one, with a ``ReadabilityWarning`` when they may be texts.
|
|
49
|
+
y_tick_rotation
|
|
50
|
+
The angle of the labels of the ``y`` values, in degrees from -90 to 90, no rotation when omitted. The values of
|
|
51
|
+
the axis on the right keep no rotation. Labels without enough room are left out as for ``x_tick_rotation``.
|
|
52
|
+
legend
|
|
53
|
+
Where the legend is placed, ``LegendPosition.BEST`` by default, past the axes for a map of missing values. It is
|
|
54
|
+
only drawn for several series, so never on a pie or a heatmap. It names each series after its column, or after
|
|
55
|
+
the name ``renaming`` gives it.
|
|
56
|
+
grid_lines
|
|
57
|
+
Whether light grid lines are drawn behind the values, ``GridLines.SHOWN`` by default. A pie and a heatmap have
|
|
58
|
+
none.
|
|
59
|
+
size
|
|
60
|
+
The width and the height, 6.4 by 4.8 inches by default. A Plot placed in a ``Figure`` takes the size of
|
|
61
|
+
its cells instead.
|
|
62
|
+
renaming
|
|
63
|
+
The names under which some columns are shown, every column under its own name when omitted. Each
|
|
64
|
+
``NameChange`` applies to the legend, the labels of boxes, heatmaps and missing value charts, the legends of
|
|
65
|
+
``color_by`` and ``size_by``, and the default title and axis labels, on every chart of the Plot. The columns
|
|
66
|
+
of an Array are named ``"0"``, ``"1"``... The values themselves, such as the parts of a pie, are never
|
|
67
|
+
renamed. A title or a label given here keeps its text.
|
|
68
|
+
|
|
69
|
+
Raises
|
|
70
|
+
------
|
|
71
|
+
InvalidTypeError
|
|
72
|
+
When a setting is not of the type its annotation names.
|
|
73
|
+
InvalidRotationError
|
|
74
|
+
When ``x_tick_rotation`` or ``y_tick_rotation`` is outside -90 to 90 degrees.
|
|
75
|
+
|
|
76
|
+
Examples
|
|
77
|
+
--------
|
|
78
|
+
>>> import numdaplot as ndp
|
|
79
|
+
>>> days = ndp.Array.from_list([1, 2, 3, 4])
|
|
80
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
81
|
+
>>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
|
|
82
|
+
>>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
|
|
83
|
+
>>> chart = ndp.LineChart(x="day", y=["price", "cost"])
|
|
84
|
+
>>> style = ndp.PlotStyle(title="Sales", x_label="Day", y_label="Euros", legend=ndp.LegendPosition.OUTSIDE_RIGHT)
|
|
85
|
+
>>> plot = ndp.Plot.line(sales, chart, style)
|
|
86
|
+
>>> plot.show()
|
|
87
|
+
|
|
88
|
+
The labels of the ``x`` values can take another angle.
|
|
89
|
+
|
|
90
|
+
>>> cities = ndp.Array.from_list(["Paris", "Lyon", "Marseille"])
|
|
91
|
+
>>> totals = ndp.Array.from_list([120.0, 80.0, 95.0])
|
|
92
|
+
>>> city_sales = ndp.Table.from_arrays({"city": cities, "total": totals})
|
|
93
|
+
>>> city_chart = ndp.BarChart(x="city", y=["total"])
|
|
94
|
+
>>> city_plot = ndp.Plot.bar(city_sales, city_chart, ndp.PlotStyle(x_tick_rotation=90))
|
|
95
|
+
>>> city_plot.show()
|
|
96
|
+
|
|
97
|
+
The columns can be shown under other names, without renaming them in the Table.
|
|
98
|
+
|
|
99
|
+
>>> shown_names = ndp.Renaming(changes=[ndp.NameChange(old_name="total", new_name="Total sales")])
|
|
100
|
+
>>> named_plot = ndp.Plot.bar(city_sales, city_chart, ndp.PlotStyle(renaming=shown_names))
|
|
101
|
+
>>> named_plot.show()
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
title: str | None = None
|
|
105
|
+
x_label: str | None = None
|
|
106
|
+
y_label: str | None = None
|
|
107
|
+
right_label: str | None = None
|
|
108
|
+
x_tick_rotation: float | None = None
|
|
109
|
+
y_tick_rotation: float | None = None
|
|
110
|
+
legend: LegendPosition = LegendPosition.BEST
|
|
111
|
+
grid_lines: GridLines = GridLines.SHOWN
|
|
112
|
+
size: Size = Size()
|
|
113
|
+
renaming: Renaming | None = None
|
|
114
|
+
|
|
115
|
+
def __post_init__(self) -> None:
|
|
116
|
+
"""
|
|
117
|
+
Check the rotations of the labels of the values.
|
|
118
|
+
|
|
119
|
+
.. versionadded:: 0.1.0
|
|
120
|
+
|
|
121
|
+
Raises
|
|
122
|
+
------
|
|
123
|
+
InvalidTypeError
|
|
124
|
+
When a setting is not of the type its annotation names.
|
|
125
|
+
InvalidRotationError
|
|
126
|
+
When ``x_tick_rotation`` or ``y_tick_rotation`` is outside -90 to 90 degrees.
|
|
127
|
+
"""
|
|
128
|
+
require_field_types(self)
|
|
129
|
+
|
|
130
|
+
for rotation in (self.x_tick_rotation, self.y_tick_rotation):
|
|
131
|
+
if rotation is None:
|
|
132
|
+
continue
|
|
133
|
+
|
|
134
|
+
is_accepted = MINIMUM_ROTATION <= rotation <= MAXIMUM_ROTATION
|
|
135
|
+
if not is_accepted:
|
|
136
|
+
raise InvalidRotationError(rotation)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Width and height of a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_size_error import InvalidSizeError
|
|
10
|
+
from numdaplot.plots.style.size_unit import SizeUnit
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
DEFAULT_WIDTH = 6.4
|
|
14
|
+
DEFAULT_HEIGHT = 4.8
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Size:
|
|
19
|
+
"""
|
|
20
|
+
Width and height of a Plot, used by ``PlotStyle``.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
width
|
|
27
|
+
The width, 6.4 inches by default.
|
|
28
|
+
height
|
|
29
|
+
The height, 4.8 inches by default.
|
|
30
|
+
unit
|
|
31
|
+
The unit of the width and the height, ``SizeUnit.INCH`` by default.
|
|
32
|
+
|
|
33
|
+
Raises
|
|
34
|
+
------
|
|
35
|
+
InvalidTypeError
|
|
36
|
+
When a setting is not of the type its annotation names.
|
|
37
|
+
InvalidSizeError
|
|
38
|
+
When the width or the height is zero or negative.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
44
|
+
>>> style = ndp.PlotStyle(size=ndp.Size(width=6, height=2.5))
|
|
45
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
46
|
+
>>> plot.show()
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
width: float = DEFAULT_WIDTH
|
|
50
|
+
height: float = DEFAULT_HEIGHT
|
|
51
|
+
unit: SizeUnit = SizeUnit.INCH
|
|
52
|
+
|
|
53
|
+
def __post_init__(self) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Check that the width and the height are positive.
|
|
56
|
+
|
|
57
|
+
.. versionadded:: 0.1.0
|
|
58
|
+
|
|
59
|
+
Raises
|
|
60
|
+
------
|
|
61
|
+
InvalidTypeError
|
|
62
|
+
When a setting is not of the type its annotation names.
|
|
63
|
+
InvalidSizeError
|
|
64
|
+
When the width or the height is zero or negative.
|
|
65
|
+
"""
|
|
66
|
+
require_field_types(self)
|
|
67
|
+
|
|
68
|
+
is_positive = self.width > 0 and self.height > 0
|
|
69
|
+
if not is_positive:
|
|
70
|
+
raise InvalidSizeError(self.width, self.height)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Units of the width and the height of a Plot.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SizeUnit(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Units of the width and the height of a Plot, used by ``Size``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> import numdaplot as ndp
|
|
19
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
20
|
+
>>> style = ndp.PlotStyle(size=ndp.Size(width=16, height=8, unit=ndp.SizeUnit.CENTIMETER))
|
|
21
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
22
|
+
>>> plot.show()
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
INCH = auto()
|
|
26
|
+
"""
|
|
27
|
+
Inches, as matplotlib counts sizes. Default value.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> import numdaplot as ndp
|
|
32
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
33
|
+
>>> style = ndp.PlotStyle(size=ndp.Size(width=6, height=3, unit=ndp.SizeUnit.INCH))
|
|
34
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
35
|
+
>>> plot.show()
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
CENTIMETER = auto()
|
|
39
|
+
"""
|
|
40
|
+
Centimeters, 2.54 per inch.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> import numdaplot as ndp
|
|
45
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
46
|
+
>>> style = ndp.PlotStyle(size=ndp.Size(width=16, height=8, unit=ndp.SizeUnit.CENTIMETER))
|
|
47
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
48
|
+
>>> plot.show()
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
PIXEL = auto()
|
|
52
|
+
"""
|
|
53
|
+
Pixels, 100 per inch, the resolution of a PNG image saved without ``ImageOptions``.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import numdaplot as ndp
|
|
58
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
|
|
59
|
+
>>> style = ndp.PlotStyle(size=ndp.Size(width=600, height=300, unit=ndp.SizeUnit.PIXEL))
|
|
60
|
+
>>> plot = ndp.Plot.line(prices, style=style)
|
|
61
|
+
>>> plot.show()
|
|
62
|
+
"""
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Direction in which an operation runs on two-dimensional data.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Axis(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Direction in which an operation runs on two-dimensional data.
|
|
13
|
+
|
|
14
|
+
Each name describes the result: ``EACH_ROW`` handles every row on its own,
|
|
15
|
+
so a statistic gives one value per row.
|
|
16
|
+
|
|
17
|
+
Every method working along an axis takes it as its own ``axis`` argument, next to its settings:
|
|
18
|
+
``Array.compute``, ``Array.sort``, ``Table.count_missing`` and ``Table.drop_missing``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
--------
|
|
24
|
+
>>> import numdaplot as ndp
|
|
25
|
+
>>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
|
|
26
|
+
>>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
|
|
27
|
+
Array([3, 7], dtype=INT64)
|
|
28
|
+
>>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_COLUMN)
|
|
29
|
+
Array([4, 6], dtype=INT64)
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
EACH_ROW = auto()
|
|
33
|
+
"""
|
|
34
|
+
Every row is handled on its own: one result per row.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
|
|
40
|
+
>>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
|
|
41
|
+
Array([3, 7], dtype=INT64)
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
EACH_COLUMN = auto()
|
|
45
|
+
"""
|
|
46
|
+
Every column is handled on its own: one result per column.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> import numdaplot as ndp
|
|
51
|
+
>>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
|
|
52
|
+
>>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_COLUMN)
|
|
53
|
+
Array([4, 6], dtype=INT64)
|
|
54
|
+
"""
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A single position in one dimension.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.settings.field_types import require_field_types
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class Index:
|
|
14
|
+
"""
|
|
15
|
+
A single position in one dimension, used by ``Region``.
|
|
16
|
+
|
|
17
|
+
.. versionadded:: 0.1.0
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
position
|
|
22
|
+
The position, starting at 0. A negative position counts from the end:
|
|
23
|
+
-1 is the last one.
|
|
24
|
+
|
|
25
|
+
Raises
|
|
26
|
+
------
|
|
27
|
+
InvalidTypeError
|
|
28
|
+
When a setting is not of the type its annotation names.
|
|
29
|
+
|
|
30
|
+
Examples
|
|
31
|
+
--------
|
|
32
|
+
>>> import numdaplot as ndp
|
|
33
|
+
>>> scores = ndp.Array.from_list([10, 20, 30])
|
|
34
|
+
>>> scores.take(ndp.Region(rows=ndp.Index(-1)))
|
|
35
|
+
Array([30], dtype=INT64)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
position: int
|
|
39
|
+
|
|
40
|
+
def __post_init__(self) -> None:
|
|
41
|
+
"""
|
|
42
|
+
Check the type of the position.
|
|
43
|
+
|
|
44
|
+
.. versionadded:: 0.1.0
|
|
45
|
+
|
|
46
|
+
Raises
|
|
47
|
+
------
|
|
48
|
+
InvalidTypeError
|
|
49
|
+
When a setting is not of the type its annotation names.
|
|
50
|
+
"""
|
|
51
|
+
require_field_types(self)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A regular sequence of numbers between two bounds.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.errors.invalid_step_error import InvalidStepError
|
|
10
|
+
from numdaplot.rules.bounds import Bounds
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
DEFAULT_STEP = 1
|
|
14
|
+
FORBIDDEN_STEP = 0
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class Range:
|
|
19
|
+
"""
|
|
20
|
+
A regular sequence of numbers from ``start`` to ``stop``, every ``step``.
|
|
21
|
+
|
|
22
|
+
It selects positions in ``Region`` and creates values in ``Array.from_range``.
|
|
23
|
+
In a ``Region``, ``start`` and ``step`` must be ``int``, since a position is a whole number.
|
|
24
|
+
Unlike the Python ``range``, the end is included by default, as in ``Between``.
|
|
25
|
+
|
|
26
|
+
.. versionadded:: 0.1.0
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
start
|
|
31
|
+
First number of the sequence.
|
|
32
|
+
stop
|
|
33
|
+
Last number of the sequence, reached only when it falls on a step.
|
|
34
|
+
step
|
|
35
|
+
Gap between two numbers, 1 by default. A negative step goes downwards.
|
|
36
|
+
bounds
|
|
37
|
+
Which of ``start`` and ``stop`` are part of the sequence. Both are included by default.
|
|
38
|
+
|
|
39
|
+
Raises
|
|
40
|
+
------
|
|
41
|
+
InvalidTypeError
|
|
42
|
+
When a setting is not of the type its annotation names.
|
|
43
|
+
InvalidStepError
|
|
44
|
+
When ``step`` is zero, or goes away from ``stop``, such as a step of 1 from 5 to 1.
|
|
45
|
+
|
|
46
|
+
Examples
|
|
47
|
+
--------
|
|
48
|
+
>>> import numdaplot as ndp
|
|
49
|
+
>>> ndp.Array.from_range(ndp.Range(start=0, stop=10, step=2))
|
|
50
|
+
Array([ 0, 2, 4, 6, 8, 10], dtype=INT64)
|
|
51
|
+
>>> scores = ndp.Array.from_list([10, 20, 30, 40])
|
|
52
|
+
>>> scores.take(ndp.Region(rows=ndp.Range(start=1, stop=2)))
|
|
53
|
+
Array([20, 30], dtype=INT64)
|
|
54
|
+
|
|
55
|
+
The first 3 rows, without counting the last position: ``stop`` is left out with ``Bounds.LOW_ONLY``.
|
|
56
|
+
|
|
57
|
+
>>> first_count = 3
|
|
58
|
+
>>> first_rows = ndp.Range(start=0, stop=first_count, bounds=ndp.Bounds.LOW_ONLY)
|
|
59
|
+
>>> scores.take(ndp.Region(rows=first_rows))
|
|
60
|
+
Array([10, 20, 30], dtype=INT64)
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
start: int | float
|
|
64
|
+
stop: int | float
|
|
65
|
+
step: int | float = DEFAULT_STEP
|
|
66
|
+
bounds: Bounds = Bounds.INCLUDED
|
|
67
|
+
|
|
68
|
+
def __post_init__(self) -> None:
|
|
69
|
+
"""
|
|
70
|
+
Check that the step is not zero and goes from the start to the stop.
|
|
71
|
+
|
|
72
|
+
.. versionadded:: 0.1.0
|
|
73
|
+
|
|
74
|
+
Raises
|
|
75
|
+
------
|
|
76
|
+
InvalidTypeError
|
|
77
|
+
When a setting is not of the type its annotation names.
|
|
78
|
+
InvalidStepError
|
|
79
|
+
When ``step`` is zero, or goes away from ``stop``.
|
|
80
|
+
"""
|
|
81
|
+
require_field_types(self)
|
|
82
|
+
|
|
83
|
+
if self.step == FORBIDDEN_STEP:
|
|
84
|
+
raise InvalidStepError(self.step)
|
|
85
|
+
|
|
86
|
+
distance = self.stop - self.start
|
|
87
|
+
signed_progress = distance * self.step
|
|
88
|
+
goes_away = signed_progress < 0
|
|
89
|
+
if goes_away:
|
|
90
|
+
raise InvalidStepError(self.step, self.start, self.stop)
|