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,56 @@
1
+ """
2
+ Error raised when an image is saved with an extension numdaplot does not write.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ UNSUPPORTED_IMAGE_FORMAT_MESSAGE = "Cannot save an image as {extension!r}: use .png, .svg or .pdf."
10
+
11
+
12
+ class UnsupportedImageFormatError(NumdaplotError):
13
+ """
14
+ Raised when the path of an image does not end with ``.png``, ``.svg`` or ``.pdf``.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ extension
21
+ The rejected extension, such as ``.jpg``, or an empty text when the path has none.
22
+
23
+ Attributes
24
+ ----------
25
+ extension
26
+ The rejected extension, such as ``.jpg``, or an empty text when the path has none.
27
+
28
+ Examples
29
+ --------
30
+ >>> import tempfile
31
+ >>> from pathlib import Path
32
+ >>> import numdaplot as ndp
33
+ >>> path = Path(tempfile.mkdtemp()) / "prices.jpg"
34
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
35
+ >>> plot = ndp.Plot.line(prices)
36
+ >>> try:
37
+ ... plot.save(path)
38
+ ... except ndp.UnsupportedImageFormatError as error:
39
+ ... print(error)
40
+ Cannot save an image as '.jpg': use .png, .svg or .pdf.
41
+ """
42
+
43
+ def __init__(self, extension: str) -> None:
44
+ """
45
+ Build the error message from the rejected extension.
46
+
47
+ .. versionadded:: 0.1.0
48
+
49
+ Parameters
50
+ ----------
51
+ extension
52
+ The rejected extension, such as ``.jpg``, or an empty text when the path has none.
53
+ """
54
+ message = UNSUPPORTED_IMAGE_FORMAT_MESSAGE.format(extension=extension)
55
+ super().__init__(message)
56
+ self.extension = extension
@@ -0,0 +1,38 @@
1
+ """
2
+ Error raised when a pandas DataFrame has an index holding information.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ UNSUPPORTED_INDEX_MESSAGE = (
10
+ "A Table has no index, call reset_index() on the pandas DataFrame first to keep its index as a column."
11
+ )
12
+
13
+
14
+ class UnsupportedIndexError(NumdaplotError):
15
+ """
16
+ Raised by ``Table.from_pandas`` when the index of the pandas DataFrame is not the plain row numbers 0, 1, 2...
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Examples
21
+ --------
22
+ >>> import numdaplot as ndp
23
+ >>> import pandas
24
+ >>> frame = pandas.DataFrame({"price": [1, 2]}, index=["Paris", "Lyon"])
25
+ >>> try:
26
+ ... ndp.Table.from_pandas(frame)
27
+ ... except ndp.UnsupportedIndexError as error:
28
+ ... print(error)
29
+ A Table has no index, call reset_index() on the pandas DataFrame first to keep its index as a column.
30
+ """
31
+
32
+ def __init__(self) -> None:
33
+ """
34
+ Build the error message.
35
+
36
+ .. versionadded:: 0.1.0
37
+ """
38
+ super().__init__(UNSUPPORTED_INDEX_MESSAGE)
@@ -0,0 +1,129 @@
1
+ """
2
+ Error raised when a missing value is given for a type that cannot hold one.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ BOOL_TYPE_NAME = "BOOL"
10
+ LIST_MESSAGE = "{type_name} values cannot be missing in an Array. {advice}"
11
+ COLUMN_MESSAGE = (
12
+ "The column {column_name!r} has missing values, which {article} {type_name} Array cannot hold. {advice}"
13
+ )
14
+ ARTICLE_BEFORE_VOWEL = "an"
15
+ ARTICLE = "a"
16
+ VOWELS = "AEIOU"
17
+ LIST_ADVICE = "Remove them."
18
+ LIST_DECIMAL_ADVICE = "Remove them, or give dtype=ndp.Type.FLOAT64."
19
+ COLUMN_ADVICE = "Remove them with drop_missing."
20
+ COLUMN_DECIMAL_ADVICE = "Remove them with drop_missing, or convert the column to FLOAT64."
21
+
22
+
23
+ class UnsupportedMissingError(NumdaplotError):
24
+ """
25
+ Raised when a missing value (``None``) is given for a type that cannot hold one in an Array.
26
+
27
+ Only integers and booleans cannot be missing in an Array. A Table accepts their missing values.
28
+
29
+ .. versionadded:: 0.1.0
30
+
31
+ Parameters
32
+ ----------
33
+ type_name
34
+ Name of the ``ndp.Type`` member that cannot hold a missing value.
35
+ column_name
36
+ Name of the Table column holding the missing values. When omitted, the values were given to an Array.
37
+ advice
38
+ What to do instead, for values given to an Array by an operation that has its own solution. When omitted,
39
+ the advice of ``Array.from_list``.
40
+
41
+ Attributes
42
+ ----------
43
+ type_name
44
+ Name of the ``ndp.Type`` member that cannot hold a missing value.
45
+ column_name
46
+ Name of the Table column holding the missing values, or ``None`` for values given to an Array.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> try:
52
+ ... ndp.Array.from_list([1, None])
53
+ ... except ndp.UnsupportedMissingError as error:
54
+ ... print(error)
55
+ INT64 values cannot be missing in an Array. Remove them, or give dtype=ndp.Type.FLOAT64.
56
+ """
57
+
58
+ def __init__(self, type_name: str, column_name: str | None = None, advice: str | None = None) -> None:
59
+ """
60
+ Build the error message from the type name, the column name and the advice.
61
+
62
+ .. versionadded:: 0.1.0
63
+
64
+ Parameters
65
+ ----------
66
+ type_name
67
+ Name of the ``ndp.Type`` member that cannot hold a missing value.
68
+ column_name
69
+ Name of the Table column holding the missing values. When omitted, the values were given to an Array.
70
+ advice
71
+ What to do instead, for values given to an Array. When omitted, the advice of ``Array.from_list``.
72
+ """
73
+ message = write_missing_message(type_name, column_name, advice)
74
+ super().__init__(message)
75
+
76
+ self.type_name = type_name
77
+ self.column_name = column_name
78
+
79
+
80
+ def write_missing_message(type_name: str, column_name: str | None, advice: str | None = None) -> str:
81
+ """
82
+ Return the message of the error, with the solutions that apply to the type.
83
+
84
+ Whole numbers can become decimals, which hold missing values. Booleans cannot.
85
+
86
+ .. versionadded:: 0.1.0
87
+
88
+ Parameters
89
+ ----------
90
+ type_name
91
+ Name of the ``ndp.Type`` member that cannot hold a missing value.
92
+ column_name
93
+ Name of the Table column holding the missing values, or ``None`` for values given to an Array.
94
+ advice
95
+ What to do instead, for values given to an Array. When omitted, the advice of ``Array.from_list``.
96
+
97
+ Returns
98
+ -------
99
+ str
100
+ The message.
101
+
102
+ Examples
103
+ --------
104
+ >>> from numdaplot.errors.unsupported_missing_error import write_missing_message
105
+ >>> write_missing_message("BOOL", None)
106
+ 'BOOL values cannot be missing in an Array. Remove them.'
107
+ >>> write_missing_message("BOOL", "paid")
108
+ "The column 'paid' has missing values, which a BOOL Array cannot hold. Remove them with drop_missing."
109
+ """
110
+ converts_to_decimal = type_name != BOOL_TYPE_NAME
111
+ if column_name is None:
112
+ list_advice = LIST_DECIMAL_ADVICE if converts_to_decimal else LIST_ADVICE
113
+ if advice is not None:
114
+ list_advice = advice
115
+
116
+ list_message = LIST_MESSAGE.format(type_name=type_name, advice=list_advice)
117
+ return list_message
118
+
119
+ column_advice = COLUMN_DECIMAL_ADVICE if converts_to_decimal else COLUMN_ADVICE
120
+ first_letter = type_name[0]
121
+ article = ARTICLE_BEFORE_VOWEL if first_letter in VOWELS else ARTICLE
122
+ column_message = COLUMN_MESSAGE.format(
123
+ column_name=column_name,
124
+ article=article,
125
+ type_name=type_name,
126
+ advice=column_advice,
127
+ )
128
+
129
+ return column_message
@@ -0,0 +1,62 @@
1
+ """
2
+ Error raised when a type has no equivalent between numdaplot and an underlying library.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.data_types.library import Library
8
+ from numdaplot.errors.numdaplot_error import NumdaplotError
9
+
10
+ UNSUPPORTED_TYPE_MESSAGE = "The type {type_name} has no equivalent between numdaplot and {library_name}."
11
+
12
+
13
+ class UnsupportedTypeError(NumdaplotError):
14
+ """
15
+ Raised when a type cannot be converted between numdaplot and numpy or pandas.
16
+
17
+ For example, numpy has no ``CATEGORY`` type, and numdaplot has no complex number type.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ type_name
24
+ Name of the type that cannot be converted.
25
+ library
26
+ Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
27
+
28
+ Attributes
29
+ ----------
30
+ type_name
31
+ Name of the type that cannot be converted.
32
+ library
33
+ Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
34
+
35
+ Examples
36
+ --------
37
+ >>> import numdaplot as ndp
38
+ >>> import numpy
39
+ >>> try:
40
+ ... ndp.Array.from_numpy(numpy.array([1 + 2j]))
41
+ ... except ndp.UnsupportedTypeError as error:
42
+ ... print(error)
43
+ The type complex128 has no equivalent between numdaplot and numpy.
44
+ """
45
+
46
+ def __init__(self, type_name: str, library: Library) -> None:
47
+ """
48
+ Build the error message from the type and the library.
49
+
50
+ .. versionadded:: 0.1.0
51
+
52
+ Parameters
53
+ ----------
54
+ type_name
55
+ Name of the type that cannot be converted.
56
+ library
57
+ Library on the other side of the conversion, ``Library.NUMPY`` or ``Library.PANDAS``.
58
+ """
59
+ message = UNSUPPORTED_TYPE_MESSAGE.format(type_name=type_name, library_name=library.value)
60
+ super().__init__(message)
61
+ self.type_name = type_name
62
+ self.library = library
@@ -0,0 +1,215 @@
1
+ """
2
+ Error raised when values cannot be stored in a type without losing information, or texts cannot be read as dates.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+ from numdaplot.errors.rejected_dates import RejectedDate, RejectedDatePart
9
+
10
+ VALUE_CONVERSION_MESSAGE = (
11
+ "Cannot store {source_type_name} values{column_text} as {target_type_name} without losing information."
12
+ )
13
+ REJECTED_VALUE_MESSAGE = (
14
+ "Cannot store the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} "
15
+ "without losing information."
16
+ )
17
+ UNREADABLE_DATE_MESSAGE = (
18
+ "Cannot read the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} with the format "
19
+ "{date_format_name}. Give the format of the column with format=, using DateFormat or CustomDateFormat."
20
+ )
21
+ NOT_WHOLE_PART_MESSAGE = (
22
+ "Cannot use the {source_type_name} value {rejected_value.value!r} as a {rejected_value.part_name}: "
23
+ "date parts must be whole numbers."
24
+ )
25
+ IMPOSSIBLE_DATE_MESSAGE = (
26
+ "Cannot build a {target_type_name} from the year {rejected_value.year}, the month {rejected_value.month} and the "
27
+ "day {rejected_value.day}."
28
+ )
29
+ UNREADABLE_TIME_MESSAGE = (
30
+ "Cannot read the {source_type_name} value {rejected_value!r}{column_text} as {target_type_name} with the format "
31
+ "{date_format_name}. Give the format of the column with format=, using a CustomDateFormat of a time only."
32
+ )
33
+ TIME_TYPE_NAME = "TIME"
34
+ COLUMN_TEXT = " of the column {column_name!r}"
35
+ NO_COLUMN_TEXT = ""
36
+
37
+
38
+ class ValueConversionError(NumdaplotError):
39
+ """
40
+ Raised when values cannot be stored in a type without losing information, or texts cannot be read as dates.
41
+
42
+ For example, decimals stored as integers, a text stored as a number, a text that does not follow the date
43
+ format, or date parts that form no date. When the first rejected value is known, the message shows it.
44
+
45
+ .. versionadded:: 0.1.0
46
+
47
+ Parameters
48
+ ----------
49
+ source_type_name
50
+ Name of the ``ndp.Type`` member of the given values.
51
+ target_type_name
52
+ Name of the ``ndp.Type`` member they should be stored as, or ``JSON`` for a value JSON cannot write.
53
+ rejected_value
54
+ The first value that cannot be stored. When omitted, the message names no value. A ``RejectedDatePart`` or
55
+ a ``RejectedDate``, with the year, the month and the day, names the date parts that form no date.
56
+ date_format_name
57
+ The name or the pattern of the date format a rejected text was read with. When omitted, or without
58
+ ``rejected_value``, the message names no format.
59
+
60
+ Attributes
61
+ ----------
62
+ source_type_name
63
+ Name of the ``ndp.Type`` member of the given values.
64
+ target_type_name
65
+ Name of the ``ndp.Type`` member they should be stored as.
66
+ rejected_value
67
+ The first value that cannot be stored, or ``None`` when it is not known.
68
+ date_format_name
69
+ The name or the pattern of the date format a rejected text was read with, ``None`` for other values.
70
+ column_name
71
+ Name of the Table column holding the values, or ``None`` for values given to an Array.
72
+
73
+ Examples
74
+ --------
75
+ >>> import numdaplot as ndp
76
+ >>> try:
77
+ ... ndp.Array.from_list([1.5, 2.5], dtype=ndp.Type.INT64)
78
+ ... except ndp.ValueConversionError as error:
79
+ ... print(error)
80
+ Cannot store FLOAT64 values as INT64 without losing information.
81
+ >>> days = ndp.Table.from_arrays({"day": ndp.Array.from_list(["31/12/2026"])})
82
+ >>> try:
83
+ ... days.convert(ndp.Conversion(column="day", dtype=ndp.Type.DATE))
84
+ ... except ndp.ValueConversionError as error:
85
+ ... print(error)
86
+ Cannot read the TEXT value '31/12/2026' of the column 'day' as DATE with the format YEAR_MONTH_DAY.
87
+ Give the format of the column with format=, using DateFormat or CustomDateFormat.
88
+ """
89
+
90
+ def __init__(
91
+ self,
92
+ source_type_name: str,
93
+ target_type_name: str,
94
+ rejected_value: object = None,
95
+ date_format_name: str | None = None,
96
+ ) -> None:
97
+ """
98
+ Build the error message from the type names, and the rejected value and the date format when they are known.
99
+
100
+ .. versionadded:: 0.1.0
101
+
102
+ Parameters
103
+ ----------
104
+ source_type_name
105
+ Name of the ``ndp.Type`` member of the given values.
106
+ target_type_name
107
+ Name of the ``ndp.Type`` member they should be stored as.
108
+ rejected_value
109
+ The first value that cannot be stored. When omitted, the message names no value.
110
+ date_format_name
111
+ The name or the pattern of the date format a rejected text was read with. When omitted, or without
112
+ ``rejected_value``, the message names no format.
113
+ """
114
+ self.source_type_name = source_type_name
115
+ self.target_type_name = target_type_name
116
+ self.rejected_value = rejected_value
117
+ self.date_format_name = date_format_name
118
+ self.column_name: str | None = None
119
+ message = self.write_message(NO_COLUMN_TEXT)
120
+ super().__init__(message)
121
+
122
+ def write_message(self, column_text: str) -> str:
123
+ """
124
+ Return the message, with the rejected value and the date format when they are known.
125
+
126
+ .. versionadded:: 0.1.0
127
+
128
+ Parameters
129
+ ----------
130
+ column_text
131
+ The words naming the column after the values, or an empty text.
132
+
133
+ Returns
134
+ -------
135
+ str
136
+ The message.
137
+
138
+ Examples
139
+ --------
140
+ >>> import numdaplot as ndp
141
+ >>> ndp.ValueConversionError("FLOAT64", "INT64").write_message("")
142
+ 'Cannot store FLOAT64 values as INT64 without losing information.'
143
+ """
144
+ message_format = self.choose_message_format()
145
+ message = message_format.format(
146
+ source_type_name=self.source_type_name,
147
+ target_type_name=self.target_type_name,
148
+ rejected_value=self.rejected_value,
149
+ date_format_name=self.date_format_name,
150
+ column_text=column_text,
151
+ )
152
+
153
+ return message
154
+
155
+ def choose_message_format(self) -> str:
156
+ """
157
+ Return the message format fitting what is known of the rejected value.
158
+
159
+ .. versionadded:: 0.1.0
160
+
161
+ Returns
162
+ -------
163
+ str
164
+ The format for date parts, a text read with a date format, a known value, or values in general.
165
+
166
+ Examples
167
+ --------
168
+ >>> import numdaplot as ndp
169
+ >>> from numdaplot.errors.rejected_dates import RejectedDate
170
+ >>> print(ndp.ValueConversionError("INT64", "DATE", RejectedDate(2025, 2, 31)))
171
+ Cannot build a DATE from the year 2025, the month 2 and the day 31.
172
+ """
173
+ if isinstance(self.rejected_value, RejectedDatePart):
174
+ return NOT_WHOLE_PART_MESSAGE
175
+
176
+ if isinstance(self.rejected_value, RejectedDate):
177
+ return IMPOSSIBLE_DATE_MESSAGE
178
+
179
+ if self.rejected_value is None:
180
+ return VALUE_CONVERSION_MESSAGE
181
+
182
+ if self.date_format_name is None:
183
+ return REJECTED_VALUE_MESSAGE
184
+
185
+ if self.target_type_name == TIME_TYPE_NAME:
186
+ return UNREADABLE_TIME_MESSAGE
187
+
188
+ return UNREADABLE_DATE_MESSAGE
189
+
190
+ def name_column(self, column_name: str) -> None:
191
+ """
192
+ Name the Table column holding the values in the message, unless a column is already named.
193
+
194
+ .. versionadded:: 0.1.0
195
+
196
+ Parameters
197
+ ----------
198
+ column_name
199
+ The name of the column.
200
+
201
+ Examples
202
+ --------
203
+ >>> import numdaplot as ndp
204
+ >>> error = ndp.ValueConversionError("TEXT", "FLOAT64", "abc")
205
+ >>> error.name_column("payment")
206
+ >>> print(error)
207
+ Cannot store the TEXT value 'abc' of the column 'payment' as FLOAT64 without losing information.
208
+ """
209
+ if self.column_name is not None:
210
+ return
211
+
212
+ self.column_name = column_name
213
+ column_text = COLUMN_TEXT.format(column_name=column_name)
214
+ message = self.write_message(column_text)
215
+ self.args = (message,)
@@ -0,0 +1,5 @@
1
+ """
2
+ Sort settings shared by Array and Table: order and place of missing values.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,46 @@
1
+ """
2
+ Place of missing values in a sort.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class MissingPosition(Enum):
11
+ """
12
+ Place of missing values in a sort, whatever the order.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Array.from_list([20.0, None, 10.0])
20
+ >>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.FIRST))
21
+ Array([nan, 10., 20.], dtype=FLOAT64)
22
+ """
23
+
24
+ FIRST = auto()
25
+ """
26
+ Missing values come before every other value.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> prices = ndp.Array.from_list([20.0, None, 10.0])
32
+ >>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.FIRST))
33
+ Array([nan, 10., 20.], dtype=FLOAT64)
34
+ """
35
+
36
+ LAST = auto()
37
+ """
38
+ Missing values come after every other value, as in pandas. Default value.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> prices = ndp.Array.from_list([20.0, None, 10.0])
44
+ >>> prices.sort(ndp.ArraySorting(missing=ndp.MissingPosition.LAST))
45
+ Array([10., 20., nan], dtype=FLOAT64)
46
+ """
@@ -0,0 +1,46 @@
1
+ """
2
+ Direction of a sort.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Order(Enum):
11
+ """
12
+ Direction of a sort.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Array.from_list([20, 30, 10])
20
+ >>> prices.sort(ndp.ArraySorting(order=ndp.Order.DESCENDING))
21
+ Array([30, 20, 10], dtype=INT64)
22
+ """
23
+
24
+ ASCENDING = auto()
25
+ """
26
+ From the smallest to the largest value. Default value.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> prices = ndp.Array.from_list([20, 30, 10])
32
+ >>> prices.sort(ndp.ArraySorting(order=ndp.Order.ASCENDING))
33
+ Array([10, 20, 30], dtype=INT64)
34
+ """
35
+
36
+ DESCENDING = auto()
37
+ """
38
+ From the largest to the smallest value.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> prices = ndp.Array.from_list([20, 30, 10])
44
+ >>> prices.sort(ndp.ArraySorting(order=ndp.Order.DESCENDING))
45
+ Array([30, 20, 10], dtype=INT64)
46
+ """
@@ -0,0 +1,36 @@
1
+ """
2
+ Version of the installed package.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from importlib.metadata import PackageNotFoundError, version
8
+
9
+ PACKAGE_NAME = "numdaplot"
10
+ UNKNOWN_VERSION = "0+unknown"
11
+
12
+
13
+ def find_package_version() -> str:
14
+ """
15
+ Return the version of numdaplot, as written in the information of the installed package.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Returns
20
+ -------
21
+ str
22
+ The version, or ``0+unknown`` for a code that runs without being installed.
23
+
24
+ Examples
25
+ --------
26
+ >>> import numdaplot as ndp
27
+ >>> from numdaplot.package_version import find_package_version
28
+ >>> find_package_version() == ndp.__version__
29
+ True
30
+ """
31
+ try:
32
+ package_version = version(PACKAGE_NAME)
33
+ except PackageNotFoundError:
34
+ return UNKNOWN_VERSION
35
+
36
+ return package_version
@@ -0,0 +1,5 @@
1
+ """
2
+ Plots of Tables and Arrays: charts, style, image files and display.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,47 @@
1
+ """
2
+ A chart and the values it draws.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.plots.charts.chart import Chart
10
+ from numdaplot.plots.charts.value_axis import ValueAxis
11
+ from numdaplot.plots.data.chart_values import ChartValues
12
+ from numdaplot.plots.data.point_values import PointValues
13
+ from numdaplot.plots.data.sample_values import SampleValues
14
+
15
+
16
+ @dataclass(frozen=True, eq=False)
17
+ class ChartLayer:
18
+ """
19
+ A chart and the values it draws, read when the Plot is created.
20
+
21
+ .. versionadded:: 0.1.0
22
+
23
+ Parameters
24
+ ----------
25
+ chart
26
+ The chart settings.
27
+ values
28
+ The positions and the series, or for a ``HistogramChart`` and a ``BoxChart`` the columns and their groups.
29
+ points
30
+ The values coloring and sizing the points of a ``ScatterChart``, None for other charts.
31
+ value_axis
32
+ The vertical axis the chart is measured on, ``ValueAxis.LEFT`` unless added on the right.
33
+
34
+ Examples
35
+ --------
36
+ >>> import numdaplot as ndp
37
+ >>> from numdaplot.plots.chart_layer import ChartLayer
38
+ >>> from numdaplot.plots.data.array_values import read_array_values
39
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
40
+ >>> ChartLayer(ndp.LineChart(), read_array_values(prices, "LineChart")).points is None
41
+ True
42
+ """
43
+
44
+ chart: Chart
45
+ values: ChartValues | SampleValues
46
+ points: PointValues | None = None
47
+ value_axis: ValueAxis = ValueAxis.LEFT
@@ -0,0 +1,5 @@
1
+ """
2
+ Charts drawn by a Plot and the look of their series.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """