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,120 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Common orders in which dates are written as texts.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DateFormat(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Common orders in which dates are written as texts, used by ``Conversion``.
|
|
13
|
+
|
|
14
|
+
When reading, the day, the month and the year are separated by ``"/"``, ``"-"`` or ``"."``, the same one twice;
|
|
15
|
+
days and months may have one digit, years have four. A ``_TIME`` member also needs the time, as ``"14:30"``
|
|
16
|
+
or ``"14:30:15"``, after a space, or after a ``"T"`` for ``YEAR_MONTH_DAY_TIME``. When writing, ``"/"`` separates
|
|
17
|
+
the day-month and month-day orders and ``"-"`` the year-month-day order, and the time is written ``"14:30:15"``.
|
|
18
|
+
|
|
19
|
+
Use ``CustomDateFormat`` for any other way of writing dates.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Examples
|
|
24
|
+
--------
|
|
25
|
+
>>> import numdaplot as ndp
|
|
26
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31/12/2026", "1.2.2026"])})
|
|
27
|
+
>>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.DAY_MONTH_YEAR))
|
|
28
|
+
day
|
|
29
|
+
DATE
|
|
30
|
+
0 2026-12-31
|
|
31
|
+
1 2026-02-01
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
DAY_MONTH_YEAR = auto()
|
|
35
|
+
"""
|
|
36
|
+
The day, the month, then the year: ``"31/12/2026"``.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> import numdaplot as ndp
|
|
41
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31/12/2026"])})
|
|
42
|
+
>>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.DAY_MONTH_YEAR))
|
|
43
|
+
day
|
|
44
|
+
DATE
|
|
45
|
+
0 2026-12-31
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
MONTH_DAY_YEAR = auto()
|
|
49
|
+
"""
|
|
50
|
+
The month, the day, then the year: ``"12/31/2026"``.
|
|
51
|
+
|
|
52
|
+
Examples
|
|
53
|
+
--------
|
|
54
|
+
>>> import numdaplot as ndp
|
|
55
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["12/31/2026"])})
|
|
56
|
+
>>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.MONTH_DAY_YEAR))
|
|
57
|
+
day
|
|
58
|
+
DATE
|
|
59
|
+
0 2026-12-31
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
YEAR_MONTH_DAY = auto()
|
|
63
|
+
"""
|
|
64
|
+
The year, the month, then the day: ``"2026-12-31"``. Read by default when no format is given.
|
|
65
|
+
|
|
66
|
+
Examples
|
|
67
|
+
--------
|
|
68
|
+
>>> import numdaplot as ndp
|
|
69
|
+
>>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["2026-12-31"])})
|
|
70
|
+
>>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.YEAR_MONTH_DAY))
|
|
71
|
+
day
|
|
72
|
+
DATE
|
|
73
|
+
0 2026-12-31
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
DAY_MONTH_YEAR_TIME = auto()
|
|
77
|
+
"""
|
|
78
|
+
The day, the month, the year, then the time: ``"31/12/2026 14:30"``.
|
|
79
|
+
|
|
80
|
+
Examples
|
|
81
|
+
--------
|
|
82
|
+
>>> import numdaplot as ndp
|
|
83
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list(["31/12/2026 14:30"])})
|
|
84
|
+
>>> day_first = ndp.DateFormat.DAY_MONTH_YEAR_TIME
|
|
85
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, format=day_first))
|
|
86
|
+
time
|
|
87
|
+
DATETIME
|
|
88
|
+
0 2026-12-31 14:30:00
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
MONTH_DAY_YEAR_TIME = auto()
|
|
92
|
+
"""
|
|
93
|
+
The month, the day, the year, then the time: ``"12/31/2026 14:30"``.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import numdaplot as ndp
|
|
98
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list(["12/31/2026 14:30"])})
|
|
99
|
+
>>> month_first = ndp.DateFormat.MONTH_DAY_YEAR_TIME
|
|
100
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, format=month_first))
|
|
101
|
+
time
|
|
102
|
+
DATETIME
|
|
103
|
+
0 2026-12-31 14:30:00
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
YEAR_MONTH_DAY_TIME = auto()
|
|
107
|
+
"""
|
|
108
|
+
The year, the month, the day, then the time after a space or a ``"T"``: ``"2026-12-31 14:30"`` or
|
|
109
|
+
``"2026-12-31T14:30"``.
|
|
110
|
+
|
|
111
|
+
Examples
|
|
112
|
+
--------
|
|
113
|
+
>>> import numdaplot as ndp
|
|
114
|
+
>>> times = ndp.Table.from_arrays({"time": ndp.Array.from_list(["2026-12-31T14:30:15"])})
|
|
115
|
+
>>> year_first = ndp.DateFormat.YEAR_MONTH_DAY_TIME
|
|
116
|
+
>>> times.convert(ndp.Conversion(column="time", dtype=ndp.Type.DATETIME, format=year_first))
|
|
117
|
+
time
|
|
118
|
+
DATETIME
|
|
119
|
+
0 2026-12-31 14:30:15
|
|
120
|
+
"""
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""
|
|
2
|
+
A part of each date, such as its month.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.dates.date_part_unit import DatePartUnit
|
|
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 DatePart(TimeFunction):
|
|
16
|
+
"""
|
|
17
|
+
A part of each date, datetime or time of day, as a number: its month, its day of the week, its hour...
|
|
18
|
+
|
|
19
|
+
The result is a ``FLOAT64`` Array, so a missing date gives a missing part. Every January of every year
|
|
20
|
+
gives 1: use ``DatePeriod`` to tell January 2026 from January 2027.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
unit
|
|
27
|
+
The part to read. ``DatePartUnit.HOUR``, ``DatePartUnit.MINUTE`` and ``DatePartUnit.SECOND`` need datetimes
|
|
28
|
+
or times of day, the only parts a time of day has.
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> from datetime import date
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> days = ndp.Array.from_list([date(2026, 1, 5), None, date(2027, 1, 9)])
|
|
40
|
+
>>> days.apply(ndp.DatePart(unit=ndp.DatePartUnit.MONTH))
|
|
41
|
+
Array([ 1., nan, 1.], dtype=FLOAT64)
|
|
42
|
+
>>> days.apply(ndp.DatePart(unit=ndp.DatePartUnit.WEEKDAY))
|
|
43
|
+
Array([ 1., nan, 6.], dtype=FLOAT64)
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
unit: DatePartUnit
|
|
47
|
+
|
|
48
|
+
def __post_init__(self) -> None:
|
|
49
|
+
"""
|
|
50
|
+
Check the type of every setting.
|
|
51
|
+
|
|
52
|
+
.. versionadded:: 0.1.0
|
|
53
|
+
|
|
54
|
+
Raises
|
|
55
|
+
------
|
|
56
|
+
InvalidTypeError
|
|
57
|
+
When a setting is not of the type its annotation names.
|
|
58
|
+
"""
|
|
59
|
+
require_field_types(self)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Parts of a date that DatePart reads.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DatePartUnit(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Parts of a date that ``DatePart`` reads, such as its month or its day of the week.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> from datetime import datetime
|
|
19
|
+
>>> import numdaplot as ndp
|
|
20
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
21
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.MONTH))
|
|
22
|
+
Array([12.], dtype=FLOAT64)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
YEAR = auto()
|
|
26
|
+
"""
|
|
27
|
+
The year, such as 2026.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> from datetime import datetime
|
|
32
|
+
>>> import numdaplot as ndp
|
|
33
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
34
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.YEAR))
|
|
35
|
+
Array([2026.], dtype=FLOAT64)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
QUARTER = auto()
|
|
39
|
+
"""
|
|
40
|
+
The quarter of the year, from 1 for January to March to 4 for October to December.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> from datetime import datetime
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
47
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.QUARTER))
|
|
48
|
+
Array([4.], dtype=FLOAT64)
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
MONTH = auto()
|
|
52
|
+
"""
|
|
53
|
+
The month, from 1 for January to 12 for December.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> from datetime import datetime
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
60
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.MONTH))
|
|
61
|
+
Array([12.], dtype=FLOAT64)
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
WEEK = auto()
|
|
65
|
+
"""
|
|
66
|
+
The ISO week number, from 1 to 53. Week 1 holds the first Thursday of the year.
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> from datetime import datetime
|
|
71
|
+
>>> import numdaplot as ndp
|
|
72
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
73
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.WEEK))
|
|
74
|
+
Array([53.], dtype=FLOAT64)
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
DAY = auto()
|
|
78
|
+
"""
|
|
79
|
+
The day of the month, from 1 to 31.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
>>> from datetime import datetime
|
|
84
|
+
>>> import numdaplot as ndp
|
|
85
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
86
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.DAY))
|
|
87
|
+
Array([31.], dtype=FLOAT64)
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
WEEKDAY = auto()
|
|
91
|
+
"""
|
|
92
|
+
The day of the week, from 1 for Monday to 7 for Sunday.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> from datetime import datetime
|
|
97
|
+
>>> import numdaplot as ndp
|
|
98
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
99
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.WEEKDAY))
|
|
100
|
+
Array([4.], dtype=FLOAT64)
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
DAY_OF_YEAR = auto()
|
|
104
|
+
"""
|
|
105
|
+
The day of the year, from 1 to 366.
|
|
106
|
+
|
|
107
|
+
Examples
|
|
108
|
+
--------
|
|
109
|
+
>>> from datetime import datetime
|
|
110
|
+
>>> import numdaplot as ndp
|
|
111
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
112
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.DAY_OF_YEAR))
|
|
113
|
+
Array([365.], dtype=FLOAT64)
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
HOUR = auto()
|
|
117
|
+
"""
|
|
118
|
+
The hour, from 0 to 23. Datetimes and times of day only.
|
|
119
|
+
|
|
120
|
+
Examples
|
|
121
|
+
--------
|
|
122
|
+
>>> from datetime import datetime
|
|
123
|
+
>>> import numdaplot as ndp
|
|
124
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
125
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.HOUR))
|
|
126
|
+
Array([14.], dtype=FLOAT64)
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
MINUTE = auto()
|
|
130
|
+
"""
|
|
131
|
+
The minute, from 0 to 59. Datetimes and times of day only.
|
|
132
|
+
|
|
133
|
+
Examples
|
|
134
|
+
--------
|
|
135
|
+
>>> from datetime import datetime
|
|
136
|
+
>>> import numdaplot as ndp
|
|
137
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
138
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.MINUTE))
|
|
139
|
+
Array([30.], dtype=FLOAT64)
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
SECOND = auto()
|
|
143
|
+
"""
|
|
144
|
+
The second, from 0 to 59. Datetimes and times of day only.
|
|
145
|
+
|
|
146
|
+
Examples
|
|
147
|
+
--------
|
|
148
|
+
>>> from datetime import datetime
|
|
149
|
+
>>> import numdaplot as ndp
|
|
150
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30, 15)])
|
|
151
|
+
>>> times.apply(ndp.DatePart(unit=ndp.DatePartUnit.SECOND))
|
|
152
|
+
Array([15.], dtype=FLOAT64)
|
|
153
|
+
"""
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""
|
|
2
|
+
The period holding each date, such as its month.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
|
|
9
|
+
from numdaplot.dates.period_unit import PeriodUnit
|
|
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 DatePeriod(TimeFunction):
|
|
16
|
+
"""
|
|
17
|
+
The period holding each date or datetime, given by its first day: its month, its week...
|
|
18
|
+
|
|
19
|
+
The result is a ``DATE`` Array, or a ``DATETIME`` Array for ``PeriodUnit.HOUR``. Add it to a Table with
|
|
20
|
+
``add_column``, then name it in ``group_by`` to compute one result per period.
|
|
21
|
+
|
|
22
|
+
.. versionadded:: 0.1.0
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
unit
|
|
27
|
+
The length of the periods. ``PeriodUnit.HOUR`` needs datetimes.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Raises
|
|
31
|
+
------
|
|
32
|
+
InvalidTypeError
|
|
33
|
+
When a setting is not of the type its annotation names.
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
>>> from datetime import date
|
|
38
|
+
>>> import numdaplot as ndp
|
|
39
|
+
>>> days = ndp.Array.from_list([date(2026, 1, 5), date(2026, 1, 28), date(2027, 1, 9)])
|
|
40
|
+
>>> days.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.MONTH))
|
|
41
|
+
Array(['2026-01-01', '2026-01-01', '2027-01-01'], dtype=DATE)
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
unit: PeriodUnit
|
|
45
|
+
|
|
46
|
+
def __post_init__(self) -> None:
|
|
47
|
+
"""
|
|
48
|
+
Check the type of every setting.
|
|
49
|
+
|
|
50
|
+
.. versionadded:: 0.1.0
|
|
51
|
+
|
|
52
|
+
Raises
|
|
53
|
+
------
|
|
54
|
+
InvalidTypeError
|
|
55
|
+
When a setting is not of the type its annotation names.
|
|
56
|
+
"""
|
|
57
|
+
require_field_types(self)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Each duration counted 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 DurationIn(TimeFunction):
|
|
16
|
+
"""
|
|
17
|
+
Each duration counted in a unit, as a decimal number: 36 hours in days gives 1.5.
|
|
18
|
+
|
|
19
|
+
The result is a ``FLOAT64`` Array. ``ToDuration`` does the opposite.
|
|
20
|
+
|
|
21
|
+
.. versionadded:: 0.1.0
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
unit
|
|
26
|
+
The unit to count in.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Raises
|
|
30
|
+
------
|
|
31
|
+
InvalidTypeError
|
|
32
|
+
When a setting is not of the type its annotation names.
|
|
33
|
+
|
|
34
|
+
Examples
|
|
35
|
+
--------
|
|
36
|
+
>>> from datetime import date
|
|
37
|
+
>>> import numdaplot as ndp
|
|
38
|
+
>>> arrivals = ndp.Array.from_list([date(2026, 1, 1), date(2026, 1, 10)])
|
|
39
|
+
>>> departures = ndp.Array.from_list([date(2026, 1, 4), date(2026, 1, 20)])
|
|
40
|
+
>>> stays = departures - arrivals
|
|
41
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.DAY))
|
|
42
|
+
Array([ 3., 10.], dtype=FLOAT64)
|
|
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,90 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Units in which durations are counted.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DurationUnit(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Units in which durations are counted, used by ``DurationIn`` and ``ToDuration``.
|
|
13
|
+
|
|
14
|
+
Months and years have no fixed length, so they are not duration units.
|
|
15
|
+
|
|
16
|
+
.. versionadded:: 0.1.0
|
|
17
|
+
|
|
18
|
+
Examples
|
|
19
|
+
--------
|
|
20
|
+
>>> from datetime import timedelta
|
|
21
|
+
>>> import numdaplot as ndp
|
|
22
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
23
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.DAY))
|
|
24
|
+
Array([14.], dtype=FLOAT64)
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
WEEK = auto()
|
|
28
|
+
"""
|
|
29
|
+
A week, 7 days.
|
|
30
|
+
|
|
31
|
+
Examples
|
|
32
|
+
--------
|
|
33
|
+
>>> from datetime import timedelta
|
|
34
|
+
>>> import numdaplot as ndp
|
|
35
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
36
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.WEEK))
|
|
37
|
+
Array([2.], dtype=FLOAT64)
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
DAY = auto()
|
|
41
|
+
"""
|
|
42
|
+
A day, 24 hours.
|
|
43
|
+
|
|
44
|
+
Examples
|
|
45
|
+
--------
|
|
46
|
+
>>> from datetime import timedelta
|
|
47
|
+
>>> import numdaplot as ndp
|
|
48
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
49
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.DAY))
|
|
50
|
+
Array([14.], dtype=FLOAT64)
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
HOUR = auto()
|
|
54
|
+
"""
|
|
55
|
+
An hour, 60 minutes.
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> from datetime import timedelta
|
|
60
|
+
>>> import numdaplot as ndp
|
|
61
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
62
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.HOUR))
|
|
63
|
+
Array([336.], dtype=FLOAT64)
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
MINUTE = auto()
|
|
67
|
+
"""
|
|
68
|
+
A minute, 60 seconds.
|
|
69
|
+
|
|
70
|
+
Examples
|
|
71
|
+
--------
|
|
72
|
+
>>> from datetime import timedelta
|
|
73
|
+
>>> import numdaplot as ndp
|
|
74
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
75
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.MINUTE))
|
|
76
|
+
Array([20160.], dtype=FLOAT64)
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
SECOND = auto()
|
|
80
|
+
"""
|
|
81
|
+
A second.
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> from datetime import timedelta
|
|
86
|
+
>>> import numdaplot as ndp
|
|
87
|
+
>>> stays = ndp.Array.from_list([timedelta(days=14)])
|
|
88
|
+
>>> stays.apply(ndp.DurationIn(unit=ndp.DurationUnit.SECOND))
|
|
89
|
+
Array([1209600.], dtype=FLOAT64)
|
|
90
|
+
"""
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Lengths of the periods DatePeriod groups dates by.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from enum import Enum, auto
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class PeriodUnit(Enum):
|
|
11
|
+
"""
|
|
12
|
+
Lengths of the periods ``DatePeriod`` groups dates by, such as the month or the week.
|
|
13
|
+
|
|
14
|
+
.. versionadded:: 0.1.0
|
|
15
|
+
|
|
16
|
+
Examples
|
|
17
|
+
--------
|
|
18
|
+
>>> from datetime import datetime
|
|
19
|
+
>>> import numdaplot as ndp
|
|
20
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
21
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.MONTH))
|
|
22
|
+
Array(['2026-12-01'], dtype=DATE)
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
YEAR = auto()
|
|
26
|
+
"""
|
|
27
|
+
The year, starting on January 1.
|
|
28
|
+
|
|
29
|
+
Examples
|
|
30
|
+
--------
|
|
31
|
+
>>> from datetime import datetime
|
|
32
|
+
>>> import numdaplot as ndp
|
|
33
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
34
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.YEAR))
|
|
35
|
+
Array(['2026-01-01'], dtype=DATE)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
QUARTER = auto()
|
|
39
|
+
"""
|
|
40
|
+
The quarter, starting on January 1, April 1, July 1 or October 1.
|
|
41
|
+
|
|
42
|
+
Examples
|
|
43
|
+
--------
|
|
44
|
+
>>> from datetime import datetime
|
|
45
|
+
>>> import numdaplot as ndp
|
|
46
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
47
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.QUARTER))
|
|
48
|
+
Array(['2026-10-01'], dtype=DATE)
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
MONTH = auto()
|
|
52
|
+
"""
|
|
53
|
+
The month, starting on its first day.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> from datetime import datetime
|
|
58
|
+
>>> import numdaplot as ndp
|
|
59
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
60
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.MONTH))
|
|
61
|
+
Array(['2026-12-01'], dtype=DATE)
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
WEEK = auto()
|
|
65
|
+
"""
|
|
66
|
+
The week, starting on Monday.
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> from datetime import datetime
|
|
71
|
+
>>> import numdaplot as ndp
|
|
72
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
73
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.WEEK))
|
|
74
|
+
Array(['2026-12-28'], dtype=DATE)
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
DAY = auto()
|
|
78
|
+
"""
|
|
79
|
+
The day.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
>>> from datetime import datetime
|
|
84
|
+
>>> import numdaplot as ndp
|
|
85
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
86
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.DAY))
|
|
87
|
+
Array(['2026-12-31'], dtype=DATE)
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
HOUR = auto()
|
|
91
|
+
"""
|
|
92
|
+
The hour, starting at minute 0. Datetimes only, the result is a ``DATETIME``.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> from datetime import datetime
|
|
97
|
+
>>> import numdaplot as ndp
|
|
98
|
+
>>> times = ndp.Array.from_list([datetime(2026, 12, 31, 14, 30)])
|
|
99
|
+
>>> times.apply(ndp.DatePeriod(unit=ndp.PeriodUnit.HOUR))
|
|
100
|
+
Array(['2026-12-31 14:00:00'], dtype=DATETIME)
|
|
101
|
+
"""
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base class of every function reading or building dates and durations.
|
|
3
|
+
|
|
4
|
+
.. versionadded:: 0.1.0
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from numdaplot.errors.refused_operation_error import RefusedOperationError
|
|
8
|
+
|
|
9
|
+
CONSTRUCTOR_OPERATION = "Creating a TimeFunction with ndp.TimeFunction()"
|
|
10
|
+
CONSTRUCTOR_ALTERNATIVE = "a time function such as ndp.DatePart"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TimeFunction:
|
|
14
|
+
"""
|
|
15
|
+
Base class of every function reading or building dates and durations, applied by ``Array.apply``.
|
|
16
|
+
|
|
17
|
+
A time function is immutable. Missing values stay missing.
|
|
18
|
+
|
|
19
|
+
Only its subclasses are created: calling ``ndp.TimeFunction()`` raises ``RefusedOperationError``.
|
|
20
|
+
|
|
21
|
+
Every time function, passed to ``Array.apply``:
|
|
22
|
+
|
|
23
|
+
|Time function|What it gives for each value|Example|
|
|
24
|
+
|---|---|---|
|
|
25
|
+
|``DatePart``|A part of a date or datetime, as a number|``ndp.DatePart(unit=ndp.DatePartUnit.MONTH)``|
|
|
26
|
+
|``DatePeriod``|The first day of the period holding it|``ndp.DatePeriod(unit=ndp.PeriodUnit.MONTH)``|
|
|
27
|
+
|``ToDuration``|A number read as a duration in a unit|``ndp.ToDuration(unit=ndp.DurationUnit.DAY)``|
|
|
28
|
+
|``DurationIn``|A duration counted in a unit, as a decimal|``ndp.DurationIn(unit=ndp.DurationUnit.DAY)``|
|
|
29
|
+
|
|
30
|
+
.. versionadded:: 0.1.0
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> from datetime import date
|
|
35
|
+
>>> import numdaplot as ndp
|
|
36
|
+
>>> days = ndp.Array.from_list([date(2026, 12, 31)])
|
|
37
|
+
>>> for function in [ndp.DatePart(unit=ndp.DatePartUnit.MONTH), ndp.DatePeriod(unit=ndp.PeriodUnit.YEAR)]:
|
|
38
|
+
... print(days.apply(function))
|
|
39
|
+
Array([12.], dtype=FLOAT64)
|
|
40
|
+
Array(['2026-01-01'], dtype=DATE)
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self) -> None:
|
|
44
|
+
"""
|
|
45
|
+
Refuse the creation of the base class itself, and let a subclass be created.
|
|
46
|
+
|
|
47
|
+
.. versionadded:: 0.1.0
|
|
48
|
+
|
|
49
|
+
Raises
|
|
50
|
+
------
|
|
51
|
+
RefusedOperationError
|
|
52
|
+
When the created object is a TimeFunction and not one of its subclasses.
|
|
53
|
+
"""
|
|
54
|
+
created_class = type(self)
|
|
55
|
+
if created_class is TimeFunction:
|
|
56
|
+
raise RefusedOperationError(CONSTRUCTOR_OPERATION, CONSTRUCTOR_ALTERNATIVE)
|