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,248 @@
1
+ """
2
+ Columns shown by the charts of a Plot, and the checks of the names they are shown under.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import cast
8
+
9
+ from numdaplot.errors.column_not_found_error import ColumnNotFoundError
10
+ from numdaplot.errors.duplicate_column_error import DuplicateColumnError
11
+ from numdaplot.plots.chart_layer import ChartLayer
12
+ from numdaplot.plots.data.chart_values import ChartValues
13
+ from numdaplot.plots.data.missing_cells import MissingCounts
14
+ from numdaplot.plots.data.point_values import PointValues
15
+ from numdaplot.plots.data.sample_values import SampleValues
16
+ from numdaplot.tables.columns.renaming import Renaming
17
+
18
+
19
+ def find_shown_columns(layers: list[ChartLayer]) -> set[str]:
20
+ """
21
+ Return the names of the columns shown by the charts of a Plot.
22
+
23
+ .. versionadded:: 0.1.0
24
+
25
+ Parameters
26
+ ----------
27
+ layers
28
+ The charts of the Plot and their values.
29
+
30
+ Returns
31
+ -------
32
+ set[str]
33
+ The ``x`` column, the drawn columns, the group, color and size columns, or the columns of a missing value
34
+ chart; ``"0"``, ``"1"``... for the columns of an Array.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> from numdaplot.plots.chart_layer import ChartLayer
40
+ >>> from numdaplot.plots.data.table_values import read_table_values
41
+ >>> from numdaplot.plots.data.shown_columns import find_shown_columns
42
+ >>> days = ndp.Array.from_list([1, 2])
43
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
44
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
45
+ >>> layer = ChartLayer(ndp.LineChart(), read_table_values(sales, "day", ["price"], "LineChart"))
46
+ >>> sorted(find_shown_columns([layer]))
47
+ ['day', 'price']
48
+ """
49
+ shown_columns = set[str]()
50
+ for layer in layers:
51
+ value_columns = find_value_columns(layer.values)
52
+ shown_columns.update(value_columns)
53
+ if layer.points is not None:
54
+ point_columns = find_point_columns(layer.points)
55
+ shown_columns.update(point_columns)
56
+
57
+ return shown_columns
58
+
59
+
60
+ def find_value_columns(values: ChartValues | SampleValues) -> list[str]:
61
+ """
62
+ Return the names of the columns shown by the values of one chart.
63
+
64
+ .. versionadded:: 0.1.0
65
+
66
+ Parameters
67
+ ----------
68
+ values
69
+ The values of a chart.
70
+
71
+ Returns
72
+ -------
73
+ list[str]
74
+ The column names, the columns of a missing value chart being its positions.
75
+
76
+ Examples
77
+ --------
78
+ >>> import numpy
79
+ >>> import numdaplot as ndp
80
+ >>> from numdaplot.plots.data.chart_values import Series
81
+ >>> from numdaplot.plots.data.sample_values import SampleValues
82
+ >>> from numdaplot.plots.data.shown_columns import find_value_columns
83
+ >>> prices = Series("price", numpy.array([12.0]))
84
+ >>> find_value_columns(SampleValues([prices], None, "city", "price", ndp.Type.FLOAT64))
85
+ ['price', 'city']
86
+ """
87
+ if isinstance(values, MissingCounts):
88
+ raw_columns = values.positions.values.tolist()
89
+ missing_columns = cast(list[str], raw_columns)
90
+ return missing_columns
91
+
92
+ value_columns = [series.name for series in values.series]
93
+ if isinstance(values, SampleValues):
94
+ group_columns = optional_names(values.group_name)
95
+ sample_columns = value_columns + group_columns
96
+ return sample_columns
97
+
98
+ position_columns = optional_names(values.positions.name)
99
+ chart_columns = position_columns + value_columns
100
+
101
+ return chart_columns
102
+
103
+
104
+ def find_point_columns(points: PointValues) -> list[str]:
105
+ """
106
+ Return the names of the color and size columns of a scatter chart.
107
+
108
+ .. versionadded:: 0.1.0
109
+
110
+ Parameters
111
+ ----------
112
+ points
113
+ The colors and the sizes of the points.
114
+
115
+ Returns
116
+ -------
117
+ list[str]
118
+ The names of the columns given, empty when the points take no column.
119
+
120
+ Examples
121
+ --------
122
+ >>> from numdaplot.plots.data.point_values import PointValues
123
+ >>> from numdaplot.plots.data.shown_columns import find_point_columns
124
+ >>> find_point_columns(PointValues("zone", None, None, None))
125
+ ['zone']
126
+ """
127
+ color_columns = optional_names(points.color_name)
128
+ size_columns = optional_names(points.size_name)
129
+ point_columns = color_columns + size_columns
130
+
131
+ return point_columns
132
+
133
+
134
+ def optional_names(name: str | None) -> list[str]:
135
+ """
136
+ Return a name in a list, or an empty list when there is none.
137
+
138
+ .. versionadded:: 0.1.0
139
+
140
+ Parameters
141
+ ----------
142
+ name
143
+ A column name, or None.
144
+
145
+ Returns
146
+ -------
147
+ list[str]
148
+ The name alone, or nothing.
149
+
150
+ Examples
151
+ --------
152
+ >>> from numdaplot.plots.data.shown_columns import optional_names
153
+ >>> optional_names("day"), optional_names(None)
154
+ (['day'], [])
155
+ """
156
+ if name is None:
157
+ return []
158
+
159
+ names = [name]
160
+
161
+ return names
162
+
163
+
164
+ def require_distinct_shown_names(layers: list[ChartLayer], renaming: Renaming | None) -> None:
165
+ """
166
+ Check that no column is shown under the name of another column that keeps its own name.
167
+
168
+ .. versionadded:: 0.1.0
169
+
170
+ Parameters
171
+ ----------
172
+ layers
173
+ The charts of the Plot known so far.
174
+ renaming
175
+ The names under which some columns are shown, or None.
176
+
177
+ Raises
178
+ ------
179
+ DuplicateColumnError
180
+ When a new name is the name of another shown column that is not renamed itself.
181
+
182
+ Examples
183
+ --------
184
+ >>> import numdaplot as ndp
185
+ >>> from numdaplot.plots.chart_layer import ChartLayer
186
+ >>> from numdaplot.plots.data.table_values import read_table_values
187
+ >>> from numdaplot.plots.data.shown_columns import require_distinct_shown_names
188
+ >>> days = ndp.Array.from_list([1, 2])
189
+ >>> prices = ndp.Array.from_list([12.0, 15.5])
190
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices})
191
+ >>> layer = ChartLayer(ndp.LineChart(), read_table_values(sales, "day", ["price"], "LineChart"))
192
+ >>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="price", new_name="day")])
193
+ >>> try:
194
+ ... require_distinct_shown_names([layer], renaming)
195
+ ... except ndp.DuplicateColumnError as error:
196
+ ... print(error)
197
+ The column name 'day' appears more than once.
198
+ """
199
+ if renaming is None:
200
+ return
201
+
202
+ shown_columns = find_shown_columns(layers)
203
+ renamed_columns = {change.old_name for change in renaming.changes}
204
+ kept_columns = shown_columns - renamed_columns
205
+ for change in renaming.changes:
206
+ if change.new_name in kept_columns:
207
+ raise DuplicateColumnError(change.new_name)
208
+
209
+
210
+ def require_renamed_columns_shown(layers: list[ChartLayer], renaming: Renaming | None) -> None:
211
+ """
212
+ Check that every renamed column is shown by a chart of the Plot.
213
+
214
+ .. versionadded:: 0.1.0
215
+
216
+ Parameters
217
+ ----------
218
+ layers
219
+ Every chart of the Plot.
220
+ renaming
221
+ The names under which some columns are shown, or None.
222
+
223
+ Raises
224
+ ------
225
+ ColumnNotFoundError
226
+ At the first renamed column that no chart shows.
227
+
228
+ Examples
229
+ --------
230
+ >>> import numdaplot as ndp
231
+ >>> from numdaplot.plots.chart_layer import ChartLayer
232
+ >>> from numdaplot.plots.data.array_values import read_array_values
233
+ >>> from numdaplot.plots.data.shown_columns import require_renamed_columns_shown
234
+ >>> layer = ChartLayer(ndp.LineChart(), read_array_values(ndp.Array.from_list([12.0]), "LineChart"))
235
+ >>> renaming = ndp.Renaming(changes=[ndp.NameChange(old_name="prise", new_name="Price")])
236
+ >>> try:
237
+ ... require_renamed_columns_shown([layer], renaming)
238
+ ... except ndp.ColumnNotFoundError as error:
239
+ ... print(error)
240
+ No column is named 'prise'.
241
+ """
242
+ if renaming is None:
243
+ return
244
+
245
+ shown_columns = find_shown_columns(layers)
246
+ for change in renaming.changes:
247
+ if change.old_name not in shown_columns:
248
+ raise ColumnNotFoundError(change.old_name)
@@ -0,0 +1,256 @@
1
+ """
2
+ Values a chart draws from the columns of a Table.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import numpy
8
+ import pandas
9
+ from numpy.typing import NDArray
10
+
11
+ from numdaplot.data_types.type import Type
12
+ from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
13
+ from numdaplot.plots.data.column_reading import read_positions, read_values, require_same_family
14
+ from numdaplot.plots.data.position_kind import PositionKind
15
+ from numdaplot.tables.columns.column_names import require_known_columns
16
+ from numdaplot.tables.frames.column_values import find_column_type
17
+ from numdaplot.tables.table import Table
18
+ from numdaplot.tables.table_data import read_stored_frame
19
+
20
+ MAXIMUM_NAMED_COLUMNS = 3
21
+ NAME_SEPARATOR = ", "
22
+ SHORTENED_NAMES = "{joined_names} and {other_count} more"
23
+
24
+
25
+ def read_table_values(table: Table, x_name: str | None, y_names: list[str], chart_name: str) -> ChartValues:
26
+ """
27
+ Return the positions and the series a chart draws from a Table.
28
+
29
+ A row whose ``x`` number or moment is missing draws no value, so it breaks a line. A row whose ``x`` text
30
+ is missing is left out, having no label.
31
+
32
+ .. versionadded:: 0.1.0
33
+
34
+ Parameters
35
+ ----------
36
+ table
37
+ The Table drawn.
38
+ x_name
39
+ The column of the positions, or None for the row numbers.
40
+ y_names
41
+ The columns drawn, one series each: numbers, or times of day for a chart measuring them.
42
+ chart_name
43
+ Name of the chart class, shown in error messages.
44
+
45
+ Returns
46
+ -------
47
+ ChartValues
48
+ The positions, and one series per ``y`` column.
49
+
50
+ Raises
51
+ ------
52
+ ColumnNotFoundError
53
+ When a column does not exist.
54
+ IncompatibleTypesError
55
+ When ``x`` holds booleans or durations, a ``y`` column holds neither numbers nor times of day for a chart
56
+ measuring them, or the ``y`` columns mix numbers and times of day.
57
+
58
+ Examples
59
+ --------
60
+ >>> import pandas
61
+ >>> import numdaplot as ndp
62
+ >>> from numdaplot.plots.data.table_values import read_table_values
63
+ >>> sales = ndp.Table.from_pandas(pandas.DataFrame({"city": ["Paris", None, "Pau"], "price": [12.0, 15.5, None]}))
64
+ >>> chart_values = read_table_values(sales, "city", ["price"], "BarChart")
65
+ >>> chart_values.positions.values
66
+ array(['Paris', 'Pau'], dtype=object)
67
+ >>> chart_values.series[0].values
68
+ array([12., nan])
69
+ """
70
+ frame = read_stored_frame(table)
71
+ column_names = frame.columns.tolist()
72
+ require_known_columns(y_names, column_names)
73
+ positions = read_table_positions(frame, x_name, chart_name)
74
+ missing_positions = find_missing_positions(positions)
75
+ rows = numpy.flatnonzero(~missing_positions)
76
+ if positions.kind != PositionKind.TEXTS:
77
+ rows = numpy.arange(len(frame))
78
+
79
+ kept_positions = Positions(positions.kind, positions.values[rows], positions.name)
80
+ column_series, value_type = read_series(frame, y_names, chart_name)
81
+ series = list[Series]()
82
+
83
+ for one_series in column_series:
84
+ drawn_numbers = numpy.where(missing_positions, numpy.nan, one_series.values)
85
+ kept_numbers = drawn_numbers[rows]
86
+ kept_series = Series(one_series.name, kept_numbers)
87
+ series.append(kept_series)
88
+
89
+ value_name = name_columns(y_names)
90
+ chart_values = ChartValues(kept_positions, series, rows, value_name, value_type)
91
+
92
+ return chart_values
93
+
94
+
95
+ def read_table_positions(frame: pandas.DataFrame, x_name: str | None, chart_name: str) -> Positions:
96
+ """
97
+ Return the ``x`` values of a chart drawing a Table.
98
+
99
+ .. versionadded:: 0.1.0
100
+
101
+ Parameters
102
+ ----------
103
+ frame
104
+ The columns of the Table.
105
+ x_name
106
+ The column of the positions, or None for the row numbers.
107
+ chart_name
108
+ Name of the chart class, shown in error messages.
109
+
110
+ Returns
111
+ -------
112
+ Positions
113
+ The values of the column, or the row numbers from 0.
114
+
115
+ Raises
116
+ ------
117
+ ColumnNotFoundError
118
+ When the ``x`` column does not exist.
119
+ IncompatibleTypesError
120
+ When the ``x`` column holds booleans or durations.
121
+
122
+ Examples
123
+ --------
124
+ >>> import pandas
125
+ >>> from numdaplot.plots.data.table_values import read_table_positions
126
+ >>> read_table_positions(pandas.DataFrame({"price": [12.0, 15.5]}), None, "LineChart").values
127
+ array([0., 1.])
128
+ """
129
+ if x_name is None:
130
+ row_count = len(frame)
131
+ row_numbers = numpy.arange(row_count, dtype=numpy.float64)
132
+ row_positions = Positions(PositionKind.NUMBERS, row_numbers, None)
133
+ return row_positions
134
+
135
+ column_names = frame.columns.tolist()
136
+ require_known_columns([x_name], column_names)
137
+ kind, values = read_positions(frame[x_name], chart_name)
138
+ column_positions = Positions(kind, values, x_name)
139
+
140
+ return column_positions
141
+
142
+
143
+ def find_missing_positions(positions: Positions) -> NDArray[numpy.bool_]:
144
+ """
145
+ Return which ``x`` values are missing.
146
+
147
+ .. versionadded:: 0.1.0
148
+
149
+ Parameters
150
+ ----------
151
+ positions
152
+ The ``x`` values of a chart.
153
+
154
+ Returns
155
+ -------
156
+ NDArray[numpy.bool_]
157
+ True at each NaN number, NaT moment or missing text.
158
+
159
+ Examples
160
+ --------
161
+ >>> import numpy
162
+ >>> from numdaplot.plots.data.chart_values import Positions
163
+ >>> from numdaplot.plots.data.position_kind import PositionKind
164
+ >>> from numdaplot.plots.data.table_values import find_missing_positions
165
+ >>> find_missing_positions(Positions(PositionKind.TEXTS, numpy.array(["Paris", None]), "city"))
166
+ array([False, True])
167
+ """
168
+ missing_values = pandas.isna(positions.values)
169
+
170
+ return missing_values
171
+
172
+
173
+ def read_series(frame: pandas.DataFrame, column_names: list[str], chart_name: str) -> tuple[list[Series], Type]:
174
+ """
175
+ Return each column of values of a Table as a series named after it, with the type of the first column.
176
+
177
+ .. versionadded:: 0.1.0
178
+
179
+ Parameters
180
+ ----------
181
+ frame
182
+ The columns of the Table.
183
+ column_names
184
+ The columns read, at least one, known to exist.
185
+ chart_name
186
+ Name of the chart class, shown in the error message.
187
+
188
+ Returns
189
+ -------
190
+ tuple[list[Series], Type]
191
+ One series per column, NaN where a value is missing, a time of day being its hours since midnight, and
192
+ the type of the first column.
193
+
194
+ Raises
195
+ ------
196
+ IncompatibleTypesError
197
+ When a column holds neither numbers nor times of day for a chart measuring them, or the columns mix
198
+ numbers and times of day.
199
+
200
+ Examples
201
+ --------
202
+ >>> import pandas
203
+ >>> from numdaplot.plots.data.table_values import read_series
204
+ >>> frame = pandas.DataFrame({"price": [12.0, None]})
205
+ >>> series, value_type = read_series(frame, ["price"], "BoxChart")
206
+ >>> series[0].values, value_type
207
+ (array([12., nan]), <Type.FLOAT64: 10>)
208
+ """
209
+ series = list[Series]()
210
+ first_name = column_names[0]
211
+ first_column = frame[first_name]
212
+ value_type = find_column_type(first_column)
213
+
214
+ for column_name in column_names:
215
+ column = frame[column_name]
216
+ values = read_values(column, chart_name)
217
+ require_same_family(column, value_type, chart_name)
218
+ column_series = Series(column_name, values)
219
+ series.append(column_series)
220
+
221
+ return series, value_type
222
+
223
+
224
+ def name_columns(column_names: list[str]) -> str:
225
+ """
226
+ Return the names of the columns a chart draws, the default label of the axis of its values.
227
+
228
+ .. versionadded:: 0.1.0
229
+
230
+ Parameters
231
+ ----------
232
+ column_names
233
+ The columns drawn, at least one.
234
+
235
+ Returns
236
+ -------
237
+ str
238
+ The names one after the other. Beyond 3 columns, the first 3 and the number of the others.
239
+
240
+ Examples
241
+ --------
242
+ >>> from numdaplot.plots.data.table_values import name_columns
243
+ >>> name_columns(["price"]), name_columns(["price", "cost"])
244
+ ('price', 'price, cost')
245
+ >>> name_columns(["price", "cost", "tax", "tip"])
246
+ 'price, cost, tax and 1 more'
247
+ """
248
+ named_columns = column_names[:MAXIMUM_NAMED_COLUMNS]
249
+ joined_names = NAME_SEPARATOR.join(named_columns)
250
+ other_count = len(column_names) - MAXIMUM_NAMED_COLUMNS
251
+ if other_count <= 0:
252
+ return joined_names
253
+
254
+ shortened_names = SHORTENED_NAMES.format(joined_names=joined_names, other_count=other_count)
255
+
256
+ return shortened_names
@@ -0,0 +1,45 @@
1
+ """
2
+ Check that the values of a chart have different labels.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Iterable
8
+
9
+ from numdaplot.errors.duplicate_label_error import DuplicateLabelError
10
+
11
+
12
+ def require_unique_labels(labels: Iterable[str]) -> None:
13
+ """
14
+ Check that every value of a chart has its own label, such as the slices of a PieChart.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Parameters
19
+ ----------
20
+ labels
21
+ The label of each value.
22
+
23
+ Raises
24
+ ------
25
+ DuplicateLabelError
26
+ At the first label already seen.
27
+
28
+ Examples
29
+ --------
30
+ >>> import numpy
31
+ >>> import numdaplot as ndp
32
+ >>> from numdaplot.plots.data.unique_labels import require_unique_labels
33
+ >>> try:
34
+ ... require_unique_labels(numpy.array(["Paris", "Lyon", "Paris"], dtype=object))
35
+ ... except ndp.DuplicateLabelError as error:
36
+ ... print(error)
37
+ The label 'Paris' appears more than once.
38
+ """
39
+ seen_labels = set[str]()
40
+
41
+ for label in labels:
42
+ if label in seen_labels:
43
+ raise DuplicateLabelError(label)
44
+
45
+ seen_labels.add(label)
@@ -0,0 +1,5 @@
1
+ """
2
+ Drawing of Plots on matplotlib figures.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """