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,224 @@
1
+ """
2
+ Types of the values stored in an Array or in a Table column.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Type(Enum):
11
+ """
12
+ Type of the values stored in an Array or in a Table column.
13
+
14
+ Integers wrap around silently when a result exceeds their range, as in numpy:
15
+ with ``INT8``, ``127 + 1`` gives ``-128``. Prefer ``INT64`` unless memory matters.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Examples
20
+ --------
21
+ >>> import numdaplot as ndp
22
+ >>> ndp.Array.from_list([1, 2], dtype=ndp.Type.FLOAT32)
23
+ Array([1., 2.], dtype=FLOAT32)
24
+ >>> ndp.Array.from_list([1.5, 2.0]).dtype
25
+ <Type.FLOAT64: 10>
26
+ """
27
+
28
+ INT8 = auto()
29
+ """
30
+ Signed integer from -128 to 127, 1 byte per value.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT8)
36
+ Array([ 1, -2], dtype=INT8)
37
+ """
38
+
39
+ INT16 = auto()
40
+ """
41
+ Signed integer from -32 768 to 32 767, 2 bytes per value.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT16)
47
+ Array([ 1, -2], dtype=INT16)
48
+ """
49
+
50
+ INT32 = auto()
51
+ """
52
+ Signed integer of about +/- 2 billion, 4 bytes per value.
53
+
54
+ Examples
55
+ --------
56
+ >>> import numdaplot as ndp
57
+ >>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT32)
58
+ Array([ 1, -2], dtype=INT32)
59
+ """
60
+
61
+ INT64 = auto()
62
+ """
63
+ Signed integer of about +/- 9.2 * 10**18, 8 bytes per value.
64
+
65
+ Examples
66
+ --------
67
+ >>> import numdaplot as ndp
68
+ >>> ndp.Array.from_list([1, -2], dtype=ndp.Type.INT64)
69
+ Array([ 1, -2], dtype=INT64)
70
+ """
71
+
72
+ UINT8 = auto()
73
+ """
74
+ Unsigned integer from 0 to 255, 1 byte per value.
75
+
76
+ Examples
77
+ --------
78
+ >>> import numdaplot as ndp
79
+ >>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT8)
80
+ Array([1, 2], dtype=UINT8)
81
+ """
82
+
83
+ UINT16 = auto()
84
+ """
85
+ Unsigned integer from 0 to 65 535, 2 bytes per value.
86
+
87
+ Examples
88
+ --------
89
+ >>> import numdaplot as ndp
90
+ >>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT16)
91
+ Array([1, 2], dtype=UINT16)
92
+ """
93
+
94
+ UINT32 = auto()
95
+ """
96
+ Unsigned integer from 0 to about 4 billion, 4 bytes per value.
97
+
98
+ Examples
99
+ --------
100
+ >>> import numdaplot as ndp
101
+ >>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT32)
102
+ Array([1, 2], dtype=UINT32)
103
+ """
104
+
105
+ UINT64 = auto()
106
+ """
107
+ Unsigned integer from 0 to about 1.8 * 10**19, 8 bytes per value.
108
+
109
+ Examples
110
+ --------
111
+ >>> import numdaplot as ndp
112
+ >>> ndp.Array.from_list([1, 2], dtype=ndp.Type.UINT64)
113
+ Array([1, 2], dtype=UINT64)
114
+ """
115
+
116
+ FLOAT32 = auto()
117
+ """
118
+ Decimal number with about 7 significant digits, 4 bytes per value.
119
+
120
+ Examples
121
+ --------
122
+ >>> import numdaplot as ndp
123
+ >>> ndp.Array.from_list([1.5, 2.0], dtype=ndp.Type.FLOAT32)
124
+ Array([1.5, 2. ], dtype=FLOAT32)
125
+ """
126
+
127
+ FLOAT64 = auto()
128
+ """
129
+ Decimal number with about 16 significant digits, 8 bytes per value. Default decimal type.
130
+
131
+ Examples
132
+ --------
133
+ >>> import numdaplot as ndp
134
+ >>> ndp.Array.from_list([1.5, None], dtype=ndp.Type.FLOAT64)
135
+ Array([1.5, nan], dtype=FLOAT64)
136
+ """
137
+
138
+ BOOL = auto()
139
+ """
140
+ True or false.
141
+
142
+ Examples
143
+ --------
144
+ >>> import numdaplot as ndp
145
+ >>> ndp.Array.from_list([True, False], dtype=ndp.Type.BOOL)
146
+ Array([ True, False], dtype=BOOL)
147
+ """
148
+
149
+ TEXT = auto()
150
+ """
151
+ Text of any length.
152
+
153
+ Examples
154
+ --------
155
+ >>> import numdaplot as ndp
156
+ >>> ndp.Array.from_list(["Paris", "Lyon"], dtype=ndp.Type.TEXT)
157
+ Array(['Paris', 'Lyon'], dtype=TEXT)
158
+ """
159
+
160
+ CATEGORY = auto()
161
+ """
162
+ Text taking a few repeated values, stored once per distinct value. Table columns only.
163
+
164
+ Examples
165
+ --------
166
+ >>> import numdaplot as ndp
167
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Paris"])
168
+ >>> prices = ndp.Array.from_list([120.0, 80.0, 150.0])
169
+ >>> sales = ndp.Table.from_arrays({"city": cities, "price": prices})
170
+ >>> categories = sales.convert(ndp.Conversion(column="city", dtype=ndp.Type.CATEGORY))
171
+ >>> categories.column_types["city"]
172
+ <Type.CATEGORY: 13>
173
+ """
174
+
175
+ DATE = auto()
176
+ """
177
+ A day, without time. Stored in days, but a calculation on it stays within 1677 to 2262, as ``DATETIME``.
178
+
179
+ Examples
180
+ --------
181
+ >>> from datetime import date
182
+ >>> import numdaplot as ndp
183
+ >>> ndp.Array.from_list([date(2026, 1, 31)]).dtype
184
+ <Type.DATE: 14>
185
+ """
186
+
187
+ DATETIME = auto()
188
+ """
189
+ A day and a time, with or without time zone, from 1677 to 2262.
190
+
191
+ Examples
192
+ --------
193
+ >>> from datetime import datetime
194
+ >>> import numdaplot as ndp
195
+ >>> ndp.Array.from_list([datetime(2026, 1, 31, 8, 30)]).dtype
196
+ <Type.DATETIME: 15>
197
+ """
198
+
199
+ DURATION = auto()
200
+ """
201
+ A gap between two dates or datetimes, of about 292 years at most, before or after zero.
202
+
203
+ Examples
204
+ --------
205
+ >>> from datetime import timedelta
206
+ >>> import numdaplot as ndp
207
+ >>> ndp.Array.from_list([timedelta(hours=2)]).dtype
208
+ <Type.DURATION: 16>
209
+ """
210
+
211
+ TIME = auto()
212
+ """
213
+ A time of day, from 00:00 to 23:59:59.999999, without date nor time zone. Stored as the time since midnight.
214
+
215
+ Two times give a ``DURATION`` when subtracted, a duration moves a time within its day, and a time added to a
216
+ ``DATE`` gives a ``DATETIME``. Its hour, minute and second are read with ``DatePart``.
217
+
218
+ Examples
219
+ --------
220
+ >>> from datetime import time
221
+ >>> import numdaplot as ndp
222
+ >>> ndp.Array.from_list([time(15, 35)]).dtype
223
+ <Type.TIME: 17>
224
+ """
@@ -0,0 +1,149 @@
1
+ """
2
+ Families of types whose values can be compared and combined together.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+ from numdaplot.data_types.type import Type
10
+
11
+
12
+ class ValueFamily(Enum):
13
+ """
14
+ Family of types whose values can be compared and combined together.
15
+
16
+ An ``INT64`` and a ``FLOAT64`` are both numbers, while a number and a text cannot be compared.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Examples
21
+ --------
22
+ >>> import numdaplot as ndp
23
+ >>> from numdaplot.data_types.value_family import find_family
24
+ >>> find_family(ndp.Type.UINT8) == find_family(ndp.Type.FLOAT64)
25
+ True
26
+ >>> find_family(ndp.Type.CATEGORY)
27
+ <ValueFamily.TEXT: 3>
28
+ """
29
+
30
+ NUMBER = auto()
31
+ """
32
+ Signed and unsigned integers, and decimals.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> from numdaplot.data_types.value_family import find_family
38
+ >>> find_family(ndp.Type.UINT8)
39
+ <ValueFamily.NUMBER: 1>
40
+ """
41
+
42
+ BOOL = auto()
43
+ """
44
+ True or false.
45
+
46
+ Examples
47
+ --------
48
+ >>> import numdaplot as ndp
49
+ >>> from numdaplot.data_types.value_family import find_family
50
+ >>> find_family(ndp.Type.BOOL)
51
+ <ValueFamily.BOOL: 2>
52
+ """
53
+
54
+ TEXT = auto()
55
+ """
56
+ Texts and categories.
57
+
58
+ Examples
59
+ --------
60
+ >>> import numdaplot as ndp
61
+ >>> from numdaplot.data_types.value_family import find_family
62
+ >>> find_family(ndp.Type.TEXT)
63
+ <ValueFamily.TEXT: 3>
64
+ """
65
+
66
+ MOMENT = auto()
67
+ """
68
+ Dates and datetimes.
69
+
70
+ Examples
71
+ --------
72
+ >>> import numdaplot as ndp
73
+ >>> from numdaplot.data_types.value_family import find_family
74
+ >>> find_family(ndp.Type.DATE)
75
+ <ValueFamily.MOMENT: 4>
76
+ """
77
+
78
+ DURATION = auto()
79
+ """
80
+ Gaps between two moments.
81
+
82
+ Examples
83
+ --------
84
+ >>> import numdaplot as ndp
85
+ >>> from numdaplot.data_types.value_family import find_family
86
+ >>> find_family(ndp.Type.DURATION)
87
+ <ValueFamily.DURATION: 5>
88
+ """
89
+
90
+ TIME = auto()
91
+ """
92
+ Times of day, compared only with each other.
93
+
94
+ Examples
95
+ --------
96
+ >>> import numdaplot as ndp
97
+ >>> from numdaplot.data_types.value_family import find_family
98
+ >>> find_family(ndp.Type.TIME)
99
+ <ValueFamily.TIME: 6>
100
+ """
101
+
102
+
103
+ FAMILIES_BY_TYPE = {
104
+ Type.INT8: ValueFamily.NUMBER,
105
+ Type.INT16: ValueFamily.NUMBER,
106
+ Type.INT32: ValueFamily.NUMBER,
107
+ Type.INT64: ValueFamily.NUMBER,
108
+ Type.UINT8: ValueFamily.NUMBER,
109
+ Type.UINT16: ValueFamily.NUMBER,
110
+ Type.UINT32: ValueFamily.NUMBER,
111
+ Type.UINT64: ValueFamily.NUMBER,
112
+ Type.FLOAT32: ValueFamily.NUMBER,
113
+ Type.FLOAT64: ValueFamily.NUMBER,
114
+ Type.BOOL: ValueFamily.BOOL,
115
+ Type.TEXT: ValueFamily.TEXT,
116
+ Type.CATEGORY: ValueFamily.TEXT,
117
+ Type.DATE: ValueFamily.MOMENT,
118
+ Type.DATETIME: ValueFamily.MOMENT,
119
+ Type.DURATION: ValueFamily.DURATION,
120
+ Type.TIME: ValueFamily.TIME,
121
+ }
122
+
123
+
124
+ def find_family(data_type: Type) -> ValueFamily:
125
+ """
126
+ Return the family of a numdaplot type.
127
+
128
+ .. versionadded:: 0.1.0
129
+
130
+ Parameters
131
+ ----------
132
+ data_type
133
+ The type to classify.
134
+
135
+ Returns
136
+ -------
137
+ ValueFamily
138
+ The family whose values can be compared with values of this type.
139
+
140
+ Examples
141
+ --------
142
+ >>> import numdaplot as ndp
143
+ >>> from numdaplot.data_types.value_family import find_family
144
+ >>> find_family(ndp.Type.DATETIME)
145
+ <ValueFamily.MOMENT: 4>
146
+ """
147
+ family = FAMILIES_BY_TYPE[data_type]
148
+
149
+ return family
@@ -0,0 +1,147 @@
1
+ """
2
+ Type of single Python values, and the common type of several values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from datetime import date, datetime, time, timedelta
8
+
9
+ import numpy
10
+
11
+ from numdaplot.data_types.library import Library
12
+ from numdaplot.data_types.type import Type
13
+ from numdaplot.data_types.value_family import find_family
14
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
15
+ from numdaplot.errors.time_zone_mismatch_error import TimeZoneMismatchError
16
+ from numdaplot.errors.unsupported_type_error import UnsupportedTypeError
17
+
18
+ # bool comes before int and datetime before date, since each one is a subclass of the next.
19
+ PYTHON_TYPES = (
20
+ ((bool, numpy.bool_), Type.BOOL),
21
+ ((int, numpy.integer), Type.INT64),
22
+ ((float, numpy.floating), Type.FLOAT64),
23
+ ((str,), Type.TEXT),
24
+ ((datetime,), Type.DATETIME),
25
+ ((date,), Type.DATE),
26
+ ((timedelta,), Type.DURATION),
27
+ ((time,), Type.TIME),
28
+ )
29
+ ARRAY_OPERATION = "An Array"
30
+ TYPE_WIDTHS = {
31
+ Type.FLOAT64: 1,
32
+ Type.DATETIME: 1,
33
+ }
34
+ NARROWEST_WIDTH = 0
35
+
36
+
37
+ def find_value_type(value: object) -> Type:
38
+ """
39
+ Return the numdaplot type of a single Python value.
40
+
41
+ .. versionadded:: 0.1.0
42
+
43
+ Parameters
44
+ ----------
45
+ value
46
+ A boolean, a number, a text, a date, a datetime, a duration or a time of day.
47
+
48
+ Returns
49
+ -------
50
+ Type
51
+ ``BOOL``, ``INT64``, ``FLOAT64``, ``TEXT``, ``DATETIME``, ``DATE``, ``DURATION`` or ``TIME``.
52
+
53
+ Raises
54
+ ------
55
+ UnsupportedTypeError
56
+ When the value has no numdaplot type, such as a complex number or a tuple.
57
+ TimeZoneMismatchError
58
+ When the value is a datetime or a time of day with a time zone, which an Array cannot hold.
59
+
60
+ Examples
61
+ --------
62
+ >>> from numdaplot.data_types.value_type import find_value_type
63
+ >>> find_value_type(2.5)
64
+ <Type.FLOAT64: 10>
65
+ """
66
+ has_time_zone = isinstance(value, (datetime, time)) and value.tzinfo is not None
67
+ if has_time_zone:
68
+ raise TimeZoneMismatchError(ARRAY_OPERATION, False)
69
+
70
+ for python_types, data_type in PYTHON_TYPES:
71
+ if isinstance(value, python_types):
72
+ return data_type
73
+
74
+ value_class = type(value)
75
+ raise UnsupportedTypeError(value_class.__name__, Library.NUMPY)
76
+
77
+
78
+ def find_type_width(data_type: Type) -> int:
79
+ """
80
+ Return the width of a type inside its family, the widest type holding every value of the others.
81
+
82
+ .. versionadded:: 0.1.0
83
+
84
+ Parameters
85
+ ----------
86
+ data_type
87
+ A type returned by ``find_value_type``.
88
+
89
+ Returns
90
+ -------
91
+ int
92
+ 1 for ``FLOAT64`` and ``DATETIME``, 0 for every other type.
93
+
94
+ Examples
95
+ --------
96
+ >>> import numdaplot as ndp
97
+ >>> from numdaplot.data_types.value_type import find_type_width
98
+ >>> find_type_width(ndp.Type.INT64) < find_type_width(ndp.Type.FLOAT64)
99
+ True
100
+ """
101
+ width = TYPE_WIDTHS.get(data_type, NARROWEST_WIDTH)
102
+
103
+ return width
104
+
105
+
106
+ def find_common_type(data_types: list[Type], operation: str) -> Type:
107
+ """
108
+ Return the type that holds every value of several types of one family.
109
+
110
+ Integers and decimals give ``FLOAT64``, dates and datetimes give ``DATETIME``.
111
+
112
+ .. versionadded:: 0.1.0
113
+
114
+ Parameters
115
+ ----------
116
+ data_types
117
+ At least one type returned by ``find_value_type``.
118
+ operation
119
+ Name of the operation needing the common type, shown in the error message.
120
+
121
+ Returns
122
+ -------
123
+ Type
124
+ The widest of the given types.
125
+
126
+ Raises
127
+ ------
128
+ IncompatibleTypesError
129
+ When the types belong to several families, such as a number and a text.
130
+
131
+ Examples
132
+ --------
133
+ >>> import numdaplot as ndp
134
+ >>> from numdaplot.data_types.value_type import find_common_type
135
+ >>> find_common_type([ndp.Type.INT64, ndp.Type.FLOAT64], "from_list")
136
+ <Type.FLOAT64: 10>
137
+ """
138
+ distinct_types = set(data_types)
139
+ families = {find_family(data_type) for data_type in distinct_types}
140
+ family_count = len(families)
141
+ if family_count > 1:
142
+ type_names = sorted(data_type.name for data_type in distinct_types)
143
+ raise IncompatibleTypesError(operation, type_names)
144
+
145
+ common_type = max(distinct_types, key=find_type_width)
146
+
147
+ return common_type
@@ -0,0 +1,5 @@
1
+ """
2
+ Dates, datetimes and durations: formats, time zones, parts, periods and duration units.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,83 @@
1
+ """
2
+ A pattern describing how dates are written as texts.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_date_format_error import InvalidDateFormatError
10
+ from numdaplot.settings.field_types import require_field_types
11
+
12
+ DATE_CODES = ("%d", "%m", "%Y", "%y", "%b", "%B", "%j")
13
+ TIME_ZONE_CODES = ("%z", "%Z")
14
+ TIME_CODES = ("%H", "%I", "%M", "%S", "%f", "%p")
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class CustomDateFormat:
19
+ """
20
+ A pattern describing how dates, datetimes or times of day are written as texts, used by ``Conversion``.
21
+
22
+ It serves when no ``DateFormat`` fits, and for times of day. The pattern uses the codes of Python
23
+ ``datetime.strptime``: ``%d`` day, ``%m`` month, ``%Y`` year,
24
+ ``%b`` short month name, ``%B`` full month name, ``%H`` hour, ``%M`` minute, ``%S`` second.
25
+ Month names are in English.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ pattern
32
+ The pattern, such as ``"%d %b %Y"`` for ``"31 Dec 2026"``.
33
+
34
+ Raises
35
+ ------
36
+ InvalidTypeError
37
+ When a setting is not of the type its annotation names.
38
+ InvalidDateFormatError
39
+ When the pattern has no date code (day, month, year) nor time code (hour, minute, second), or has a time
40
+ zone code (``%z``, ``%Z``). A pattern without date only reads or writes ``TIME``, and a pattern with a date
41
+ never does.
42
+
43
+ Examples
44
+ --------
45
+ >>> import numdaplot as ndp
46
+ >>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31 Dec 2026", "1 Feb 2026"])})
47
+ >>> days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.CustomDateFormat("%d %b %Y")))
48
+ day
49
+ DATE
50
+ 0 2026-12-31
51
+ 1 2026-02-01
52
+ >>> hours = ndp.Table.from_arrays({"hrmn": ndp.Array.from_list(["1535", "0805"])})
53
+ >>> hours.convert(ndp.Conversion(column="hrmn", dtype=ndp.Type.TIME, format=ndp.CustomDateFormat("%H%M")))
54
+ hrmn
55
+ TIME
56
+ 0 15:35:00
57
+ 1 08:05:00
58
+ """
59
+
60
+ pattern: str
61
+
62
+ def __post_init__(self) -> None:
63
+ """
64
+ Check that the pattern reads a date or a time of day, and no time zone.
65
+
66
+ .. versionadded:: 0.1.0
67
+
68
+ Raises
69
+ ------
70
+ InvalidTypeError
71
+ When a setting is not of the type its annotation names.
72
+ InvalidDateFormatError
73
+ When the pattern has no date nor time code, or has a time zone code.
74
+ """
75
+ require_field_types(self)
76
+
77
+ has_date_code = any(date_code in self.pattern for date_code in DATE_CODES)
78
+ has_time_code = any(time_code in self.pattern for time_code in TIME_CODES)
79
+ has_time_zone_code = any(zone_code in self.pattern for zone_code in TIME_ZONE_CODES)
80
+ reads_something = has_date_code or has_time_code
81
+ is_rejected = has_time_zone_code or not reads_something
82
+ if is_rejected:
83
+ raise InvalidDateFormatError(self.pattern)