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,669 @@
1
+ """
2
+ Conversion of a Table column to another type.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import pandas
8
+
9
+ from numdaplot.data_types.type import Type
10
+ from numdaplot.data_types.value_family import ValueFamily, find_family
11
+ from numdaplot.dates.custom_date_format import CustomDateFormat
12
+ from numdaplot.dates.date_format import DateFormat
13
+ from numdaplot.errors.incompatible_types_error import IncompatibleTypesError
14
+ from numdaplot.errors.invalid_conversion_error import InvalidConversionError
15
+ from numdaplot.errors.time_overflow_error import TimeOverflowError
16
+ from numdaplot.tables.columns.boolean_conversion import convert_booleans_to_numbers, convert_numbers_to_booleans
17
+ from numdaplot.tables.columns.boolean_rule import BooleanRule
18
+ from numdaplot.tables.columns.bracketed_column import cut_column
19
+ from numdaplot.tables.columns.brackets import Brackets
20
+ from numdaplot.tables.columns.conversion import Conversion
21
+ from numdaplot.tables.columns.date_conversion import (
22
+ convert_moments,
23
+ find_format_name,
24
+ has_date,
25
+ has_time,
26
+ parse_dates,
27
+ write_dates,
28
+ write_durations,
29
+ )
30
+ from numdaplot.tables.columns.number_conversion import convert_numbers, parse_numbers
31
+ from numdaplot.tables.columns.text_conversion import parse_booleans
32
+ from numdaplot.tables.columns.time_conversion import keep_time_of_day, parse_times, write_times
33
+ from numdaplot.tables.columns.time_zone_conversion import change_time_zone
34
+ from numdaplot.tables.frames.column import Column
35
+ from numdaplot.tables.frames.column_values import find_column_type
36
+ from numdaplot.tables.frames.frame_normalization import convert_to_type
37
+
38
+ CONVERT_OPERATION = "convert"
39
+ WRITABLE_FAMILIES = frozenset({ValueFamily.NUMBER, ValueFamily.BOOL, ValueFamily.TEXT})
40
+ WRITTEN_TYPES = frozenset({Type.TEXT, Type.CATEGORY})
41
+ FORMAT_SETTING = "format"
42
+ TIMEZONE_SETTING = "timezone"
43
+ BOOLEANS_SETTING = "booleans"
44
+ DEFAULT_BOOLEAN_RULE = BooleanRule.ZERO_ONE
45
+ NUMBERS_TO_NUMBERS = (ValueFamily.NUMBER, ValueFamily.NUMBER)
46
+ TEXTS_TO_NUMBERS = (ValueFamily.TEXT, ValueFamily.NUMBER)
47
+ TEXTS_TO_BOOLEANS = (ValueFamily.TEXT, ValueFamily.BOOL)
48
+ BOOLEANS_TO_NUMBERS = (ValueFamily.BOOL, ValueFamily.NUMBER)
49
+ NUMBERS_TO_BOOLEANS = (ValueFamily.NUMBER, ValueFamily.BOOL)
50
+
51
+
52
+ def convert_column(column: Column, conversion: Conversion) -> Column:
53
+ """
54
+ Return a Table column converted to another type, missing values staying missing.
55
+
56
+ .. versionadded:: 0.1.0
57
+
58
+ Parameters
59
+ ----------
60
+ column
61
+ A Table column.
62
+ conversion
63
+ The new type, and the date format, the time zone change or the rule reading numbers as booleans.
64
+
65
+ Returns
66
+ -------
67
+ Column
68
+ The converted column, or a copy when it already has the type. Numbers, booleans and categories
69
+ become texts as Python writes them, such as ``2.5`` or ``True``.
70
+
71
+ Raises
72
+ ------
73
+ InvalidConversionError
74
+ When the format, the time zone change or the boolean rule does not apply to the conversion.
75
+ InvalidLimitsError
76
+ When brackets cut integers and a bracket between two limits holds no integer.
77
+ UnmatchedValueError
78
+ When a number is in no bracket and the brackets keep ``others=Unmatched.ERROR``.
79
+ IncompatibleTypesError
80
+ When the conversion is not accepted, such as a boolean to a date, or a number to a date.
81
+ ValueConversionError
82
+ When a value cannot be stored in the new type without losing information.
83
+ TimeOverflowError
84
+ When a date read or converted is outside what the new type can hold.
85
+ TimeZoneMismatchError
86
+ When the time zone change does not apply to whether the datetimes have a zone.
87
+
88
+ Examples
89
+ --------
90
+ >>> import pandas
91
+ >>> import numdaplot as ndp
92
+ >>> from numdaplot.tables.columns.converted_column import convert_column
93
+ >>> texts = pandas.Series(["1", None, "3"], dtype="string")
94
+ >>> convert_column(texts, ndp.Conversion(column="count", dtype=ndp.Type.INT64)).tolist()
95
+ [1, <NA>, 3]
96
+ """
97
+ source_type = find_column_type(column)
98
+ require_conversion_settings(source_type, conversion)
99
+ if conversion.timezone is not None:
100
+ zone_column = change_time_zone(column, conversion.timezone)
101
+ return zone_column
102
+
103
+ if isinstance(conversion.format, Brackets):
104
+ bracketed_column = cut_column(column, conversion.format)
105
+ return bracketed_column
106
+
107
+ if source_type == conversion.dtype:
108
+ column_copy = column.copy()
109
+ return column_copy
110
+
111
+ try:
112
+ time_column = convert_time_column(column, source_type, conversion.dtype, conversion.format)
113
+ except pandas.errors.OutOfBoundsDatetime as error:
114
+ raise TimeOverflowError(CONVERT_OPERATION, conversion.dtype.name) from error
115
+
116
+ if time_column is not None:
117
+ return time_column
118
+
119
+ plain_column = convert_plain_column(column, source_type, conversion)
120
+
121
+ return plain_column
122
+
123
+
124
+ def require_conversion_settings(source_type: Type, conversion: Conversion) -> None:
125
+ """
126
+ Check that the format, the time zone change and the boolean rule of a conversion apply to its types.
127
+
128
+ .. versionadded:: 0.1.0
129
+
130
+ Parameters
131
+ ----------
132
+ source_type
133
+ The type of the converted column.
134
+ conversion
135
+ The new type and the settings.
136
+
137
+ Raises
138
+ ------
139
+ InvalidConversionError
140
+ When a time zone change is given to another conversion than datetimes to datetimes, a format to another
141
+ conversion than texts to dates or dates to texts, a format with a time to dates, or a boolean rule to another
142
+ conversion than numbers to booleans.
143
+
144
+ Examples
145
+ --------
146
+ >>> import numdaplot as ndp
147
+ >>> from numdaplot.tables.columns.converted_column import require_conversion_settings
148
+ >>> day_and_time = ndp.Conversion(column="day", dtype=ndp.Type.DATE, format=ndp.DateFormat.DAY_MONTH_YEAR_TIME)
149
+ >>> try:
150
+ ... require_conversion_settings(ndp.Type.TEXT, day_and_time)
151
+ ... except ndp.InvalidConversionError as error:
152
+ ... print(error)
153
+ The format DAY_MONTH_YEAR_TIME has a time, which DATE cannot hold.
154
+ Convert the column to DATETIME first, then to DATE.
155
+ """
156
+ require_time_zone_setting(source_type, conversion)
157
+ require_format_setting(source_type, conversion)
158
+ require_booleans_setting(source_type, conversion)
159
+
160
+
161
+ def require_time_zone_setting(source_type: Type, conversion: Conversion) -> None:
162
+ """
163
+ Check that a time zone change, when given, is given to a conversion of datetimes to datetimes.
164
+
165
+ .. versionadded:: 0.1.0
166
+
167
+ Parameters
168
+ ----------
169
+ source_type
170
+ The type of the converted column.
171
+ conversion
172
+ The new type and the settings.
173
+
174
+ Raises
175
+ ------
176
+ InvalidConversionError
177
+ When a time zone change is given to another conversion.
178
+
179
+ Examples
180
+ --------
181
+ >>> import numdaplot as ndp
182
+ >>> from numdaplot.tables.columns.converted_column import require_time_zone_setting
183
+ >>> to_paris = ndp.TimeZoneChange(zone=ndp.TimeZone("Europe/Paris"), mode=ndp.TimeZoneMode.ATTRIBUTE)
184
+ >>> zone_change = ndp.Conversion(column="day", dtype=ndp.Type.DATETIME, timezone=to_paris)
185
+ >>> try:
186
+ ... require_time_zone_setting(ndp.Type.TEXT, zone_change)
187
+ ... except ndp.InvalidConversionError as error:
188
+ ... print(error)
189
+ The setting timezone does not apply to a conversion from TEXT to DATETIME.
190
+ """
191
+ if conversion.timezone is None:
192
+ return
193
+
194
+ target_type = conversion.dtype
195
+ changes_datetimes = source_type == Type.DATETIME and target_type == Type.DATETIME
196
+ if not changes_datetimes:
197
+ raise InvalidConversionError(TIMEZONE_SETTING, source_type.name, target_type.name)
198
+
199
+
200
+ def require_format_setting(source_type: Type, conversion: Conversion) -> None:
201
+ """
202
+ Check that a date format, when given, is given to a conversion of texts to dates or of dates to texts.
203
+
204
+ .. versionadded:: 0.1.0
205
+
206
+ Parameters
207
+ ----------
208
+ source_type
209
+ The type of the converted column.
210
+ conversion
211
+ The new type and the settings.
212
+
213
+ Raises
214
+ ------
215
+ InvalidConversionError
216
+ When a format is given to another conversion, or a format with a time to dates.
217
+
218
+ Examples
219
+ --------
220
+ >>> import numdaplot as ndp
221
+ >>> from numdaplot.tables.columns.converted_column import require_format_setting
222
+ >>> day_first = ndp.DateFormat.DAY_MONTH_YEAR
223
+ >>> price_texts = ndp.Conversion(column="price", dtype=ndp.Type.TEXT, format=day_first)
224
+ >>> try:
225
+ ... require_format_setting(ndp.Type.FLOAT64, price_texts)
226
+ ... except ndp.InvalidConversionError as error:
227
+ ... print(error)
228
+ The setting format does not apply to a conversion from FLOAT64 to TEXT.
229
+ """
230
+ if conversion.format is None:
231
+ return
232
+
233
+ if isinstance(conversion.format, Brackets):
234
+ require_brackets_setting(source_type, conversion.dtype)
235
+ return
236
+
237
+ converts_times = Type.TIME in (source_type, conversion.dtype)
238
+ if converts_times:
239
+ require_time_format_setting(source_type, conversion.dtype, conversion.format)
240
+ return
241
+
242
+ target_type = conversion.dtype
243
+ source_family = find_family(source_type)
244
+ target_family = find_family(target_type)
245
+ reads_dates = source_family == ValueFamily.TEXT and target_family == ValueFamily.MOMENT
246
+ writes_dates = source_family == ValueFamily.MOMENT and target_type in WRITTEN_TYPES
247
+ date_type = source_type
248
+ if reads_dates:
249
+ date_type = target_type
250
+
251
+ format_has_time = has_time(conversion.format)
252
+ format_has_date = has_date(conversion.format)
253
+ misses_time = date_type == Type.DATE and format_has_time
254
+ uses_format = reads_dates or writes_dates
255
+ if not uses_format or not format_has_date:
256
+ raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
257
+
258
+ if misses_time:
259
+ format_name = find_format_name(target_type, conversion.format)
260
+ raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name, format_name)
261
+
262
+
263
+ def require_time_format_setting(
264
+ source_type: Type, target_type: Type, time_format: DateFormat | CustomDateFormat
265
+ ) -> None:
266
+ """
267
+ Check that a format given to a conversion of times of day reads or writes them, and holds no date.
268
+
269
+ .. versionadded:: 0.1.0
270
+
271
+ Parameters
272
+ ----------
273
+ source_type
274
+ The type of the converted column.
275
+ target_type
276
+ The new type, ``TIME`` or the type a ``TIME`` column is converted to.
277
+ time_format
278
+ The format given.
279
+
280
+ Raises
281
+ ------
282
+ InvalidConversionError
283
+ When the conversion neither reads texts as times nor writes times as texts, or the format holds a date.
284
+
285
+ Examples
286
+ --------
287
+ >>> import numdaplot as ndp
288
+ >>> from numdaplot.tables.columns.converted_column import require_time_format_setting
289
+ >>> try:
290
+ ... require_time_format_setting(ndp.Type.TEXT, ndp.Type.TIME, ndp.DateFormat.DAY_MONTH_YEAR)
291
+ ... except ndp.InvalidConversionError as error:
292
+ ... print(error)
293
+ The format DAY_MONTH_YEAR has a date, which TIME cannot hold.
294
+ Give a CustomDateFormat of a time only, such as "%H:%M".
295
+ """
296
+ source_family = find_family(source_type)
297
+ reads_times = source_family == ValueFamily.TEXT and target_type == Type.TIME
298
+ writes_times = source_type == Type.TIME and target_type in WRITTEN_TYPES
299
+ uses_format = reads_times or writes_times
300
+ if not uses_format:
301
+ raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
302
+
303
+ format_has_date = has_date(time_format)
304
+ if format_has_date:
305
+ format_name = find_format_name(target_type, time_format)
306
+ raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name, format_name)
307
+
308
+
309
+ def require_brackets_setting(source_type: Type, target_type: Type) -> None:
310
+ """
311
+ Check that brackets are given to a conversion of numbers to categories.
312
+
313
+ .. versionadded:: 0.1.0
314
+
315
+ Parameters
316
+ ----------
317
+ source_type
318
+ The type of the converted column.
319
+ target_type
320
+ The new type.
321
+
322
+ Raises
323
+ ------
324
+ InvalidConversionError
325
+ When the column does not hold numbers, or the new type is not ``CATEGORY``.
326
+
327
+ Examples
328
+ --------
329
+ >>> import numdaplot as ndp
330
+ >>> from numdaplot.tables.columns.converted_column import require_brackets_setting
331
+ >>> try:
332
+ ... require_brackets_setting(ndp.Type.TEXT, ndp.Type.CATEGORY)
333
+ ... except ndp.InvalidConversionError as error:
334
+ ... print(error)
335
+ The setting format does not apply to a conversion from TEXT to CATEGORY.
336
+ """
337
+ source_family = find_family(source_type)
338
+ cuts_numbers = source_family == ValueFamily.NUMBER and target_type == Type.CATEGORY
339
+ if not cuts_numbers:
340
+ raise InvalidConversionError(FORMAT_SETTING, source_type.name, target_type.name)
341
+
342
+
343
+ def require_booleans_setting(source_type: Type, conversion: Conversion) -> None:
344
+ """
345
+ Check that a boolean rule, when given, is given to a conversion of numbers to booleans.
346
+
347
+ .. versionadded:: 0.1.0
348
+
349
+ Parameters
350
+ ----------
351
+ source_type
352
+ The type of the converted column.
353
+ conversion
354
+ The new type and the settings.
355
+
356
+ Raises
357
+ ------
358
+ InvalidConversionError
359
+ When a boolean rule is given to another conversion.
360
+
361
+ Examples
362
+ --------
363
+ >>> import numdaplot as ndp
364
+ >>> from numdaplot.tables.columns.converted_column import require_booleans_setting
365
+ >>> rule = ndp.BooleanRule.NONZERO_TRUE
366
+ >>> try:
367
+ ... require_booleans_setting(ndp.Type.TEXT, ndp.Conversion(column="paid", dtype=ndp.Type.BOOL, booleans=rule))
368
+ ... except ndp.InvalidConversionError as error:
369
+ ... print(error)
370
+ The setting booleans does not apply to a conversion from TEXT to BOOL.
371
+ """
372
+ if conversion.booleans is None:
373
+ return
374
+
375
+ target_type = conversion.dtype
376
+ source_family = find_family(source_type)
377
+ reads_numbers = source_family == ValueFamily.NUMBER and target_type == Type.BOOL
378
+ if not reads_numbers:
379
+ raise InvalidConversionError(BOOLEANS_SETTING, source_type.name, target_type.name)
380
+
381
+
382
+ def convert_time_column(
383
+ column: Column, source_type: Type, target_type: Type, date_format: DateFormat | CustomDateFormat | None
384
+ ) -> Column | None:
385
+ """
386
+ Return a column converted between texts, dates, datetimes and durations.
387
+
388
+ .. versionadded:: 0.1.0
389
+
390
+ Parameters
391
+ ----------
392
+ column
393
+ A Table column of another type than the target.
394
+ source_type
395
+ The type of the column.
396
+ target_type
397
+ The new type.
398
+ date_format
399
+ How dates are written as texts, the default format when None.
400
+
401
+ Returns
402
+ -------
403
+ Column or None
404
+ The converted column, or ``None`` when the conversion involves no date, datetime or duration.
405
+
406
+ Raises
407
+ ------
408
+ ValueConversionError
409
+ At the first text that is not a date in the format.
410
+ TimeOverflowError
411
+ When a text holds a real date that the version of pandas in use cannot read.
412
+ OutOfBoundsDatetime
413
+ When pandas cannot store a date as ``DATETIME``, outside the range of nanoseconds.
414
+
415
+ Examples
416
+ --------
417
+ >>> import pandas
418
+ >>> import numdaplot as ndp
419
+ >>> from numdaplot.tables.columns.converted_column import convert_time_column
420
+ >>> texts = pandas.Series(["2026-12-31"], dtype="string")
421
+ >>> convert_time_column(texts, ndp.Type.TEXT, ndp.Type.DATE, None).tolist()
422
+ [Timestamp('2026-12-31 00:00:00')]
423
+ """
424
+ converts_times = Type.TIME in (source_type, target_type)
425
+ if converts_times:
426
+ time_column = convert_times(column, source_type, target_type, date_format)
427
+ return time_column
428
+
429
+ source_family = find_family(source_type)
430
+ target_family = find_family(target_type)
431
+ if source_family == ValueFamily.TEXT and target_family == ValueFamily.MOMENT:
432
+ dates = parse_dates(column, target_type, date_format)
433
+ return dates
434
+
435
+ if source_family == ValueFamily.MOMENT and target_family == ValueFamily.MOMENT:
436
+ moments = convert_moments(column, target_type)
437
+ return moments
438
+
439
+ is_written = target_type in WRITTEN_TYPES
440
+ if not is_written:
441
+ return None
442
+
443
+ if source_family == ValueFamily.MOMENT:
444
+ date_texts = write_dates(column, date_format)
445
+ written_dates = convert_to_type(date_texts, target_type)
446
+ return written_dates
447
+
448
+ if source_family == ValueFamily.DURATION:
449
+ duration_texts = write_durations(column)
450
+ written_durations = convert_to_type(duration_texts, target_type)
451
+ return written_durations
452
+
453
+ return None
454
+
455
+
456
+ def convert_times(
457
+ column: Column, source_type: Type, target_type: Type, time_format: DateFormat | CustomDateFormat | None
458
+ ) -> Column | None:
459
+ """
460
+ Return a column converted from texts or datetimes to times of day, or from times of day to texts or categories.
461
+
462
+ .. versionadded:: 0.1.0
463
+
464
+ Parameters
465
+ ----------
466
+ column
467
+ A Table column of another type than the target, one of the two types being ``TIME``.
468
+ source_type
469
+ The type of the column.
470
+ target_type
471
+ The new type.
472
+ time_format
473
+ A pattern of a time without date, already checked, or None for the default format.
474
+
475
+ Returns
476
+ -------
477
+ Column or None
478
+ The converted column, or ``None`` for a conversion of times of day that is not accepted.
479
+
480
+ Raises
481
+ ------
482
+ ValueConversionError
483
+ At the first text that is not a time in the format.
484
+
485
+ Examples
486
+ --------
487
+ >>> import pandas
488
+ >>> import numdaplot as ndp
489
+ >>> from numdaplot.tables.columns.converted_column import convert_times
490
+ >>> moments = pandas.Series(pandas.to_datetime(["2026-03-14 15:35"]))
491
+ >>> convert_times(moments, ndp.Type.DATETIME, ndp.Type.TIME, None).tolist()
492
+ [Timedelta('0 days 15:35:00')]
493
+ """
494
+ custom_format = time_format if isinstance(time_format, CustomDateFormat) else None
495
+ source_family = find_family(source_type)
496
+ if source_family == ValueFamily.TEXT and target_type == Type.TIME:
497
+ read_times = parse_times(column, custom_format)
498
+ return read_times
499
+
500
+ if source_type == Type.DATETIME and target_type == Type.TIME:
501
+ day_times = keep_time_of_day(column)
502
+ return day_times
503
+
504
+ if source_type == Type.TIME and target_type in WRITTEN_TYPES:
505
+ time_texts = write_times(column, custom_format)
506
+ written_times = convert_to_type(time_texts, target_type)
507
+ return written_times
508
+
509
+ return None
510
+
511
+
512
+ def convert_plain_column(column: Column, source_type: Type, conversion: Conversion) -> Column:
513
+ """
514
+ Return a column converted between numbers, booleans, texts and categories.
515
+
516
+ .. versionadded:: 0.1.0
517
+
518
+ Parameters
519
+ ----------
520
+ column
521
+ A Table column of another type than the target.
522
+ source_type
523
+ The type of the column.
524
+ conversion
525
+ The new type and the rule reading numbers as booleans.
526
+
527
+ Returns
528
+ -------
529
+ Column
530
+ The converted column.
531
+
532
+ Raises
533
+ ------
534
+ IncompatibleTypesError
535
+ When the conversion is not accepted, such as a boolean to a date.
536
+ ValueConversionError
537
+ When a value cannot be stored in the new type without losing information.
538
+
539
+ Examples
540
+ --------
541
+ >>> import pandas
542
+ >>> import numdaplot as ndp
543
+ >>> from numdaplot.tables.columns.converted_column import convert_plain_column
544
+ >>> to_text = ndp.Conversion(column="price", dtype=ndp.Type.TEXT)
545
+ >>> convert_plain_column(pandas.Series([1.5]), ndp.Type.FLOAT64, to_text).tolist()
546
+ ['1.5']
547
+ """
548
+ target_type = conversion.dtype
549
+ if target_type in WRITTEN_TYPES:
550
+ written_column = write_plain_column(column, source_type, target_type)
551
+ return written_column
552
+
553
+ read_column = read_plain_column(column, source_type, conversion)
554
+
555
+ return read_column
556
+
557
+
558
+ def write_plain_column(column: Column, source_type: Type, target_type: Type) -> Column:
559
+ """
560
+ Return a column of numbers, booleans, texts or categories written as texts or categories.
561
+
562
+ .. versionadded:: 0.1.0
563
+
564
+ Parameters
565
+ ----------
566
+ column
567
+ A Table column of another type than the target.
568
+ source_type
569
+ The type of the column.
570
+ target_type
571
+ ``TEXT`` or ``CATEGORY``.
572
+
573
+ Returns
574
+ -------
575
+ Column
576
+ The column written as Python writes each value, such as ``2.5`` or ``True``.
577
+
578
+ Raises
579
+ ------
580
+ IncompatibleTypesError
581
+ When the column holds other values than numbers, booleans, texts or categories.
582
+
583
+ Examples
584
+ --------
585
+ >>> import pandas
586
+ >>> import numdaplot as ndp
587
+ >>> from numdaplot.tables.columns.converted_column import write_plain_column
588
+ >>> write_plain_column(pandas.Series([True]), ndp.Type.BOOL, ndp.Type.CATEGORY).tolist()
589
+ ['True']
590
+ """
591
+ source_family = find_family(source_type)
592
+ if source_family not in WRITABLE_FAMILIES:
593
+ type_names = [source_type.name, target_type.name]
594
+ raise IncompatibleTypesError(CONVERT_OPERATION, type_names)
595
+
596
+ text_column = convert_to_type(column, Type.TEXT)
597
+ if target_type == Type.CATEGORY:
598
+ category_column = convert_to_type(text_column, Type.CATEGORY)
599
+ return category_column
600
+
601
+ return text_column
602
+
603
+
604
+ def read_plain_column(column: Column, source_type: Type, conversion: Conversion) -> Column:
605
+ """
606
+ Return a column of numbers, booleans, texts or categories converted to numbers or booleans.
607
+
608
+ .. versionadded:: 0.1.0
609
+
610
+ Parameters
611
+ ----------
612
+ column
613
+ A Table column of another type than the target.
614
+ source_type
615
+ The type of the column.
616
+ conversion
617
+ The new type, a number type or ``BOOL``, and the rule reading numbers as booleans.
618
+
619
+ Returns
620
+ -------
621
+ Column
622
+ The converted column.
623
+
624
+ Raises
625
+ ------
626
+ IncompatibleTypesError
627
+ When the conversion is not accepted, such as a boolean to a date.
628
+ ValueConversionError
629
+ When a value cannot be stored in the new type without losing information.
630
+
631
+ Examples
632
+ --------
633
+ >>> import pandas
634
+ >>> import numdaplot as ndp
635
+ >>> from numdaplot.tables.columns.converted_column import read_plain_column
636
+ >>> to_integers = ndp.Conversion(column="paid", dtype=ndp.Type.INT64)
637
+ >>> read_plain_column(pandas.Series([True, False]), ndp.Type.BOOL, to_integers).tolist()
638
+ [1, 0]
639
+ """
640
+ target_type = conversion.dtype
641
+ source_family = find_family(source_type)
642
+ target_family = find_family(target_type)
643
+ family_pair = (source_family, target_family)
644
+ if family_pair == NUMBERS_TO_NUMBERS:
645
+ number_column = convert_numbers(column, target_type)
646
+ return number_column
647
+
648
+ if family_pair == TEXTS_TO_NUMBERS:
649
+ parsed_column = parse_numbers(column, target_type)
650
+ return parsed_column
651
+
652
+ if family_pair == TEXTS_TO_BOOLEANS:
653
+ boolean_column = parse_booleans(column)
654
+ return boolean_column
655
+
656
+ if family_pair == BOOLEANS_TO_NUMBERS:
657
+ boolean_numbers = convert_booleans_to_numbers(column, target_type)
658
+ return boolean_numbers
659
+
660
+ if family_pair == NUMBERS_TO_BOOLEANS:
661
+ boolean_rule = conversion.booleans
662
+ if boolean_rule is None:
663
+ boolean_rule = DEFAULT_BOOLEAN_RULE
664
+
665
+ number_booleans = convert_numbers_to_booleans(column, boolean_rule)
666
+ return number_booleans
667
+
668
+ type_names = [source_type.name, target_type.name]
669
+ raise IncompatibleTypesError(CONVERT_OPERATION, type_names)