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,68 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A time zone of the IANA database.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
|
|
9
|
+
|
|
10
|
+
from numdaplot.errors.unknown_time_zone_error import UnknownTimeZoneError
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class TimeZone:
|
|
16
|
+
"""
|
|
17
|
+
A time zone of the IANA database, such as ``"Europe/Paris"`` or ``"UTC"``, used by ``TimeZoneChange``.
|
|
18
|
+
|
|
19
|
+
A zone follows the summer and winter time changes of its place. Fixed offsets such as ``"+01:00"``
|
|
20
|
+
are not time zones.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
name
|
|
27
|
+
The IANA name of the zone.
|
|
28
|
+
|
|
29
|
+
Raises
|
|
30
|
+
------
|
|
31
|
+
InvalidTypeError
|
|
32
|
+
When a setting is not of the type its annotation names.
|
|
33
|
+
UnknownTimeZoneError
|
|
34
|
+
When the name is not a known IANA name.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
>>> from datetime import datetime
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
41
|
+
>>> paris = ndp.TimeZone("Europe/Paris")
|
|
42
|
+
>>> in_paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=paris)
|
|
43
|
+
>>> paris_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=in_paris))
|
|
44
|
+
>>> paris_times.column_time_zones
|
|
45
|
+
{'time': TimeZone(name='Europe/Paris')}
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
name: str
|
|
49
|
+
|
|
50
|
+
def __post_init__(self) -> None:
|
|
51
|
+
"""
|
|
52
|
+
Check that the name is a known IANA name.
|
|
53
|
+
|
|
54
|
+
.. versionadded:: 0.1.0
|
|
55
|
+
|
|
56
|
+
Raises
|
|
57
|
+
------
|
|
58
|
+
InvalidTypeError
|
|
59
|
+
When a setting is not of the type its annotation names.
|
|
60
|
+
UnknownTimeZoneError
|
|
61
|
+
When the name is not a known IANA name.
|
|
62
|
+
"""
|
|
63
|
+
require_field_types(self)
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
ZoneInfo(self.name)
|
|
67
|
+
except (ZoneInfoNotFoundError, ValueError) as error:
|
|
68
|
+
raise UnknownTimeZoneError(self.name) from error
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A change of the time zone of a datetime column.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.dates.time_zone import TimeZone
|
|
10
|
+
from numdaplot.dates.time_zone_mode import TimeZoneMode
|
|
11
|
+
from numdaplot.errors.invalid_time_zone_change_error import InvalidTimeZoneChangeError
|
|
12
|
+
from numdaplot.settings.field_types import require_field_types
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class TimeZoneChange:
|
|
17
|
+
"""
|
|
18
|
+
A change of the time zone of a datetime column, used by ``Conversion``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
mode
|
|
25
|
+
Whether a zone is given to datetimes without one, datetimes are moved to another zone, or their zone
|
|
26
|
+
is removed.
|
|
27
|
+
zone
|
|
28
|
+
The new zone, needed by ``TimeZoneMode.ATTRIBUTE`` and ``SHIFT``. ``REMOVE`` refuses it, so it is the only mode
|
|
29
|
+
used when omitted.
|
|
30
|
+
|
|
31
|
+
Raises
|
|
32
|
+
------
|
|
33
|
+
InvalidTypeError
|
|
34
|
+
When a setting is not of the type its annotation names.
|
|
35
|
+
InvalidTimeZoneChangeError
|
|
36
|
+
When ``ATTRIBUTE`` or ``SHIFT`` has no zone, or ``REMOVE`` has one.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> from datetime import datetime
|
|
41
|
+
>>> import numdaplot as ndp
|
|
42
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
43
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
|
|
44
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
45
|
+
time
|
|
46
|
+
DATETIME Europe/Paris
|
|
47
|
+
0 2026-07-01 10:30:00+02:00
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
mode: TimeZoneMode
|
|
51
|
+
zone: TimeZone | None = None
|
|
52
|
+
|
|
53
|
+
def __post_init__(self) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Check that the zone is given exactly when the mode needs it.
|
|
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
|
+
InvalidTimeZoneChangeError
|
|
64
|
+
When ``ATTRIBUTE`` or ``SHIFT`` has no zone, or ``REMOVE`` has one.
|
|
65
|
+
"""
|
|
66
|
+
require_field_types(self)
|
|
67
|
+
|
|
68
|
+
needs_zone = self.mode != TimeZoneMode.REMOVE
|
|
69
|
+
has_zone = self.zone is not None
|
|
70
|
+
if needs_zone != has_zone:
|
|
71
|
+
raise InvalidTimeZoneChangeError(self.mode.name, needs_zone)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""
|
|
2
|
+
How the time zone of a datetime column changes.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TimeZoneMode(Enum):
|
|
11
|
+
"""
|
|
12
|
+
How the time zone of a datetime column changes, used by ``TimeZoneChange``.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> from datetime import datetime
|
|
19
|
+
>>> import numdaplot as ndp
|
|
20
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
21
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
|
|
22
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
23
|
+
time
|
|
24
|
+
DATETIME Europe/Paris
|
|
25
|
+
0 2026-07-01 10:30:00+02:00
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
ATTRIBUTE = auto()
|
|
29
|
+
"""
|
|
30
|
+
Gives a zone to datetimes without one: the clock time stays the same.
|
|
31
|
+
|
|
32
|
+
A time that does not exist in the zone, or exists twice when the clocks change, raises
|
|
33
|
+
``ValueConversionError``.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> from datetime import datetime
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
40
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
|
|
41
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
42
|
+
time
|
|
43
|
+
DATETIME Europe/Paris
|
|
44
|
+
0 2026-07-01 10:30:00+02:00
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
SHIFT = auto()
|
|
48
|
+
"""
|
|
49
|
+
Moves datetimes with a zone to another zone: the instant stays the same, the clock time changes.
|
|
50
|
+
|
|
51
|
+
Examples
|
|
52
|
+
--------
|
|
53
|
+
>>> from datetime import datetime
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
56
|
+
>>> utc = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("UTC"))
|
|
57
|
+
>>> utc_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=utc))
|
|
58
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.SHIFT, zone=ndp.TimeZone("Europe/Paris"))
|
|
59
|
+
>>> utc_times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
60
|
+
time
|
|
61
|
+
DATETIME Europe/Paris
|
|
62
|
+
0 2026-07-01 12:30:00+02:00
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
REMOVE = auto()
|
|
66
|
+
"""
|
|
67
|
+
Removes the zone of datetimes: the clock time stays the same.
|
|
68
|
+
|
|
69
|
+
Examples
|
|
70
|
+
--------
|
|
71
|
+
>>> from datetime import datetime
|
|
72
|
+
>>> import numdaplot as ndp
|
|
73
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list([datetime(2026, 7, 1, 10, 30)])})
|
|
74
|
+
>>> paris = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.ATTRIBUTE, zone=ndp.TimeZone("Europe/Paris"))
|
|
75
|
+
>>> paris_times = times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=paris))
|
|
76
|
+
>>> no_zone = ndp.TimeZoneChange(mode=ndp.TimeZoneMode.REMOVE)
|
|
77
|
+
>>> paris_times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, timezone=no_zone))
|
|
78
|
+
time
|
|
79
|
+
DATETIME
|
|
80
|
+
0 2026-07-01 10:30:00
|
|
81
|
+
"""
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Each number read as a duration in a unit.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.dates.duration_unit import DurationUnit
|
|
10
|
+
from numdaplot.dates.time_function import TimeFunction
|
|
11
|
+
from numdaplot.settings.field_types import require_field_types
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class ToDuration(TimeFunction):
|
|
16
|
+
"""
|
|
17
|
+
Each number read as a duration in a unit: 1.5 in days gives 36 hours.
|
|
18
|
+
|
|
19
|
+
The result is a ``DURATION`` Array, rounded to the nanosecond. Applies to integers and decimals, not to
|
|
20
|
+
booleans. ``DurationIn`` does the opposite.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
unit
|
|
27
|
+
The unit of the numbers.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
TimeOverflowError
|
|
35
|
+
When ``Array.apply`` meets a number that gives a duration beyond about 292 years.
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import numdaplot as ndp
|
|
40
|
+
>>> nights = ndp.Array.from_list([3, 10])
|
|
41
|
+
>>> nights.apply(ndp.ToDuration(unit=ndp.DurationUnit.DAY))
|
|
42
|
+
Array(['3 days 00:00:00', '10 days 00:00:00'], dtype=DURATION)
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
unit: DurationUnit
|
|
46
|
+
|
|
47
|
+
def __post_init__(self) -> None:
|
|
48
|
+
"""
|
|
49
|
+
Check the type of every setting.
|
|
50
|
+
|
|
51
|
+
.. versionadded:: 0.1.0
|
|
52
|
+
|
|
53
|
+
Raises
|
|
54
|
+
------
|
|
55
|
+
InvalidTypeError
|
|
56
|
+
When a setting is not of the type its annotation names.
|
|
57
|
+
"""
|
|
58
|
+
require_field_types(self)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Warning emitted when two Arrays of different shapes are combined.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_warning import NumdaplotWarning
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BroadcastWarning(NumdaplotWarning):
|
|
11
|
+
"""
|
|
12
|
+
Emitted when an operation stretches an Array to match the shape of another one.
|
|
13
|
+
|
|
14
|
+
The operation still runs, as in numpy. The warning only signals that the shapes differ,
|
|
15
|
+
which is often a mistake. It is never emitted when an Array is combined with a single value.
|
|
16
|
+
|
|
17
|
+
Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
|
|
18
|
+
``NumdaplotWarning``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
--------
|
|
24
|
+
>>> import numdaplot as ndp
|
|
25
|
+
>>> import warnings
|
|
26
|
+
>>> grid = ndp.Array.from_list([[1, 2], [3, 4]])
|
|
27
|
+
>>> row = ndp.Array.from_list([10, 20])
|
|
28
|
+
>>> with warnings.catch_warnings(record=True) as caught_warnings:
|
|
29
|
+
... warnings.simplefilter("always")
|
|
30
|
+
... sums = grid + row
|
|
31
|
+
>>> sums
|
|
32
|
+
Array([[11, 22],
|
|
33
|
+
[13, 24]], dtype=INT64)
|
|
34
|
+
>>> print(caught_warnings[0].message)
|
|
35
|
+
Shapes (2, 2) and (2,) differ, values are repeated to match.
|
|
36
|
+
"""
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Warning emitted when a calculation on decimals gives NaN or an infinite value.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_warning import NumdaplotWarning
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CalculationWarning(NumdaplotWarning):
|
|
11
|
+
"""
|
|
12
|
+
Emitted when values of a calculation on decimals have no defined result or do not fit their type.
|
|
13
|
+
|
|
14
|
+
The calculation still runs: these values become NaN or an infinite value. The warning points at the line of
|
|
15
|
+
the calculation in the calling code.
|
|
16
|
+
|
|
17
|
+
Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
|
|
18
|
+
``NumdaplotWarning``.
|
|
19
|
+
|
|
20
|
+
.. versionadded:: 0.1.0
|
|
21
|
+
|
|
22
|
+
Examples
|
|
23
|
+
--------
|
|
24
|
+
>>> import numdaplot as ndp
|
|
25
|
+
>>> import warnings
|
|
26
|
+
>>> distances = ndp.Array.from_list([0.0, 3.0])
|
|
27
|
+
>>> hours = ndp.Array.from_list([0.0, 2.0])
|
|
28
|
+
>>> with warnings.catch_warnings(record=True) as caught_warnings:
|
|
29
|
+
... warnings.simplefilter("always")
|
|
30
|
+
... speeds = distances / hours
|
|
31
|
+
>>> speeds
|
|
32
|
+
Array([nan, 1.5], dtype=FLOAT64)
|
|
33
|
+
>>> print(caught_warnings[0].message)
|
|
34
|
+
The operation / has values without a defined result, such as 0 / 0: they became NaN.
|
|
35
|
+
"""
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a cell is outside the Layout of a Figure.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
CELL_OUT_OF_RANGE_MESSAGE = "Cell ({row}, {column}) is outside a Layout of {row_count} rows and {column_count} columns."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CellOutOfRangeError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when a ``Cell``, or a cell it spans, is beyond the rows or the columns of the ``Layout`` of a ``Figure``.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
row
|
|
21
|
+
The row of the cell, from 0.
|
|
22
|
+
column
|
|
23
|
+
The column of the cell, from 0.
|
|
24
|
+
row_count
|
|
25
|
+
The number of rows of the Layout.
|
|
26
|
+
column_count
|
|
27
|
+
The number of columns of the Layout.
|
|
28
|
+
|
|
29
|
+
Attributes
|
|
30
|
+
----------
|
|
31
|
+
row
|
|
32
|
+
The row of the cell, from 0.
|
|
33
|
+
column
|
|
34
|
+
The column of the cell, from 0.
|
|
35
|
+
row_count
|
|
36
|
+
The number of rows of the Layout.
|
|
37
|
+
column_count
|
|
38
|
+
The number of columns of the Layout.
|
|
39
|
+
|
|
40
|
+
Examples
|
|
41
|
+
--------
|
|
42
|
+
>>> import numdaplot as ndp
|
|
43
|
+
>>> prices = ndp.Array.from_list([12.0, 15.5, 14.0])
|
|
44
|
+
>>> plot = ndp.Plot.line(prices)
|
|
45
|
+
>>> figure = ndp.Figure(ndp.Layout(rows=2, columns=2))
|
|
46
|
+
>>> try:
|
|
47
|
+
... figure.place(plot, ndp.Cell(row=2, column=0))
|
|
48
|
+
... except ndp.CellOutOfRangeError as error:
|
|
49
|
+
... print(error)
|
|
50
|
+
Cell (2, 0) is outside a Layout of 2 rows and 2 columns.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, row: int, column: int, row_count: int, column_count: int) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Build the error message from the cell and the size of the Layout.
|
|
56
|
+
|
|
57
|
+
.. versionadded:: 0.1.0
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
row
|
|
62
|
+
The row of the cell, from 0.
|
|
63
|
+
column
|
|
64
|
+
The column of the cell, from 0.
|
|
65
|
+
row_count
|
|
66
|
+
The number of rows of the Layout.
|
|
67
|
+
column_count
|
|
68
|
+
The number of columns of the Layout.
|
|
69
|
+
"""
|
|
70
|
+
message = CELL_OUT_OF_RANGE_MESSAGE.format(
|
|
71
|
+
row=row, column=column, row_count=row_count, column_count=column_count
|
|
72
|
+
)
|
|
73
|
+
super().__init__(message)
|
|
74
|
+
self.row = row
|
|
75
|
+
self.column = column
|
|
76
|
+
self.row_count = row_count
|
|
77
|
+
self.column_count = column_count
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when a Table has no column of a given name.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
COLUMN_NOT_FOUND_MESSAGE = "No column is named {column_name!r}."
|
|
10
|
+
TABLE_COLUMN_NOT_FOUND_MESSAGE = "No column of {table_name} is named {column_name!r}."
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ColumnNotFoundError(NumdaplotError):
|
|
14
|
+
"""
|
|
15
|
+
Raised when an operation names a column that the Table does not have.
|
|
16
|
+
|
|
17
|
+
.. versionadded:: 0.1.0
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
column_name
|
|
22
|
+
The name that matches no column.
|
|
23
|
+
table_name
|
|
24
|
+
The Table searched, such as ``"the other Table"`` of a join. When omitted, only one Table is involved.
|
|
25
|
+
|
|
26
|
+
Attributes
|
|
27
|
+
----------
|
|
28
|
+
column_name
|
|
29
|
+
The name that matches no column.
|
|
30
|
+
table_name
|
|
31
|
+
The Table searched, or None.
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> table = ndp.Table.from_arrays({"price": ndp.Array.from_list([1, 2])})
|
|
37
|
+
>>> try:
|
|
38
|
+
... table.column("prise")
|
|
39
|
+
... except ndp.ColumnNotFoundError as error:
|
|
40
|
+
... print(error)
|
|
41
|
+
No column is named 'prise'.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, column_name: str, table_name: str | None = None) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Build the error message from the column name, and from the Table searched when it is given.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
column_name
|
|
53
|
+
The name that matches no column.
|
|
54
|
+
table_name
|
|
55
|
+
The Table searched. When omitted, only one Table is involved.
|
|
56
|
+
"""
|
|
57
|
+
message = COLUMN_NOT_FOUND_MESSAGE.format(column_name=column_name)
|
|
58
|
+
if table_name is not None:
|
|
59
|
+
message = TABLE_COLUMN_NOT_FOUND_MESSAGE.format(table_name=table_name, column_name=column_name)
|
|
60
|
+
|
|
61
|
+
super().__init__(message)
|
|
62
|
+
|
|
63
|
+
self.column_name = column_name
|
|
64
|
+
self.table_name = table_name
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when two settings that exclude each other are both given.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
CONFLICTING_SETTINGS_MESSAGE = "{first_name} and {second_name} cannot be given together."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ConflictingSettingsError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when two settings that exclude each other are both given.
|
|
15
|
+
|
|
16
|
+
For example, a ``ScatterChart`` colors its points with one ``color`` or by the values of ``color_by``.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
first_name
|
|
23
|
+
Name of the first setting.
|
|
24
|
+
second_name
|
|
25
|
+
Name of the second setting.
|
|
26
|
+
|
|
27
|
+
Attributes
|
|
28
|
+
----------
|
|
29
|
+
first_name
|
|
30
|
+
Name of the first setting.
|
|
31
|
+
second_name
|
|
32
|
+
Name of the second setting.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> try:
|
|
38
|
+
... ndp.ScatterChart(x="surface", y="price", color=ndp.Color.RED, color_by="city")
|
|
39
|
+
... except ndp.ConflictingSettingsError as error:
|
|
40
|
+
... print(error)
|
|
41
|
+
color and color_by cannot be given together.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self, first_name: str, second_name: str) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Build the error message from the two setting names.
|
|
47
|
+
|
|
48
|
+
.. versionadded:: 0.1.0
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
first_name
|
|
53
|
+
Name of the first setting.
|
|
54
|
+
second_name
|
|
55
|
+
Name of the second setting.
|
|
56
|
+
"""
|
|
57
|
+
message = CONFLICTING_SETTINGS_MESSAGE.format(first_name=first_name, second_name=second_name)
|
|
58
|
+
super().__init__(message)
|
|
59
|
+
self.first_name = first_name
|
|
60
|
+
self.second_name = second_name
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Error raised when an operation does not apply to the number of dimensions of an Array.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_error import NumdaplotError
|
|
8
|
+
|
|
9
|
+
DIMENSION_MESSAGE = "{operation} does not apply to an Array of {dimension_count} dimension(s)."
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DimensionError(NumdaplotError):
|
|
13
|
+
"""
|
|
14
|
+
Raised when an operation does not apply to the number of dimensions of an Array.
|
|
15
|
+
|
|
16
|
+
For example, an axis only applies to a two-dimensional Array, and a one-dimensional Array has no columns.
|
|
17
|
+
|
|
18
|
+
.. versionadded:: 0.1.0
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
operation
|
|
23
|
+
Description of the rejected operation.
|
|
24
|
+
dimension_count
|
|
25
|
+
Number of dimensions of the Array.
|
|
26
|
+
|
|
27
|
+
Attributes
|
|
28
|
+
----------
|
|
29
|
+
operation
|
|
30
|
+
Description of the rejected operation.
|
|
31
|
+
dimension_count
|
|
32
|
+
Number of dimensions of the Array.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> import numdaplot as ndp
|
|
37
|
+
>>> array = ndp.Array.from_list([1, 2, 3])
|
|
38
|
+
>>> try:
|
|
39
|
+
... array.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
|
|
40
|
+
... except ndp.DimensionError as error:
|
|
41
|
+
... print(error)
|
|
42
|
+
An axis does not apply to an Array of 1 dimension(s).
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, operation: str, dimension_count: int) -> None:
|
|
46
|
+
"""
|
|
47
|
+
Build the error message from the operation and the dimension count.
|
|
48
|
+
|
|
49
|
+
.. versionadded:: 0.1.0
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
operation
|
|
54
|
+
Description of the rejected operation.
|
|
55
|
+
dimension_count
|
|
56
|
+
Number of dimensions of the Array.
|
|
57
|
+
"""
|
|
58
|
+
message = DIMENSION_MESSAGE.format(operation=operation, dimension_count=dimension_count)
|
|
59
|
+
super().__init__(message)
|
|
60
|
+
|
|
61
|
+
self.operation = operation
|
|
62
|
+
self.dimension_count = dimension_count
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Warning emitted when a Plot or a Figure cannot be shown in a window.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.numdaplot_warning import NumdaplotWarning
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DisplayWarning(NumdaplotWarning):
|
|
11
|
+
"""
|
|
12
|
+
Emitted when ``show`` cannot open a window, because matplotlib has no graphical backend.
|
|
13
|
+
|
|
14
|
+
This happens outside a Jupyter notebook when Python has no ``tkinter``, or on a server or in a container without
|
|
15
|
+
a screen. Nothing is shown. The warning points at the line calling ``show`` in the calling code, and suggests
|
|
16
|
+
installing ``tkinter`` or saving the image with ``save``: ``No window can be opened, matplotlib has no graphical
|
|
17
|
+
backend here. Install tkinter (python3-tk on Debian and Ubuntu) to see the plot, or save it with Plot.save.``
|
|
18
|
+
|
|
19
|
+
Silence it with the standard ``warnings`` module, for one block of code or for a whole script, alone or with every
|
|
20
|
+
``NumdaplotWarning``.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Examples
|
|
25
|
+
--------
|
|
26
|
+
>>> import numdaplot as ndp
|
|
27
|
+
>>> import warnings
|
|
28
|
+
>>> plot = ndp.Plot.bar(ndp.Array.from_list([12.0, 15.5]))
|
|
29
|
+
>>> with warnings.catch_warnings():
|
|
30
|
+
... warnings.simplefilter("ignore", ndp.DisplayWarning)
|
|
31
|
+
... plot.show()
|
|
32
|
+
"""
|