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.
Files changed (474) hide show
  1. numdaplot/__init__.py +506 -0
  2. numdaplot/arrays/__init__.py +5 -0
  3. numdaplot/arrays/array.py +92 -0
  4. numdaplot/arrays/array_arithmetic.py +404 -0
  5. numdaplot/arrays/array_calculation.py +143 -0
  6. numdaplot/arrays/array_conversion.py +150 -0
  7. numdaplot/arrays/array_creation.py +371 -0
  8. numdaplot/arrays/array_data.py +281 -0
  9. numdaplot/arrays/array_layout.py +179 -0
  10. numdaplot/arrays/array_logic.py +227 -0
  11. numdaplot/arrays/array_reflected_arithmetic.py +334 -0
  12. numdaplot/arrays/array_refusals.py +339 -0
  13. numdaplot/arrays/array_selection.py +195 -0
  14. numdaplot/arrays/array_sorting.py +59 -0
  15. numdaplot/arrays/axis_number.py +58 -0
  16. numdaplot/arrays/calculation/__init__.py +5 -0
  17. numdaplot/arrays/calculation/counting_statistics.py +325 -0
  18. numdaplot/arrays/calculation/location_statistics.py +268 -0
  19. numdaplot/arrays/calculation/math_function_values.py +183 -0
  20. numdaplot/arrays/calculation/statistic_values.py +209 -0
  21. numdaplot/arrays/calculation/time_function_values.py +419 -0
  22. numdaplot/arrays/conversion/__init__.py +5 -0
  23. numdaplot/arrays/conversion/array_text.py +62 -0
  24. numdaplot/arrays/conversion/equality_check.py +72 -0
  25. numdaplot/arrays/conversion/python_values.py +70 -0
  26. numdaplot/arrays/conversion/time_text.py +290 -0
  27. numdaplot/arrays/creation/__init__.py +5 -0
  28. numdaplot/arrays/creation/date_parts.py +89 -0
  29. numdaplot/arrays/creation/date_parts_values.py +437 -0
  30. numdaplot/arrays/creation/distribution.py +54 -0
  31. numdaplot/arrays/creation/filled_values.py +58 -0
  32. numdaplot/arrays/creation/list_conversion.py +311 -0
  33. numdaplot/arrays/creation/list_shape.py +97 -0
  34. numdaplot/arrays/creation/normal.py +65 -0
  35. numdaplot/arrays/creation/numpy_conversion.py +149 -0
  36. numdaplot/arrays/creation/random_integers.py +104 -0
  37. numdaplot/arrays/creation/random_values.py +97 -0
  38. numdaplot/arrays/creation/range_values.py +73 -0
  39. numdaplot/arrays/creation/spacing.py +84 -0
  40. numdaplot/arrays/creation/spacing_values.py +63 -0
  41. numdaplot/arrays/creation/uniform.py +63 -0
  42. numdaplot/arrays/equality.py +68 -0
  43. numdaplot/arrays/layout/__init__.py +5 -0
  44. numdaplot/arrays/layout/sorting_values.py +113 -0
  45. numdaplot/arrays/layout/unique_values.py +49 -0
  46. numdaplot/arrays/mapping/__init__.py +5 -0
  47. numdaplot/arrays/mapping/mapped_values.py +286 -0
  48. numdaplot/arrays/mapping/unmatched.py +50 -0
  49. numdaplot/arrays/mapping/value_change.py +55 -0
  50. numdaplot/arrays/mapping/value_mapping.py +161 -0
  51. numdaplot/arrays/math_functions/__init__.py +5 -0
  52. numdaplot/arrays/math_functions/absolute.py +27 -0
  53. numdaplot/arrays/math_functions/cosine.py +28 -0
  54. numdaplot/arrays/math_functions/exponential.py +27 -0
  55. numdaplot/arrays/math_functions/logarithm.py +72 -0
  56. numdaplot/arrays/math_functions/math_function.py +58 -0
  57. numdaplot/arrays/math_functions/round.py +58 -0
  58. numdaplot/arrays/math_functions/sine.py +28 -0
  59. numdaplot/arrays/math_functions/square_root.py +27 -0
  60. numdaplot/arrays/operations/__init__.py +5 -0
  61. numdaplot/arrays/operations/boolean_operands.py +48 -0
  62. numdaplot/arrays/operations/combination.py +157 -0
  63. numdaplot/arrays/operations/float_errors.py +170 -0
  64. numdaplot/arrays/operations/integer_bounds.py +175 -0
  65. numdaplot/arrays/operations/integer_rules.py +397 -0
  66. numdaplot/arrays/operations/operand.py +139 -0
  67. numdaplot/arrays/operations/time_arithmetic.py +479 -0
  68. numdaplot/arrays/operations/time_bounds.py +286 -0
  69. numdaplot/arrays/operations/time_result_bounds.py +397 -0
  70. numdaplot/arrays/operations/transformation.py +54 -0
  71. numdaplot/arrays/operations/type_requirements.py +94 -0
  72. numdaplot/arrays/replacement.py +66 -0
  73. numdaplot/arrays/selection/__init__.py +5 -0
  74. numdaplot/arrays/selection/comparison_masks.py +131 -0
  75. numdaplot/arrays/selection/membership_masks.py +118 -0
  76. numdaplot/arrays/selection/missing_mask.py +50 -0
  77. numdaplot/arrays/selection/region_index.py +178 -0
  78. numdaplot/arrays/selection/replaced_values.py +120 -0
  79. numdaplot/arrays/selection/rule_mask.py +83 -0
  80. numdaplot/arrays/selection/time_reference.py +172 -0
  81. numdaplot/arrays/shape.py +74 -0
  82. numdaplot/arrays/type_match.py +51 -0
  83. numdaplot/data_types/__init__.py +5 -0
  84. numdaplot/data_types/library.py +57 -0
  85. numdaplot/data_types/numpy_mapping.py +207 -0
  86. numdaplot/data_types/pandas_mapping.py +114 -0
  87. numdaplot/data_types/time_of_day.py +292 -0
  88. numdaplot/data_types/type.py +224 -0
  89. numdaplot/data_types/value_family.py +149 -0
  90. numdaplot/data_types/value_type.py +147 -0
  91. numdaplot/dates/__init__.py +5 -0
  92. numdaplot/dates/custom_date_format.py +83 -0
  93. numdaplot/dates/date_format.py +120 -0
  94. numdaplot/dates/date_part.py +59 -0
  95. numdaplot/dates/date_part_unit.py +153 -0
  96. numdaplot/dates/date_period.py +57 -0
  97. numdaplot/dates/duration_in.py +58 -0
  98. numdaplot/dates/duration_unit.py +90 -0
  99. numdaplot/dates/period_unit.py +101 -0
  100. numdaplot/dates/time_function.py +56 -0
  101. numdaplot/dates/time_zone.py +68 -0
  102. numdaplot/dates/time_zone_change.py +71 -0
  103. numdaplot/dates/time_zone_mode.py +81 -0
  104. numdaplot/dates/to_duration.py +58 -0
  105. numdaplot/errors/__init__.py +7 -0
  106. numdaplot/errors/broadcast_warning.py +36 -0
  107. numdaplot/errors/calculation_warning.py +35 -0
  108. numdaplot/errors/cell_out_of_range_error.py +77 -0
  109. numdaplot/errors/column_not_found_error.py +64 -0
  110. numdaplot/errors/conflicting_settings_error.py +60 -0
  111. numdaplot/errors/dimension_error.py +62 -0
  112. numdaplot/errors/display_warning.py +32 -0
  113. numdaplot/errors/duplicate_column_error.py +82 -0
  114. numdaplot/errors/duplicate_label_error.py +55 -0
  115. numdaplot/errors/duplicate_statistic_error.py +55 -0
  116. numdaplot/errors/duplicate_value_error.py +54 -0
  117. numdaplot/errors/empty_array_error.py +55 -0
  118. numdaplot/errors/empty_list_error.py +52 -0
  119. numdaplot/errors/empty_region_error.py +34 -0
  120. numdaplot/errors/empty_text_error.py +34 -0
  121. numdaplot/errors/empty_total_error.py +62 -0
  122. numdaplot/errors/empty_values_error.py +34 -0
  123. numdaplot/errors/file_access_error.py +70 -0
  124. numdaplot/errors/file_exists_error.py +62 -0
  125. numdaplot/errors/file_not_found_error.py +56 -0
  126. numdaplot/errors/incompatible_charts_error.py +80 -0
  127. numdaplot/errors/incompatible_types_error.py +104 -0
  128. numdaplot/errors/integer_overflow_error.py +61 -0
  129. numdaplot/errors/invalid_base_error.py +52 -0
  130. numdaplot/errors/invalid_bin_width_error.py +66 -0
  131. numdaplot/errors/invalid_bounds_error.py +58 -0
  132. numdaplot/errors/invalid_chart_data_error.py +81 -0
  133. numdaplot/errors/invalid_color_count_error.py +63 -0
  134. numdaplot/errors/invalid_color_error.py +51 -0
  135. numdaplot/errors/invalid_column_name_error.py +52 -0
  136. numdaplot/errors/invalid_conversion_error.py +119 -0
  137. numdaplot/errors/invalid_count_error.py +61 -0
  138. numdaplot/errors/invalid_date_format_error.py +51 -0
  139. numdaplot/errors/invalid_deviation_error.py +52 -0
  140. numdaplot/errors/invalid_fraction_error.py +51 -0
  141. numdaplot/errors/invalid_label_count_error.py +61 -0
  142. numdaplot/errors/invalid_limits_error.py +111 -0
  143. numdaplot/errors/invalid_opacity_error.py +52 -0
  144. numdaplot/errors/invalid_point_size_error.py +52 -0
  145. numdaplot/errors/invalid_position_error.py +106 -0
  146. numdaplot/errors/invalid_resolution_error.py +51 -0
  147. numdaplot/errors/invalid_rotation_error.py +53 -0
  148. numdaplot/errors/invalid_seed_error.py +53 -0
  149. numdaplot/errors/invalid_separator_error.py +52 -0
  150. numdaplot/errors/invalid_shape_error.py +52 -0
  151. numdaplot/errors/invalid_sheet_name_error.py +54 -0
  152. numdaplot/errors/invalid_size_error.py +58 -0
  153. numdaplot/errors/invalid_step_error.py +77 -0
  154. numdaplot/errors/invalid_suffixes_error.py +61 -0
  155. numdaplot/errors/invalid_time_zone_change_error.py +63 -0
  156. numdaplot/errors/invalid_type_error.py +79 -0
  157. numdaplot/errors/irregular_list_error.py +36 -0
  158. numdaplot/errors/join_relation_error.py +183 -0
  159. numdaplot/errors/missing_dependency_error.py +58 -0
  160. numdaplot/errors/missing_type_error.py +36 -0
  161. numdaplot/errors/missing_value_error.py +62 -0
  162. numdaplot/errors/not_single_value_error.py +53 -0
  163. numdaplot/errors/numdaplot_error.py +25 -0
  164. numdaplot/errors/numdaplot_warning.py +34 -0
  165. numdaplot/errors/occupied_cell_error.py +63 -0
  166. numdaplot/errors/out_of_domain_error.py +70 -0
  167. numdaplot/errors/readability_warning.py +35 -0
  168. numdaplot/errors/refused_operation_error.py +64 -0
  169. numdaplot/errors/refused_setting_error.py +60 -0
  170. numdaplot/errors/rejected_dates.py +60 -0
  171. numdaplot/errors/repeated_key.py +36 -0
  172. numdaplot/errors/shape_mismatch_error.py +67 -0
  173. numdaplot/errors/time_overflow_error.py +131 -0
  174. numdaplot/errors/time_zone_mismatch_error.py +83 -0
  175. numdaplot/errors/unknown_time_zone_error.py +51 -0
  176. numdaplot/errors/unmatched_value_error.py +81 -0
  177. numdaplot/errors/unsupported_image_format_error.py +56 -0
  178. numdaplot/errors/unsupported_index_error.py +38 -0
  179. numdaplot/errors/unsupported_missing_error.py +129 -0
  180. numdaplot/errors/unsupported_type_error.py +62 -0
  181. numdaplot/errors/value_conversion_error.py +215 -0
  182. numdaplot/ordering/__init__.py +5 -0
  183. numdaplot/ordering/missing_position.py +46 -0
  184. numdaplot/ordering/order.py +46 -0
  185. numdaplot/package_version.py +36 -0
  186. numdaplot/plots/__init__.py +5 -0
  187. numdaplot/plots/chart_layer.py +47 -0
  188. numdaplot/plots/charts/__init__.py +5 -0
  189. numdaplot/plots/charts/bar_chart.py +98 -0
  190. numdaplot/plots/charts/bar_layout.py +58 -0
  191. numdaplot/plots/charts/bin_count.py +61 -0
  192. numdaplot/plots/charts/bin_width.py +78 -0
  193. numdaplot/plots/charts/box_chart.py +97 -0
  194. numdaplot/plots/charts/cell_values.py +61 -0
  195. numdaplot/plots/charts/chart.py +59 -0
  196. numdaplot/plots/charts/chart_settings.py +105 -0
  197. numdaplot/plots/charts/color_scale.py +147 -0
  198. numdaplot/plots/charts/heatmap_chart.py +92 -0
  199. numdaplot/plots/charts/histogram_chart.py +93 -0
  200. numdaplot/plots/charts/line_chart.py +100 -0
  201. numdaplot/plots/charts/line_type.py +75 -0
  202. numdaplot/plots/charts/marker_shape.py +113 -0
  203. numdaplot/plots/charts/missing_chart.py +60 -0
  204. numdaplot/plots/charts/missing_map_chart.py +27 -0
  205. numdaplot/plots/charts/orientation.py +58 -0
  206. numdaplot/plots/charts/outliers.py +49 -0
  207. numdaplot/plots/charts/percentages.py +55 -0
  208. numdaplot/plots/charts/pie_chart.py +87 -0
  209. numdaplot/plots/charts/scatter_chart.py +159 -0
  210. numdaplot/plots/charts/value_axis.py +66 -0
  211. numdaplot/plots/data/__init__.py +5 -0
  212. numdaplot/plots/data/array_values.py +128 -0
  213. numdaplot/plots/data/chart_data.py +143 -0
  214. numdaplot/plots/data/chart_values.py +109 -0
  215. numdaplot/plots/data/column_reading.py +468 -0
  216. numdaplot/plots/data/heatmap_values.py +63 -0
  217. numdaplot/plots/data/missing_cells.py +165 -0
  218. numdaplot/plots/data/pie_values.py +215 -0
  219. numdaplot/plots/data/point_values.py +249 -0
  220. numdaplot/plots/data/position_kind.py +83 -0
  221. numdaplot/plots/data/renamed_layers.py +340 -0
  222. numdaplot/plots/data/sample_values.py +160 -0
  223. numdaplot/plots/data/shown_columns.py +248 -0
  224. numdaplot/plots/data/table_values.py +256 -0
  225. numdaplot/plots/data/unique_labels.py +45 -0
  226. numdaplot/plots/drawing/__init__.py +5 -0
  227. numdaplot/plots/drawing/bar_drawing.py +316 -0
  228. numdaplot/plots/drawing/box_drawing.py +344 -0
  229. numdaplot/plots/drawing/cell_merging.py +237 -0
  230. numdaplot/plots/drawing/chart_texts.py +124 -0
  231. numdaplot/plots/drawing/color_bar.py +57 -0
  232. numdaplot/plots/drawing/color_scale_values.py +120 -0
  233. numdaplot/plots/drawing/default_labels.py +41 -0
  234. numdaplot/plots/drawing/drawn_chart.py +50 -0
  235. numdaplot/plots/drawing/grid_axes.py +75 -0
  236. numdaplot/plots/drawing/heatmap_drawing.py +313 -0
  237. numdaplot/plots/drawing/histogram_drawing.py +350 -0
  238. numdaplot/plots/drawing/label_room.py +344 -0
  239. numdaplot/plots/drawing/label_thinning.py +216 -0
  240. numdaplot/plots/drawing/layer_alignment.py +319 -0
  241. numdaplot/plots/drawing/layer_colors.py +123 -0
  242. numdaplot/plots/drawing/line_drawing.py +85 -0
  243. numdaplot/plots/drawing/marker_codes.py +20 -0
  244. numdaplot/plots/drawing/missing_drawing.py +360 -0
  245. numdaplot/plots/drawing/moment_period_formatter.py +253 -0
  246. numdaplot/plots/drawing/pie_drawing.py +185 -0
  247. numdaplot/plots/drawing/plot_axes.py +38 -0
  248. numdaplot/plots/drawing/plot_drawing.py +288 -0
  249. numdaplot/plots/drawing/plot_theme.py +45 -0
  250. numdaplot/plots/drawing/position_axis.py +278 -0
  251. numdaplot/plots/drawing/scatter_drawing.py +364 -0
  252. numdaplot/plots/drawing/series_colors.py +177 -0
  253. numdaplot/plots/drawing/size_inches.py +45 -0
  254. numdaplot/plots/drawing/style_drawing.py +410 -0
  255. numdaplot/plots/drawing/text_contrast.py +44 -0
  256. numdaplot/plots/drawing/tick_rotation.py +354 -0
  257. numdaplot/plots/drawing/time_axis.py +212 -0
  258. numdaplot/plots/drawing/whole_numbers.py +72 -0
  259. numdaplot/plots/figure/__init__.py +5 -0
  260. numdaplot/plots/figure/cell.py +95 -0
  261. numdaplot/plots/figure/figure.py +256 -0
  262. numdaplot/plots/figure/figure_drawing.py +99 -0
  263. numdaplot/plots/figure/figure_style.py +60 -0
  264. numdaplot/plots/figure/layout.py +71 -0
  265. numdaplot/plots/figure/placement.py +150 -0
  266. numdaplot/plots/layer_reading.py +166 -0
  267. numdaplot/plots/output/__init__.py +5 -0
  268. numdaplot/plots/output/image_saving.py +187 -0
  269. numdaplot/plots/output/plot_display.py +181 -0
  270. numdaplot/plots/output/shown_object.py +45 -0
  271. numdaplot/plots/overlay_checks.py +245 -0
  272. numdaplot/plots/plot.py +31 -0
  273. numdaplot/plots/plot_data.py +140 -0
  274. numdaplot/plots/plot_distribution_creation.py +237 -0
  275. numdaplot/plots/plot_output.py +124 -0
  276. numdaplot/plots/plot_overlays.py +273 -0
  277. numdaplot/plots/plot_overview_creation.py +195 -0
  278. numdaplot/plots/plot_series_creation.py +213 -0
  279. numdaplot/plots/style/__init__.py +5 -0
  280. numdaplot/plots/style/axis_settings.py +60 -0
  281. numdaplot/plots/style/color.py +168 -0
  282. numdaplot/plots/style/custom_color.py +65 -0
  283. numdaplot/plots/style/grid_lines.py +49 -0
  284. numdaplot/plots/style/image_options.py +71 -0
  285. numdaplot/plots/style/legend_position.py +149 -0
  286. numdaplot/plots/style/plot_style.py +136 -0
  287. numdaplot/plots/style/size.py +70 -0
  288. numdaplot/plots/style/size_unit.py +62 -0
  289. numdaplot/positions/__init__.py +5 -0
  290. numdaplot/positions/axis.py +54 -0
  291. numdaplot/positions/index.py +51 -0
  292. numdaplot/positions/range.py +90 -0
  293. numdaplot/positions/region.py +92 -0
  294. numdaplot/py.typed +0 -0
  295. numdaplot/ratios/__init__.py +5 -0
  296. numdaplot/ratios/fraction.py +40 -0
  297. numdaplot/ratios/measure.py +48 -0
  298. numdaplot/rules/__init__.py +5 -0
  299. numdaplot/rules/between.py +78 -0
  300. numdaplot/rules/bounds.py +83 -0
  301. numdaplot/rules/case.py +48 -0
  302. numdaplot/rules/contains.py +63 -0
  303. numdaplot/rules/equal.py +43 -0
  304. numdaplot/rules/greater.py +39 -0
  305. numdaplot/rules/greater_or_equal.py +38 -0
  306. numdaplot/rules/is_in.py +67 -0
  307. numdaplot/rules/is_missing.py +25 -0
  308. numdaplot/rules/is_present.py +25 -0
  309. numdaplot/rules/less.py +39 -0
  310. numdaplot/rules/less_or_equal.py +38 -0
  311. numdaplot/rules/not_equal.py +45 -0
  312. numdaplot/rules/rule.py +62 -0
  313. numdaplot/rules/rule_values.py +44 -0
  314. numdaplot/rules/value_rule.py +110 -0
  315. numdaplot/settings/__init__.py +5 -0
  316. numdaplot/settings/argument_types.py +327 -0
  317. numdaplot/settings/field_types.py +593 -0
  318. numdaplot/statistics/__init__.py +5 -0
  319. numdaplot/statistics/count.py +71 -0
  320. numdaplot/statistics/count_distinct.py +27 -0
  321. numdaplot/statistics/counted_missing.py +46 -0
  322. numdaplot/statistics/maximum.py +27 -0
  323. numdaplot/statistics/mean.py +27 -0
  324. numdaplot/statistics/median.py +27 -0
  325. numdaplot/statistics/minimum.py +27 -0
  326. numdaplot/statistics/most_frequent.py +27 -0
  327. numdaplot/statistics/most_frequent_count.py +27 -0
  328. numdaplot/statistics/quantile.py +61 -0
  329. numdaplot/statistics/standard_deviation.py +29 -0
  330. numdaplot/statistics/statistic.py +63 -0
  331. numdaplot/statistics/sum.py +27 -0
  332. numdaplot/tables/__init__.py +5 -0
  333. numdaplot/tables/aggregation/__init__.py +5 -0
  334. numdaplot/tables/aggregation/aggregated_frame.py +189 -0
  335. numdaplot/tables/aggregation/aggregation.py +97 -0
  336. numdaplot/tables/aggregation/calculation.py +123 -0
  337. numdaplot/tables/aggregation/result_column.py +108 -0
  338. numdaplot/tables/aggregation/row_groups.py +96 -0
  339. numdaplot/tables/aggregation/statistic_name.py +122 -0
  340. numdaplot/tables/columns/__init__.py +5 -0
  341. numdaplot/tables/columns/added_column.py +89 -0
  342. numdaplot/tables/columns/boolean_conversion.py +144 -0
  343. numdaplot/tables/columns/boolean_rule.py +59 -0
  344. numdaplot/tables/columns/bracket_end.py +50 -0
  345. numdaplot/tables/columns/bracket_names.py +346 -0
  346. numdaplot/tables/columns/bracketed_column.py +179 -0
  347. numdaplot/tables/columns/brackets.py +234 -0
  348. numdaplot/tables/columns/chosen_columns.py +55 -0
  349. numdaplot/tables/columns/column_choice.py +84 -0
  350. numdaplot/tables/columns/column_mode.py +64 -0
  351. numdaplot/tables/columns/column_names.py +186 -0
  352. numdaplot/tables/columns/conversion.py +103 -0
  353. numdaplot/tables/columns/converted_column.py +669 -0
  354. numdaplot/tables/columns/date_conversion.py +526 -0
  355. numdaplot/tables/columns/date_range.py +135 -0
  356. numdaplot/tables/columns/name_change.py +67 -0
  357. numdaplot/tables/columns/new_column.py +79 -0
  358. numdaplot/tables/columns/number_conversion.py +281 -0
  359. numdaplot/tables/columns/renamed_columns.py +60 -0
  360. numdaplot/tables/columns/renaming.py +81 -0
  361. numdaplot/tables/columns/text_conversion.py +70 -0
  362. numdaplot/tables/columns/time_conversion.py +313 -0
  363. numdaplot/tables/columns/time_zone_conversion.py +128 -0
  364. numdaplot/tables/conflict.py +68 -0
  365. numdaplot/tables/description/__init__.py +5 -0
  366. numdaplot/tables/description/described_frame.py +335 -0
  367. numdaplot/tables/description/description.py +155 -0
  368. numdaplot/tables/duplicates/__init__.py +5 -0
  369. numdaplot/tables/duplicates/deduplicated_frame.py +66 -0
  370. numdaplot/tables/duplicates/deduplication.py +88 -0
  371. numdaplot/tables/duplicates/keep.py +81 -0
  372. numdaplot/tables/files/__init__.py +5 -0
  373. numdaplot/tables/files/column_names.py +60 -0
  374. numdaplot/tables/files/csv_file.py +265 -0
  375. numdaplot/tables/files/csv_read_options.py +89 -0
  376. numdaplot/tables/files/csv_separator.py +41 -0
  377. numdaplot/tables/files/csv_write_options.py +79 -0
  378. numdaplot/tables/files/decimal_count.py +42 -0
  379. numdaplot/tables/files/encoding.py +82 -0
  380. numdaplot/tables/files/excel_file.py +171 -0
  381. numdaplot/tables/files/excel_read_options.py +79 -0
  382. numdaplot/tables/files/excel_sheet.py +50 -0
  383. numdaplot/tables/files/excel_time_cells.py +146 -0
  384. numdaplot/tables/files/excel_write_options.py +63 -0
  385. numdaplot/tables/files/file_access.py +152 -0
  386. numdaplot/tables/files/file_paths.py +106 -0
  387. numdaplot/tables/files/json_decimals.py +387 -0
  388. numdaplot/tables/files/json_file.py +203 -0
  389. numdaplot/tables/files/json_layout.py +63 -0
  390. numdaplot/tables/files/json_read_options.py +64 -0
  391. numdaplot/tables/files/json_write_options.py +71 -0
  392. numdaplot/tables/files/missing_texts.py +63 -0
  393. numdaplot/tables/files/optional_package.py +42 -0
  394. numdaplot/tables/files/pandas_backend.py +11 -0
  395. numdaplot/tables/files/parquet_file.py +91 -0
  396. numdaplot/tables/files/parquet_read_options.py +56 -0
  397. numdaplot/tables/files/sas_file.py +94 -0
  398. numdaplot/tables/files/sas_read_options.py +67 -0
  399. numdaplot/tables/files/stata_file.py +83 -0
  400. numdaplot/tables/files/stata_read_options.py +56 -0
  401. numdaplot/tables/files/xpt_read_options.py +65 -0
  402. numdaplot/tables/filtering/__init__.py +5 -0
  403. numdaplot/tables/filtering/checked_frame.py +60 -0
  404. numdaplot/tables/filtering/column_mask.py +71 -0
  405. numdaplot/tables/filtering/column_match.py +62 -0
  406. numdaplot/tables/filtering/condition.py +94 -0
  407. numdaplot/tables/filtering/filter.py +74 -0
  408. numdaplot/tables/filtering/filter_mode.py +67 -0
  409. numdaplot/tables/filtering/row_mask.py +152 -0
  410. numdaplot/tables/filtering/rule_moments.py +164 -0
  411. numdaplot/tables/frames/__init__.py +5 -0
  412. numdaplot/tables/frames/array_frame.py +95 -0
  413. numdaplot/tables/frames/cleaned_names.py +132 -0
  414. numdaplot/tables/frames/column.py +15 -0
  415. numdaplot/tables/frames/column_values.py +273 -0
  416. numdaplot/tables/frames/frame_equality.py +130 -0
  417. numdaplot/tables/frames/frame_normalization.py +459 -0
  418. numdaplot/tables/frames/named_column_errors.py +85 -0
  419. numdaplot/tables/frames/pandas_decimals.py +113 -0
  420. numdaplot/tables/frames/region_positions.py +113 -0
  421. numdaplot/tables/frames/table_text.py +222 -0
  422. numdaplot/tables/frames/time_columns.py +345 -0
  423. numdaplot/tables/frames/time_range_errors.py +117 -0
  424. numdaplot/tables/frames/time_zones.py +271 -0
  425. numdaplot/tables/joining/__init__.py +5 -0
  426. numdaplot/tables/joining/join.py +110 -0
  427. numdaplot/tables/joining/join_keys.py +367 -0
  428. numdaplot/tables/joining/join_mode.py +93 -0
  429. numdaplot/tables/joining/join_relation.py +149 -0
  430. numdaplot/tables/joining/join_suffixes.py +71 -0
  431. numdaplot/tables/joining/joined_frame.py +166 -0
  432. numdaplot/tables/joining/joined_names.py +107 -0
  433. numdaplot/tables/joining/joined_rows.py +235 -0
  434. numdaplot/tables/joining/key_types.py +57 -0
  435. numdaplot/tables/joining/relation.py +78 -0
  436. numdaplot/tables/missing/__init__.py +5 -0
  437. numdaplot/tables/missing/missing_count.py +59 -0
  438. numdaplot/tables/missing/missing_counts.py +214 -0
  439. numdaplot/tables/missing/missing_drop.py +98 -0
  440. numdaplot/tables/missing/missing_mode.py +63 -0
  441. numdaplot/tables/missing/missing_ratio.py +71 -0
  442. numdaplot/tables/missing/missing_removal.py +257 -0
  443. numdaplot/tables/missing/missing_summary.py +174 -0
  444. numdaplot/tables/missing/ratio_comparison.py +70 -0
  445. numdaplot/tables/pivot/__init__.py +5 -0
  446. numdaplot/tables/pivot/pivot_table.py +104 -0
  447. numdaplot/tables/pivot/pivoted_frame.py +244 -0
  448. numdaplot/tables/preview/__init__.py +5 -0
  449. numdaplot/tables/preview/notebook_display.py +238 -0
  450. numdaplot/tables/preview/preview.py +100 -0
  451. numdaplot/tables/preview/preview_rows.py +55 -0
  452. numdaplot/tables/preview/shown_columns.py +62 -0
  453. numdaplot/tables/preview/side.py +82 -0
  454. numdaplot/tables/sorting/__init__.py +5 -0
  455. numdaplot/tables/sorting/sort_key.py +71 -0
  456. numdaplot/tables/sorting/sorted_frame.py +81 -0
  457. numdaplot/tables/sorting/sorting.py +82 -0
  458. numdaplot/tables/table.py +71 -0
  459. numdaplot/tables/table_calculation.py +172 -0
  460. numdaplot/tables/table_columns.py +214 -0
  461. numdaplot/tables/table_conversion.py +351 -0
  462. numdaplot/tables/table_data.py +321 -0
  463. numdaplot/tables/table_display.py +56 -0
  464. numdaplot/tables/table_joining.py +80 -0
  465. numdaplot/tables/table_layout.py +105 -0
  466. numdaplot/tables/table_missing.py +146 -0
  467. numdaplot/tables/table_reading.py +451 -0
  468. numdaplot/tables/table_refusals.py +295 -0
  469. numdaplot/tables/table_selection.py +163 -0
  470. numdaplot/tables/table_writing.py +269 -0
  471. numdaplot-0.1.0.dist-info/METADATA +176 -0
  472. numdaplot-0.1.0.dist-info/RECORD +474 -0
  473. numdaplot-0.1.0.dist-info/WHEEL +4 -0
  474. 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)