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,27 @@
1
+ """
2
+ Chart drawing where the values of a Table are missing.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.plots.charts.chart import Chart
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class MissingMapChart(Chart):
14
+ """
15
+ Chart drawing each value of a Table as a cell, dark when missing, made by ``Plot.missing_map``.
16
+
17
+ It has no setting, so ``Plot.missing_map`` creates it itself.
18
+
19
+ .. versionadded:: 0.1.0
20
+
21
+ Examples
22
+ --------
23
+ >>> import numdaplot as ndp
24
+ >>> from numdaplot.plots.charts.missing_map_chart import MissingMapChart
25
+ >>> isinstance(MissingMapChart(), ndp.Chart)
26
+ True
27
+ """
@@ -0,0 +1,58 @@
1
+ """
2
+ Direction of the bars of a BarChart.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Orientation(Enum):
11
+ """
12
+ Direction of the bars of a ``BarChart``.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
20
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
21
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
22
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
23
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], orientation=ndp.Orientation.HORIZONTAL)
24
+ >>> plot = ndp.Plot.bar(sales, chart)
25
+ >>> plot.show()
26
+ """
27
+
28
+ VERTICAL = auto()
29
+ """
30
+ Bars rising from the horizontal axis. Default value.
31
+
32
+ Examples
33
+ --------
34
+ >>> import numdaplot as ndp
35
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
36
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
37
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
38
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
39
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], orientation=ndp.Orientation.VERTICAL)
40
+ >>> plot = ndp.Plot.bar(sales, chart)
41
+ >>> plot.show()
42
+ """
43
+
44
+ HORIZONTAL = auto()
45
+ """
46
+ Bars extending from the vertical axis, which then holds the ``x`` values.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
52
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
53
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
54
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
55
+ >>> chart = ndp.BarChart(x="day", y=["price", "cost"], orientation=ndp.Orientation.HORIZONTAL)
56
+ >>> plot = ndp.Plot.bar(sales, chart)
57
+ >>> plot.show()
58
+ """
@@ -0,0 +1,49 @@
1
+ """
2
+ Whether a BoxChart draws its outliers.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Outliers(Enum):
11
+ """
12
+ Whether a ``BoxChart`` draws its outliers, the values beyond its whiskers.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 29.0])
20
+ >>> chart = ndp.BoxChart(outliers=ndp.Outliers.HIDDEN)
21
+ >>> plot = ndp.Plot.box(prices, chart)
22
+ >>> plot.show()
23
+ """
24
+
25
+ SHOWN = auto()
26
+ """
27
+ Each outlier is drawn as a point. Default value.
28
+
29
+ Examples
30
+ --------
31
+ >>> import numdaplot as ndp
32
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 29.0])
33
+ >>> chart = ndp.BoxChart(outliers=ndp.Outliers.SHOWN)
34
+ >>> plot = ndp.Plot.box(prices, chart)
35
+ >>> plot.show()
36
+ """
37
+
38
+ HIDDEN = auto()
39
+ """
40
+ The outliers are not drawn. They still count in the box and the whiskers.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0, 13.5, 16.0, 14.5, 29.0])
46
+ >>> chart = ndp.BoxChart(outliers=ndp.Outliers.HIDDEN)
47
+ >>> plot = ndp.Plot.box(prices, chart)
48
+ >>> plot.show()
49
+ """
@@ -0,0 +1,55 @@
1
+ """
2
+ Whether the slices of a PieChart show their share.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Percentages(Enum):
11
+ """
12
+ Whether the slices of a ``PieChart`` show their share of the total.
13
+
14
+ .. versionadded:: 0.1.0
15
+
16
+ Examples
17
+ --------
18
+ >>> import numdaplot as ndp
19
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
20
+ >>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
21
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
22
+ >>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.HIDDEN)
23
+ >>> plot = ndp.Plot.pie(shares, chart)
24
+ >>> plot.show()
25
+ """
26
+
27
+ SHOWN = auto()
28
+ """
29
+ Each slice shows its share with one decimal, such as ``42.5%``. Default value.
30
+
31
+ Examples
32
+ --------
33
+ >>> import numdaplot as ndp
34
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
35
+ >>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
36
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
37
+ >>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.SHOWN)
38
+ >>> plot = ndp.Plot.pie(shares, chart)
39
+ >>> plot.show()
40
+ """
41
+
42
+ HIDDEN = auto()
43
+ """
44
+ The slices only show their label.
45
+
46
+ Examples
47
+ --------
48
+ >>> import numdaplot as ndp
49
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
50
+ >>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
51
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
52
+ >>> chart = ndp.PieChart(labels="city", values="sales", percentages=ndp.Percentages.HIDDEN)
53
+ >>> plot = ndp.Plot.pie(shares, chart)
54
+ >>> plot.show()
55
+ """
@@ -0,0 +1,87 @@
1
+ """
2
+ Chart sharing out a total as slices of a disc.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from collections.abc import Sequence
8
+ from dataclasses import dataclass
9
+
10
+ from numdaplot.plots.charts.chart import Chart
11
+ from numdaplot.plots.charts.chart_settings import copy_colors
12
+ from numdaplot.plots.charts.percentages import Percentages
13
+ from numdaplot.plots.style.color import Color
14
+ from numdaplot.plots.style.custom_color import CustomColor
15
+ from numdaplot.settings.field_types import require_field_types
16
+ from numdaplot.tables.columns.column_names import require_column_name
17
+
18
+
19
+ @dataclass(frozen=True)
20
+ class PieChart(Chart):
21
+ """
22
+ Chart drawing each row of a Table as a slice of a disc, sized by its share of the total, used by ``Plot.pie``.
23
+
24
+ The slices start at the top and follow each other clockwise, in the order of the rows, each labeled with
25
+ its text. Every value must be present and positive or 0, and every label must be different. Beyond 5 slices,
26
+ a ``ReadabilityWarning`` suggests a ``BarChart``.
27
+
28
+ .. versionadded:: 0.1.0
29
+
30
+ Parameters
31
+ ----------
32
+ labels
33
+ The column of texts, booleans or times of day (written ``HH:MM``) naming the slices.
34
+ values
35
+ The column of numbers sizing the slices.
36
+ percentages
37
+ Whether each slice shows its share, such as ``42.5%``, ``Percentages.SHOWN`` by default.
38
+ colors
39
+ One color per slice, the colors of the default cycle when omitted. The chart keeps its own list.
40
+
41
+ Raises
42
+ ------
43
+ InvalidTypeError
44
+ When a setting is not of the type its annotation names.
45
+ InvalidColumnNameError
46
+ When ``labels`` or ``values`` is an empty text.
47
+ EmptyListError
48
+ When ``colors`` is an empty list.
49
+
50
+ Examples
51
+ --------
52
+ >>> import numdaplot as ndp
53
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Pau"])
54
+ >>> sales = ndp.Array.from_list([120.0, 80.0, 45.0])
55
+ >>> shares = ndp.Table.from_arrays({"city": cities, "sales": sales})
56
+ >>> chart = ndp.PieChart(labels="city", values="sales")
57
+ >>> plot = ndp.Plot.pie(shares, chart)
58
+ >>> plot.show()
59
+ """
60
+
61
+ labels: str
62
+ values: str
63
+ percentages: Percentages = Percentages.SHOWN
64
+ colors: Sequence[Color | CustomColor] | None = None
65
+
66
+ def __post_init__(self) -> None:
67
+ """
68
+ Check the colors and replace them with a copy that only the chart holds.
69
+
70
+ .. versionadded:: 0.1.0
71
+
72
+ Raises
73
+ ------
74
+ InvalidTypeError
75
+ When a setting is not of the type its annotation names.
76
+ InvalidColumnNameError
77
+ When ``labels`` or ``values`` is an empty text.
78
+ EmptyListError
79
+ When ``colors`` is an empty list.
80
+ """
81
+ require_field_types(self)
82
+
83
+ require_column_name(self.labels)
84
+ require_column_name(self.values)
85
+
86
+ colors_copy = copy_colors(self.colors)
87
+ object.__setattr__(self, "colors", colors_copy)
@@ -0,0 +1,159 @@
1
+ """
2
+ Chart drawing each row as a point.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ import math
8
+ from dataclasses import dataclass
9
+
10
+ from numdaplot.errors.conflicting_settings_error import ConflictingSettingsError
11
+ from numdaplot.errors.invalid_opacity_error import InvalidOpacityError
12
+ from numdaplot.errors.invalid_point_size_error import InvalidPointSizeError
13
+ from numdaplot.errors.refused_setting_error import RefusedSettingError
14
+ from numdaplot.plots.charts.chart import Chart
15
+ from numdaplot.plots.charts.color_scale import ColorScale
16
+ from numdaplot.plots.charts.marker_shape import MarkerShape
17
+ from numdaplot.plots.style.color import Color
18
+ from numdaplot.plots.style.custom_color import CustomColor
19
+ from numdaplot.settings.field_types import require_field_types
20
+ from numdaplot.tables.columns.column_names import require_optional_column_name
21
+
22
+ CHART_NAME = "ScatterChart"
23
+ COLOR_SETTING = "color"
24
+ COLOR_BY_SETTING = "color_by"
25
+ NO_MARKER_NAME = "MarkerShape.NONE"
26
+ POINT_SIZE_SETTING = "point_size"
27
+ SIZE_BY_SETTING = "size_by"
28
+ SCALE_WITHOUT_COLOR_BY = "scale without color_by"
29
+
30
+
31
+ @dataclass(frozen=True)
32
+ class ScatterChart(Chart):
33
+ """
34
+ Chart drawing each row as a point, used by ``Plot.scatter``.
35
+
36
+ A row with a missing value in one of the columns used is not drawn. In a dense cloud, a low ``opacity`` shows where
37
+ the points gather, and a small ``point_size`` separates them. The last group drawn stays on top of the others.
38
+
39
+ .. versionadded:: 0.1.0
40
+
41
+ Parameters
42
+ ----------
43
+ x
44
+ For a Table, the column of the horizontal positions: numbers, dates, datetimes, times of day, texts or
45
+ booleans, the row numbers when omitted. An Array takes none, its rows being numbered. Times of day are placed
46
+ on an axis of one day labeled ``HH:MM``.
47
+ y
48
+ For a Table, the column of the vertical positions, holding numbers or times of day, the latter on an axis
49
+ labeled ``HH:MM``. A Table needs it. An Array takes none: when omitted, each of its columns is a series of
50
+ points.
51
+ color
52
+ The color of every point, the first color of the default cycle when omitted. With an Array of
53
+ several columns, the series take the colors of the default cycle and ``color`` is refused.
54
+ color_by
55
+ For a Table, the column coloring each point: numbers give a color scale shown next to the axes, texts, booleans
56
+ and times of day give one color per value, named in the legend, times being written ``HH:MM``. Every point
57
+ takes the same color when omitted.
58
+ size_by
59
+ For a Table, the column of numbers sizing each point, from the smallest to the largest value. Every point has
60
+ the same size when omitted.
61
+ marker
62
+ The shape of the points, ``MarkerShape.CIRCLE`` by default.
63
+ opacity
64
+ How opaque the points are, above 0 and up to 1, ``1.0`` by default. The legend and the color scale stay opaque.
65
+ point_size
66
+ The diameter of every point, in typographic points, 6 when omitted.
67
+ scale
68
+ The colors of a ``color_by`` column of numbers, ``ColorScale.VIRIDIS`` when omitted. It needs such a column.
69
+ ``BLUES``, ``REDS``, ``GREENS`` and ``GRAYS`` skip their lightest colors, so that every point stays visible.
70
+ ``RED_BLUE`` keeps white for 0, so the points close to 0 stay pale.
71
+
72
+ Raises
73
+ ------
74
+ InvalidTypeError
75
+ When a setting is not of the type its annotation names.
76
+ InvalidColumnNameError
77
+ When ``x``, ``y``, ``color_by`` or ``size_by`` is an empty text.
78
+ ConflictingSettingsError
79
+ When ``color`` and ``color_by`` are both given, or ``point_size`` and ``size_by``.
80
+ RefusedSettingError
81
+ When ``marker`` is ``MarkerShape.NONE``, which would draw nothing, or ``scale`` is given without ``color_by``.
82
+ InvalidOpacityError
83
+ When ``opacity`` is 0 or lower, greater than 1, or not a number.
84
+ InvalidPointSizeError
85
+ When ``point_size`` is 0 or lower, infinite, or not a number.
86
+
87
+ Examples
88
+ --------
89
+ >>> import numdaplot as ndp
90
+ >>> surfaces = ndp.Array.from_list([30.0, 45.0, 60.0, 80.0, 52.0])
91
+ >>> prices = ndp.Array.from_list([150.0, 210.0, 260.0, 330.0, 190.0])
92
+ >>> cities = ndp.Array.from_list(["Paris", "Paris", "Lyon", "Lyon", "Pau"])
93
+ >>> flats = ndp.Table.from_arrays({"surface": surfaces, "price": prices, "city": cities})
94
+ >>> chart = ndp.ScatterChart(x="surface", y="price", color_by="city", size_by="surface")
95
+ >>> plot = ndp.Plot.scatter(flats, chart)
96
+ >>> plot.show()
97
+ """
98
+
99
+ x: str | None = None
100
+ y: str | None = None
101
+ color: Color | CustomColor | None = None
102
+ color_by: str | None = None
103
+ size_by: str | None = None
104
+ marker: MarkerShape = MarkerShape.CIRCLE
105
+ opacity: float = 1.0
106
+ point_size: float | None = None
107
+ scale: ColorScale | None = None
108
+
109
+ def __post_init__(self) -> None:
110
+ """
111
+ Check that the color and the size settings exclude each other, and that the points can be drawn.
112
+
113
+ .. versionadded:: 0.1.0
114
+
115
+ Raises
116
+ ------
117
+ InvalidTypeError
118
+ When a setting is not of the type its annotation names.
119
+ InvalidColumnNameError
120
+ When ``x``, ``y``, ``color_by`` or ``size_by`` is an empty text.
121
+ ConflictingSettingsError
122
+ When ``color`` and ``color_by`` are both given, or ``point_size`` and ``size_by``.
123
+ RefusedSettingError
124
+ When ``marker`` is ``MarkerShape.NONE``, or ``scale`` is given without ``color_by``.
125
+ InvalidOpacityError
126
+ When ``opacity`` is 0 or lower, greater than 1, or not a number.
127
+ InvalidPointSizeError
128
+ When ``point_size`` is 0 or lower, infinite, or not a number.
129
+ """
130
+ require_field_types(self)
131
+
132
+ require_optional_column_name(self.x)
133
+ require_optional_column_name(self.y)
134
+ require_optional_column_name(self.color_by)
135
+ require_optional_column_name(self.size_by)
136
+
137
+ has_both_colors = self.color is not None and self.color_by is not None
138
+ if has_both_colors:
139
+ raise ConflictingSettingsError(COLOR_SETTING, COLOR_BY_SETTING)
140
+
141
+ if self.marker == MarkerShape.NONE:
142
+ raise RefusedSettingError(NO_MARKER_NAME, CHART_NAME)
143
+
144
+ has_scale_alone = self.scale is not None and self.color_by is None
145
+ if has_scale_alone:
146
+ raise RefusedSettingError(SCALE_WITHOUT_COLOR_BY, CHART_NAME)
147
+
148
+ has_both_sizes = self.point_size is not None and self.size_by is not None
149
+ if has_both_sizes:
150
+ raise ConflictingSettingsError(POINT_SIZE_SETTING, SIZE_BY_SETTING)
151
+
152
+ is_drawable_opacity = 0 < self.opacity <= 1
153
+ if not is_drawable_opacity:
154
+ raise InvalidOpacityError(self.opacity)
155
+
156
+ if self.point_size is not None:
157
+ is_drawable_size = 0 < self.point_size < math.inf
158
+ if not is_drawable_size:
159
+ raise InvalidPointSizeError(self.point_size)
@@ -0,0 +1,66 @@
1
+ """
2
+ Vertical axis a chart added to a Plot is measured on.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class ValueAxis(Enum):
11
+ """
12
+ Vertical axis a chart added to a Plot with ``add_line``, ``add_bar`` or ``add_scatter`` is measured on.
13
+
14
+ A chart on the right axis gets its own scale, so values of different sizes, such as a number of sales and
15
+ a price, can share a Plot.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Examples
20
+ --------
21
+ >>> import numdaplot as ndp
22
+ >>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
23
+ >>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
24
+ >>> prices = ndp.Array.from_list([12.5, 11.0, 14.0, 10.5])
25
+ >>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "price": prices})
26
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
27
+ >>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]), style)
28
+ >>> line = ndp.LineChart(x="month", y=["price"], marker=ndp.MarkerShape.CIRCLE)
29
+ >>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.RIGHT)
30
+ >>> both.show()
31
+ """
32
+
33
+ LEFT = auto()
34
+ """
35
+ The axis on the left, shared with the first chart of the Plot. Default value.
36
+
37
+ Examples
38
+ --------
39
+ >>> import numdaplot as ndp
40
+ >>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
41
+ >>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
42
+ >>> targets = ndp.Array.from_list([130.0, 130.0, 140.0, 140.0])
43
+ >>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "target": targets})
44
+ >>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]))
45
+ >>> line = ndp.LineChart(x="month", y=["target"], line=ndp.LineType.DASHED)
46
+ >>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.LEFT)
47
+ >>> both.show()
48
+ """
49
+
50
+ RIGHT = auto()
51
+ """
52
+ A second axis on the right, with its own scale and label.
53
+
54
+ Examples
55
+ --------
56
+ >>> import numdaplot as ndp
57
+ >>> months = ndp.Array.from_list(["Jan", "Feb", "Mar", "Apr"])
58
+ >>> sales = ndp.Array.from_list([120.0, 150.0, 90.0, 170.0])
59
+ >>> prices = ndp.Array.from_list([12.5, 11.0, 14.0, 10.5])
60
+ >>> shop = ndp.Table.from_arrays({"month": months, "sales": sales, "price": prices})
61
+ >>> style = ndp.PlotStyle(y_label="Sales", right_label="Price (euros)", legend=ndp.LegendPosition.UPPER_LEFT)
62
+ >>> plot = ndp.Plot.bar(shop, ndp.BarChart(x="month", y=["sales"]), style)
63
+ >>> line = ndp.LineChart(x="month", y=["price"], marker=ndp.MarkerShape.CIRCLE)
64
+ >>> both = plot.add_line(shop, line, axis=ndp.ValueAxis.RIGHT)
65
+ >>> both.show()
66
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Values a Plot reads from a Table or an Array before drawing them.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,128 @@
1
+ """
2
+ Values a chart draws from the columns of an Array.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from typing import Any
8
+
9
+ import numpy
10
+ from numpy.typing import NDArray
11
+
12
+ from numdaplot.arrays.array import Array
13
+ from numdaplot.arrays.array_data import read_stored_values
14
+ from numdaplot.arrays.operations.type_requirements import require_family
15
+ from numdaplot.data_types.numpy_mapping import from_numpy_dtype
16
+ from numdaplot.data_types.type import Type
17
+ from numdaplot.data_types.value_family import ValueFamily, find_family
18
+ from numdaplot.errors.dimension_error import DimensionError
19
+ from numdaplot.plots.data.chart_values import ChartValues, Positions, Series
20
+ from numdaplot.plots.data.column_reading import count_hours, find_value_families
21
+ from numdaplot.plots.data.position_kind import PositionKind
22
+
23
+ ONE_DIMENSION = 1
24
+ TWO_DIMENSIONS = 2
25
+ FLOAT_DTYPE = numpy.dtype(numpy.float64)
26
+ VALUE_LABEL = "Value"
27
+
28
+
29
+ def read_array_values(array: Array, chart_name: str) -> ChartValues:
30
+ """
31
+ Return the positions and the series a chart draws from an Array of numbers or times of day.
32
+
33
+ Only a chart measuring times of day accepts them. Each column is a series named after its number, and each row
34
+ is placed at its number.
35
+ A one-dimensional Array is a single column.
36
+
37
+ .. versionadded:: 0.1.0
38
+
39
+ Parameters
40
+ ----------
41
+ array
42
+ An Array of numbers or times of day, of one or two dimensions.
43
+ chart_name
44
+ Name of the chart class, shown in error messages.
45
+
46
+ Returns
47
+ -------
48
+ ChartValues
49
+ The row numbers as positions, and one series per column.
50
+
51
+ Raises
52
+ ------
53
+ IncompatibleTypesError
54
+ When the Array holds neither numbers nor times of day for a chart measuring them.
55
+ DimensionError
56
+ When the Array has more than two dimensions.
57
+
58
+ Examples
59
+ --------
60
+ >>> import numdaplot as ndp
61
+ >>> from numdaplot.plots.data.array_values import read_array_values
62
+ >>> grid = ndp.Array.from_list([[1, 2], [3, 4]])
63
+ >>> read_array_values(grid, "LineChart").series[1].values
64
+ array([2., 4.])
65
+ """
66
+ values = read_stored_values(array)
67
+ value_families = find_value_families(chart_name)
68
+ require_family(values, value_families, chart_name)
69
+ dimension_count = values.ndim
70
+ if dimension_count > TWO_DIMENSIONS:
71
+ raise DimensionError(chart_name, dimension_count)
72
+
73
+ if dimension_count == ONE_DIMENSION:
74
+ values = values.reshape(-1, 1)
75
+
76
+ value_type = from_numpy_dtype(values.dtype)
77
+ numbers = read_array_numbers(values, value_type)
78
+ row_count, column_count = values.shape
79
+ rows = numpy.arange(row_count)
80
+ row_numbers = rows.astype(FLOAT_DTYPE)
81
+ positions = Positions(PositionKind.NUMBERS, row_numbers, None)
82
+ series = list[Series]()
83
+
84
+ for i in range(column_count):
85
+ column_name = str(i)
86
+ column_numbers = numbers[:, i]
87
+ column_series = Series(column_name, column_numbers)
88
+ series.append(column_series)
89
+
90
+ chart_values = ChartValues(positions, series, rows, VALUE_LABEL, value_type)
91
+
92
+ return chart_values
93
+
94
+
95
+ def read_array_numbers(values: NDArray[Any], value_type: Type) -> NDArray[numpy.float64]:
96
+ """
97
+ Return the values of an Array as float64 numbers, a time of day being its hours since midnight.
98
+
99
+ .. versionadded:: 0.1.0
100
+
101
+ Parameters
102
+ ----------
103
+ values
104
+ The stored values of an Array of numbers or times of day.
105
+ value_type
106
+ The type of the values.
107
+
108
+ Returns
109
+ -------
110
+ NDArray[numpy.float64]
111
+ The numbers, of the same shape, NaN where a time of day is missing.
112
+
113
+ Examples
114
+ --------
115
+ >>> import numpy
116
+ >>> import numdaplot as ndp
117
+ >>> from numdaplot.plots.data.array_values import read_array_numbers
118
+ >>> read_array_numbers(numpy.array([5400000000], dtype="timedelta64[us]"), ndp.Type.TIME)
119
+ array([1.5])
120
+ """
121
+ value_family = find_family(value_type)
122
+ if value_family == ValueFamily.TIME:
123
+ hours = count_hours(values)
124
+ return hours
125
+
126
+ numbers = values.astype(FLOAT_DTYPE)
127
+
128
+ return numbers