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,82 @@
1
+ r"""
2
+ Error raised when a column name appears more than once.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ DUPLICATE_COLUMN_MESSAGE = "The column name {column_name!r} appears more than once."
10
+ DUPLICATE_CLEANED_MESSAGE = (
11
+ "The column names {first_name!r} and {second_name!r} both become {column_name!r} once cleaned. "
12
+ "Use ColumnNames.KEPT to keep them as written."
13
+ )
14
+
15
+
16
+ class DuplicateColumnError(NumdaplotError):
17
+ r"""
18
+ Raised when a column name appears twice.
19
+
20
+ For example in a file header, in a list of columns, when renaming or adding a column, or when two names of a file
21
+ become the same once their spaces and line breaks are removed.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ column_name
28
+ The repeated name.
29
+ original_names
30
+ The two names, as written in the file, that both become ``column_name`` once cleaned. When omitted, the
31
+ name itself appears twice.
32
+
33
+ Attributes
34
+ ----------
35
+ column_name
36
+ The repeated name.
37
+ original_names
38
+ The two names as written before cleaning, ``None`` when the name itself appears twice.
39
+
40
+ Examples
41
+ --------
42
+ >>> import tempfile
43
+ >>> from pathlib import Path
44
+ >>> import numdaplot as ndp
45
+ >>> try:
46
+ ... ndp.ColumnChoice(columns=["price", "price"])
47
+ ... except ndp.DuplicateColumnError as error:
48
+ ... print(error)
49
+ The column name 'price' appears more than once.
50
+ >>> path = Path(tempfile.mkdtemp()) / "sales.csv"
51
+ >>> _ = path.write_text("id,id \n1,2\n")
52
+ >>> try:
53
+ ... ndp.Table.from_csv(path)
54
+ ... except ndp.DuplicateColumnError as error:
55
+ ... print(error)
56
+ The column names 'id' and 'id ' both become 'id' once cleaned. Use ColumnNames.KEPT to keep them as written.
57
+ """
58
+
59
+ def __init__(self, column_name: str, original_names: list[str] | None = None) -> None:
60
+ """
61
+ Build the error message from the column name, and from the names before cleaning when they are given.
62
+
63
+ .. versionadded:: 0.1.0
64
+
65
+ Parameters
66
+ ----------
67
+ column_name
68
+ The repeated name.
69
+ original_names
70
+ The two names before cleaning. When omitted, the name itself appears twice.
71
+ """
72
+ message = DUPLICATE_COLUMN_MESSAGE.format(column_name=column_name)
73
+ if original_names is not None:
74
+ first_name, second_name = original_names
75
+ message = DUPLICATE_CLEANED_MESSAGE.format(
76
+ first_name=first_name, second_name=second_name, column_name=column_name
77
+ )
78
+
79
+ super().__init__(message)
80
+
81
+ self.column_name = column_name
82
+ self.original_names = original_names
@@ -0,0 +1,55 @@
1
+ """
2
+ Error raised when a chart labels two values with the same text.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ DUPLICATE_LABEL_MESSAGE = "The label {label!r} appears more than once."
10
+
11
+
12
+ class DuplicateLabelError(NumdaplotError):
13
+ """
14
+ Raised when two slices of a ``PieChart`` have the same label, which could not tell them apart.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ label
21
+ The repeated label.
22
+
23
+ Attributes
24
+ ----------
25
+ label
26
+ The repeated label.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> cities = ndp.Array.from_list(["Paris", "Paris"])
32
+ >>> sales = ndp.Array.from_list([120.0, 80.0])
33
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
34
+ >>> chart = ndp.PieChart(labels="city", values="sales")
35
+ >>> try:
36
+ ... ndp.Plot.pie(shares, chart)
37
+ ... except ndp.DuplicateLabelError as error:
38
+ ... print(error)
39
+ The label 'Paris' appears more than once.
40
+ """
41
+
42
+ def __init__(self, label: str) -> None:
43
+ """
44
+ Build the error message from the label.
45
+
46
+ .. versionadded:: 0.1.0
47
+
48
+ Parameters
49
+ ----------
50
+ label
51
+ The repeated label.
52
+ """
53
+ message = DUPLICATE_LABEL_MESSAGE.format(label=label)
54
+ super().__init__(message)
55
+ self.label = label
@@ -0,0 +1,55 @@
1
+ """
2
+ Error raised when a statistic appears twice in a list of statistics.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ DUPLICATE_STATISTIC_MESSAGE = "The statistic {statistic!r} appears more than once."
10
+
11
+
12
+ class DuplicateStatisticError(NumdaplotError):
13
+ """
14
+ Raised when the same statistic appears twice in the functions of a ``Description``, which would give two equal rows.
15
+
16
+ Two statistics are the same when they have the same class and the same settings, so ``Quantile(0.25)`` and
17
+ ``Quantile(0.75)`` are different.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ statistic
24
+ The statistic given twice.
25
+
26
+ Attributes
27
+ ----------
28
+ statistic
29
+ The statistic given twice.
30
+
31
+ Examples
32
+ --------
33
+ >>> import numdaplot as ndp
34
+ >>> try:
35
+ ... ndp.Description(functions=[ndp.Sum(), ndp.Sum()])
36
+ ... except ndp.DuplicateStatisticError as error:
37
+ ... print(error)
38
+ The statistic Sum() appears more than once.
39
+ """
40
+
41
+ def __init__(self, statistic: object) -> None:
42
+ """
43
+ Build the error message from the statistic given twice.
44
+
45
+ .. versionadded:: 0.1.0
46
+
47
+ Parameters
48
+ ----------
49
+ statistic
50
+ The statistic given twice.
51
+ """
52
+ message = DUPLICATE_STATISTIC_MESSAGE.format(statistic=statistic)
53
+ super().__init__(message)
54
+
55
+ self.statistic = statistic
@@ -0,0 +1,54 @@
1
+ """
2
+ Error raised when a value is given twice where each value must be unique.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ DUPLICATE_VALUE_MESSAGE = "The value {value!r} appears more than once."
10
+
11
+
12
+ class DuplicateValueError(NumdaplotError):
13
+ """
14
+ Raised when a value is given twice where each value must be unique.
15
+
16
+ For example, the same old value in two ``ValueChange`` of a ``ValueMapping``.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ value
23
+ The repeated value.
24
+
25
+ Attributes
26
+ ----------
27
+ value
28
+ The repeated value.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> try:
34
+ ... ndp.ValueMapping(changes=[ndp.ValueChange(2, "Femme"), ndp.ValueChange(2, "F")])
35
+ ... except ndp.DuplicateValueError as error:
36
+ ... print(error)
37
+ The value 2 appears more than once.
38
+ """
39
+
40
+ def __init__(self, value: object) -> None:
41
+ """
42
+ Build the error message from the repeated value.
43
+
44
+ .. versionadded:: 0.1.0
45
+
46
+ Parameters
47
+ ----------
48
+ value
49
+ The repeated value.
50
+ """
51
+ message = DUPLICATE_VALUE_MESSAGE.format(value=value)
52
+ super().__init__(message)
53
+
54
+ self.value = value
@@ -0,0 +1,55 @@
1
+ """
2
+ Error raised when a statistic needs at least one present value and gets none.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_ARRAY_MESSAGE = "Cannot compute {statistic_name} without any present value."
10
+
11
+
12
+ class EmptyArrayError(NumdaplotError):
13
+ """
14
+ Raised when a statistic that needs at least one value gets none.
15
+
16
+ ``Mean`` or ``Max`` cannot be computed on values that are all missing, or on no value at all.
17
+
18
+ .. versionadded:: 0.1.0
19
+
20
+ Parameters
21
+ ----------
22
+ statistic_name
23
+ Name of the statistic.
24
+
25
+ Attributes
26
+ ----------
27
+ statistic_name
28
+ Name of the statistic.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> array = ndp.Array.from_list([None, None], dtype=ndp.Type.FLOAT64)
34
+ >>> try:
35
+ ... array.compute(ndp.Mean())
36
+ ... except ndp.EmptyArrayError as error:
37
+ ... print(error)
38
+ Cannot compute Mean without any present value.
39
+ """
40
+
41
+ def __init__(self, statistic_name: str) -> None:
42
+ """
43
+ Build the error message from the statistic name.
44
+
45
+ .. versionadded:: 0.1.0
46
+
47
+ Parameters
48
+ ----------
49
+ statistic_name
50
+ Name of the statistic.
51
+ """
52
+ message = EMPTY_ARRAY_MESSAGE.format(statistic_name=statistic_name)
53
+ super().__init__(message)
54
+
55
+ self.statistic_name = statistic_name
@@ -0,0 +1,52 @@
1
+ """
2
+ Error raised when a setting receives an empty list.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_LIST_MESSAGE = "Expected at least one {item_name}, got an empty list."
10
+
11
+
12
+ class EmptyListError(NumdaplotError):
13
+ """
14
+ Raised when a setting needs at least one element, such as the conditions of a ``Filter``.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ item_name
21
+ What the list holds, such as ``condition``.
22
+
23
+ Attributes
24
+ ----------
25
+ item_name
26
+ What the list holds, such as ``condition``.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numdaplot as ndp
31
+ >>> try:
32
+ ... ndp.Filter(conditions=[])
33
+ ... except ndp.EmptyListError as error:
34
+ ... print(error)
35
+ Expected at least one condition, got an empty list.
36
+ """
37
+
38
+ def __init__(self, item_name: str) -> None:
39
+ """
40
+ Build the error message from the item name.
41
+
42
+ .. versionadded:: 0.1.0
43
+
44
+ Parameters
45
+ ----------
46
+ item_name
47
+ What the list holds, such as ``condition``.
48
+ """
49
+ message = EMPTY_LIST_MESSAGE.format(item_name=item_name)
50
+ super().__init__(message)
51
+
52
+ self.item_name = item_name
@@ -0,0 +1,34 @@
1
+ """
2
+ Error raised when a Region chooses neither rows nor columns.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_REGION_MESSAGE = "A Region needs rows, columns or both, got neither."
10
+
11
+
12
+ class EmptyRegionError(NumdaplotError):
13
+ """
14
+ Raised when a ``Region`` is created without rows and without columns, which would choose the whole object.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> import numdaplot as ndp
21
+ >>> try:
22
+ ... ndp.Region()
23
+ ... except ndp.EmptyRegionError as error:
24
+ ... print(error)
25
+ A Region needs rows, columns or both, got neither.
26
+ """
27
+
28
+ def __init__(self) -> None:
29
+ """
30
+ Build the error message.
31
+
32
+ .. versionadded:: 0.1.0
33
+ """
34
+ super().__init__(EMPTY_REGION_MESSAGE)
@@ -0,0 +1,34 @@
1
+ """
2
+ Error raised when a searched text is empty.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_TEXT_MESSAGE = "Expected a non-empty text to search for."
10
+
11
+
12
+ class EmptyTextError(NumdaplotError):
13
+ """
14
+ Raised when a rule receives an empty text to search for, which every text would contain.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> import numdaplot as ndp
21
+ >>> try:
22
+ ... ndp.Contains("")
23
+ ... except ndp.EmptyTextError as error:
24
+ ... print(error)
25
+ Expected a non-empty text to search for.
26
+ """
27
+
28
+ def __init__(self) -> None:
29
+ """
30
+ Build the error message.
31
+
32
+ .. versionadded:: 0.1.0
33
+ """
34
+ super().__init__(EMPTY_TEXT_MESSAGE)
@@ -0,0 +1,62 @@
1
+ """
2
+ Error raised when the values a chart shares out add up to 0.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_TOTAL_MESSAGE = "{chart_name} needs a positive total, the values of {column_name!r} add up to 0."
10
+
11
+
12
+ class EmptyTotalError(NumdaplotError):
13
+ """
14
+ Raised when the values of a ``PieChart`` add up to 0, which leaves nothing to share out.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ chart_name
21
+ Name of the chart class, such as ``PieChart``.
22
+ column_name
23
+ The column of the values.
24
+
25
+ Attributes
26
+ ----------
27
+ chart_name
28
+ Name of the chart class, such as ``PieChart``.
29
+ column_name
30
+ The column of the values.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon"])
36
+ >>> sales = ndp.Array.from_list([0.0, 0.0])
37
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
38
+ >>> chart = ndp.PieChart(labels="city", values="sales")
39
+ >>> try:
40
+ ... ndp.Plot.pie(shares, chart)
41
+ ... except ndp.EmptyTotalError as error:
42
+ ... print(error)
43
+ PieChart needs a positive total, the values of 'sales' add up to 0.
44
+ """
45
+
46
+ def __init__(self, chart_name: str, column_name: str) -> None:
47
+ """
48
+ Build the error message from the chart and the column.
49
+
50
+ .. versionadded:: 0.1.0
51
+
52
+ Parameters
53
+ ----------
54
+ chart_name
55
+ Name of the chart class, such as ``PieChart``.
56
+ column_name
57
+ The column of the values.
58
+ """
59
+ message = EMPTY_TOTAL_MESSAGE.format(chart_name=chart_name, column_name=column_name)
60
+ super().__init__(message)
61
+ self.chart_name = chart_name
62
+ self.column_name = column_name
@@ -0,0 +1,34 @@
1
+ """
2
+ Error raised when a list of accepted values is empty.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ EMPTY_VALUES_MESSAGE = "Expected at least one accepted value, got an empty list."
10
+
11
+
12
+ class EmptyValuesError(NumdaplotError):
13
+ """
14
+ Raised when a rule receives an empty list of accepted values, which would never keep anything.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> import numdaplot as ndp
21
+ >>> try:
22
+ ... ndp.IsIn([])
23
+ ... except ndp.EmptyValuesError as error:
24
+ ... print(error)
25
+ Expected at least one accepted value, got an empty list.
26
+ """
27
+
28
+ def __init__(self) -> None:
29
+ """
30
+ Build the error message.
31
+
32
+ .. versionadded:: 0.1.0
33
+ """
34
+ super().__init__(EMPTY_VALUES_MESSAGE)
@@ -0,0 +1,70 @@
1
+ """
2
+ Error raised when the file system refuses to read or to write a file.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from numdaplot.errors.numdaplot_error import NumdaplotError
8
+
9
+ FILE_ACCESS_MESSAGE = "Cannot {operation} {path}: {reason}."
10
+
11
+
12
+ class FileAccessError(NumdaplotError, OSError):
13
+ """
14
+ Raised when a file cannot be read or written: missing folder, missing permission, full disk and so on.
15
+
16
+ It is also a Python ``OSError``. A missing file and an existing file have their own errors,
17
+ ``FileNotFoundError`` and ``FileExistsError``.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Parameters
22
+ ----------
23
+ operation
24
+ What was attempted: ``"read"`` or ``"write to"``.
25
+ path
26
+ The path of the file.
27
+ reason
28
+ Why it failed.
29
+
30
+ Attributes
31
+ ----------
32
+ operation
33
+ What was attempted: ``"read"`` or ``"write to"``.
34
+ path
35
+ The path of the file.
36
+ reason
37
+ Why it failed.
38
+
39
+ Examples
40
+ --------
41
+ >>> import numdaplot as ndp
42
+ >>> prices = ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])})
43
+ >>> try:
44
+ ... prices.to_csv("missing_folder/prices.csv")
45
+ ... except ndp.FileAccessError as error:
46
+ ... print(error)
47
+ Cannot write to missing_folder/prices.csv: the folder missing_folder does not exist.
48
+ """
49
+
50
+ def __init__(self, operation: str, path: str, reason: str) -> None:
51
+ """
52
+ Build the error message from the operation, the path and the reason.
53
+
54
+ .. versionadded:: 0.1.0
55
+
56
+ Parameters
57
+ ----------
58
+ operation
59
+ What was attempted: ``"read"`` or ``"write to"``.
60
+ path
61
+ The path of the file.
62
+ reason
63
+ Why it failed.
64
+ """
65
+ message = FILE_ACCESS_MESSAGE.format(operation=operation, path=path, reason=reason)
66
+ super().__init__(message)
67
+
68
+ self.operation = operation
69
+ self.path = path
70
+ self.reason = reason
@@ -0,0 +1,62 @@
1
+ """
2
+ Error raised when a Table would overwrite an existing file.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import builtins
8
+
9
+ from numdaplot.errors.numdaplot_error import NumdaplotError
10
+
11
+ FILE_EXISTS_MESSAGE = "A file already exists at {path}, pass on_conflict=ndp.Conflict.REPLACE to overwrite it."
12
+
13
+
14
+ class FileExistsError(NumdaplotError, builtins.FileExistsError):
15
+ """
16
+ Raised when a Table is written to a path where a file exists and ``on_conflict`` is ``Conflict.ERROR``.
17
+
18
+ It is also a Python ``FileExistsError``, so code catching the Python error keeps working.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Parameters
23
+ ----------
24
+ path
25
+ The path of the file, as given.
26
+
27
+ Attributes
28
+ ----------
29
+ path
30
+ The path of the file, as given.
31
+
32
+ Examples
33
+ --------
34
+ >>> import tempfile
35
+ >>> from pathlib import Path
36
+ >>> import numdaplot as ndp
37
+ >>> path = Path(tempfile.mkdtemp()) / "prices.csv"
38
+ >>> prices = ndp.Table.from_arrays({"price": ndp.Array.from_list([1.5])})
39
+ >>> prices.to_csv(path)
40
+ >>> try:
41
+ ... prices.to_csv(path)
42
+ ... except ndp.FileExistsError as error:
43
+ ... print(error) # doctest: +ELLIPSIS
44
+ A file already exists at .../prices.csv, pass on_conflict=ndp.Conflict.REPLACE to overwrite it.
45
+ >>> prices.to_csv(path, on_conflict=ndp.Conflict.REPLACE)
46
+ """
47
+
48
+ def __init__(self, path: str) -> None:
49
+ """
50
+ Build the error message from the path.
51
+
52
+ .. versionadded:: 0.1.0
53
+
54
+ Parameters
55
+ ----------
56
+ path
57
+ The path of the file, as given.
58
+ """
59
+ message = FILE_EXISTS_MESSAGE.format(path=path)
60
+ super().__init__(message)
61
+
62
+ self.path = path