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,149 @@
1
+ """
2
+ Where the legend of a Plot is placed.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class LegendPosition(Enum):
11
+ """
12
+ Where the legend of a Plot is placed, used by ``PlotStyle``.
13
+
14
+ The legend names the series, and is only drawn when a chart has several of them.
15
+
16
+ .. versionadded:: 0.1.0
17
+
18
+ Examples
19
+ --------
20
+ >>> import numdaplot as ndp
21
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
22
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
23
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
24
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
25
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
26
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
27
+ >>> plot = ndp.Plot.line(sales, chart, style)
28
+ >>> plot.show()
29
+ """
30
+
31
+ BEST = auto()
32
+ """
33
+ Inside the axes, where it hides the fewest values. With an axis on the right, the values of both axes leave little
34
+ room inside: the legend is placed as with ``OUTSIDE_RIGHT``. Default value.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
40
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
41
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
42
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
43
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
44
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.BEST)
45
+ >>> plot = ndp.Plot.line(sales, chart, style)
46
+ >>> plot.show()
47
+ """
48
+
49
+ UPPER_LEFT = auto()
50
+ """
51
+ Inside the axes, in the upper left corner.
52
+
53
+ Examples
54
+ --------
55
+ >>> import numdaplot as ndp
56
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
57
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
58
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
59
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
60
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
61
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_LEFT)
62
+ >>> plot = ndp.Plot.line(sales, chart, style)
63
+ >>> plot.show()
64
+ """
65
+
66
+ UPPER_RIGHT = auto()
67
+ """
68
+ Inside the axes, in the upper right corner.
69
+
70
+ Examples
71
+ --------
72
+ >>> import numdaplot as ndp
73
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
74
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
75
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
76
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
77
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
78
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.UPPER_RIGHT)
79
+ >>> plot = ndp.Plot.line(sales, chart, style)
80
+ >>> plot.show()
81
+ """
82
+
83
+ LOWER_LEFT = auto()
84
+ """
85
+ Inside the axes, in the lower left corner.
86
+
87
+ Examples
88
+ --------
89
+ >>> import numdaplot as ndp
90
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
91
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
92
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
93
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
94
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
95
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.LOWER_LEFT)
96
+ >>> plot = ndp.Plot.line(sales, chart, style)
97
+ >>> plot.show()
98
+ """
99
+
100
+ LOWER_RIGHT = auto()
101
+ """
102
+ Inside the axes, in the lower right corner.
103
+
104
+ Examples
105
+ --------
106
+ >>> import numdaplot as ndp
107
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
108
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
109
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
110
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
111
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
112
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.LOWER_RIGHT)
113
+ >>> plot = ndp.Plot.line(sales, chart, style)
114
+ >>> plot.show()
115
+ """
116
+
117
+ OUTSIDE_RIGHT = auto()
118
+ """
119
+ Outside the axes, on their right and past an axis on the right if any, so it never hides a value.
120
+
121
+ Examples
122
+ --------
123
+ >>> import numdaplot as ndp
124
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
125
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
126
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
127
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
128
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
129
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.OUTSIDE_RIGHT)
130
+ >>> plot = ndp.Plot.line(sales, chart, style)
131
+ >>> plot.show()
132
+ """
133
+
134
+ HIDDEN = auto()
135
+ """
136
+ No legend.
137
+
138
+ Examples
139
+ --------
140
+ >>> import numdaplot as ndp
141
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
142
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
143
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
144
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
145
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
146
+ >>> style = ndp.PlotStyle(legend=ndp.LegendPosition.HIDDEN)
147
+ >>> plot = ndp.Plot.line(sales, chart, style)
148
+ >>> plot.show()
149
+ """
@@ -0,0 +1,136 @@
1
+ """
2
+ Look of a whole Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_rotation_error import InvalidRotationError
10
+ from numdaplot.plots.style.grid_lines import GridLines
11
+ from numdaplot.plots.style.legend_position import LegendPosition
12
+ from numdaplot.plots.style.size import Size
13
+ from numdaplot.settings.field_types import require_field_types
14
+ from numdaplot.tables.columns.renaming import Renaming
15
+
16
+ MINIMUM_ROTATION = -90
17
+ MAXIMUM_ROTATION = 90
18
+
19
+
20
+ @dataclass(frozen=True)
21
+ class PlotStyle:
22
+ """
23
+ Look of a whole Plot: title, axis labels, rotation of the values, legend, grid lines and size.
24
+
25
+ The look of the series, such as their colors, belongs to the chart drawing them.
26
+
27
+ .. versionadded:: 0.1.0
28
+
29
+ Parameters
30
+ ----------
31
+ title
32
+ The title above the axes: when omitted, the ``y`` label by the ``x`` label such as ``sales by month``, and for a
33
+ map of missing values ``Map of missing values``. An empty text draws no title.
34
+ x_label
35
+ The label of the axis of the ``x`` values: when omitted, the name of the ``x`` column, else ``Row``, or
36
+ ``Column`` for a box or a heatmap without group. An empty text draws no label.
37
+ y_label
38
+ The label of the axis of the ``y`` values: when omitted, the names of the ``y`` columns one after the other, the
39
+ first 3 and the number of the others beyond 3, or ``Value`` for an Array. An empty text draws no label.
40
+ right_label
41
+ The label of the axis on the right, drawn when a chart is added with ``ValueAxis.RIGHT``: when omitted, written
42
+ as ``y_label`` for the first chart on the right. An empty text draws no label. It has no effect while no chart
43
+ is on the right.
44
+ x_tick_rotation
45
+ The angle of the labels of the ``x`` values, in degrees from -90 to 90. When omitted, 45 degrees for texts,
46
+ dates, datetimes and numbers without enough room, and no rotation for other numbers and for the texts on the
47
+ left of horizontal bars. Labels without enough room at this angle are left out, one out of as many as needed
48
+ from the first one, with a ``ReadabilityWarning`` when they may be texts.
49
+ y_tick_rotation
50
+ The angle of the labels of the ``y`` values, in degrees from -90 to 90, no rotation when omitted. The values of
51
+ the axis on the right keep no rotation. Labels without enough room are left out as for ``x_tick_rotation``.
52
+ legend
53
+ Where the legend is placed, ``LegendPosition.BEST`` by default, past the axes for a map of missing values. It is
54
+ only drawn for several series, so never on a pie or a heatmap. It names each series after its column, or after
55
+ the name ``renaming`` gives it.
56
+ grid_lines
57
+ Whether light grid lines are drawn behind the values, ``GridLines.SHOWN`` by default. A pie and a heatmap have
58
+ none.
59
+ size
60
+ The width and the height, 6.4 by 4.8 inches by default. A Plot placed in a ``Figure`` takes the size of
61
+ its cells instead.
62
+ renaming
63
+ The names under which some columns are shown, every column under its own name when omitted. Each
64
+ ``NameChange`` applies to the legend, the labels of boxes, heatmaps and missing value charts, the legends of
65
+ ``color_by`` and ``size_by``, and the default title and axis labels, on every chart of the Plot. The columns
66
+ of an Array are named ``"0"``, ``"1"``... The values themselves, such as the parts of a pie, are never
67
+ renamed. A title or a label given here keeps its text.
68
+
69
+ Raises
70
+ ------
71
+ InvalidTypeError
72
+ When a setting is not of the type its annotation names.
73
+ InvalidRotationError
74
+ When ``x_tick_rotation`` or ``y_tick_rotation`` is outside -90 to 90 degrees.
75
+
76
+ Examples
77
+ --------
78
+ >>> import numdaplot as ndp
79
+ >>> days = ndp.Array.from_list([1, 2, 3, 4])
80
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
81
+ >>> costs = ndp.Array.from_list([8.0, 9.5, 9.0, 10.0])
82
+ >>> sales = ndp.Table.from_arrays({"day": days, "price": prices, "cost": costs})
83
+ >>> chart = ndp.LineChart(x="day", y=["price", "cost"])
84
+ >>> style = ndp.PlotStyle(title="Sales", x_label="Day", y_label="Euros", legend=ndp.LegendPosition.OUTSIDE_RIGHT)
85
+ >>> plot = ndp.Plot.line(sales, chart, style)
86
+ >>> plot.show()
87
+
88
+ The labels of the ``x`` values can take another angle.
89
+
90
+ >>> cities = ndp.Array.from_list(["Paris", "Lyon", "Marseille"])
91
+ >>> totals = ndp.Array.from_list([120.0, 80.0, 95.0])
92
+ >>> city_sales = ndp.Table.from_arrays({"city": cities, "total": totals})
93
+ >>> city_chart = ndp.BarChart(x="city", y=["total"])
94
+ >>> city_plot = ndp.Plot.bar(city_sales, city_chart, ndp.PlotStyle(x_tick_rotation=90))
95
+ >>> city_plot.show()
96
+
97
+ The columns can be shown under other names, without renaming them in the Table.
98
+
99
+ >>> shown_names = ndp.Renaming(changes=[ndp.NameChange(old_name="total", new_name="Total sales")])
100
+ >>> named_plot = ndp.Plot.bar(city_sales, city_chart, ndp.PlotStyle(renaming=shown_names))
101
+ >>> named_plot.show()
102
+ """
103
+
104
+ title: str | None = None
105
+ x_label: str | None = None
106
+ y_label: str | None = None
107
+ right_label: str | None = None
108
+ x_tick_rotation: float | None = None
109
+ y_tick_rotation: float | None = None
110
+ legend: LegendPosition = LegendPosition.BEST
111
+ grid_lines: GridLines = GridLines.SHOWN
112
+ size: Size = Size()
113
+ renaming: Renaming | None = None
114
+
115
+ def __post_init__(self) -> None:
116
+ """
117
+ Check the rotations of the labels of the values.
118
+
119
+ .. versionadded:: 0.1.0
120
+
121
+ Raises
122
+ ------
123
+ InvalidTypeError
124
+ When a setting is not of the type its annotation names.
125
+ InvalidRotationError
126
+ When ``x_tick_rotation`` or ``y_tick_rotation`` is outside -90 to 90 degrees.
127
+ """
128
+ require_field_types(self)
129
+
130
+ for rotation in (self.x_tick_rotation, self.y_tick_rotation):
131
+ if rotation is None:
132
+ continue
133
+
134
+ is_accepted = MINIMUM_ROTATION <= rotation <= MAXIMUM_ROTATION
135
+ if not is_accepted:
136
+ raise InvalidRotationError(rotation)
@@ -0,0 +1,70 @@
1
+ """
2
+ Width and height of a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_size_error import InvalidSizeError
10
+ from numdaplot.plots.style.size_unit import SizeUnit
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ DEFAULT_WIDTH = 6.4
14
+ DEFAULT_HEIGHT = 4.8
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Size:
19
+ """
20
+ Width and height of a Plot, used by ``PlotStyle``.
21
+
22
+ .. versionadded:: 0.1.0
23
+
24
+ Parameters
25
+ ----------
26
+ width
27
+ The width, 6.4 inches by default.
28
+ height
29
+ The height, 4.8 inches by default.
30
+ unit
31
+ The unit of the width and the height, ``SizeUnit.INCH`` by default.
32
+
33
+ Raises
34
+ ------
35
+ InvalidTypeError
36
+ When a setting is not of the type its annotation names.
37
+ InvalidSizeError
38
+ When the width or the height is zero or negative.
39
+
40
+ Examples
41
+ --------
42
+ >>> import numdaplot as ndp
43
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
44
+ >>> style = ndp.PlotStyle(size=ndp.Size(width=6, height=2.5))
45
+ >>> plot = ndp.Plot.line(prices, style=style)
46
+ >>> plot.show()
47
+ """
48
+
49
+ width: float = DEFAULT_WIDTH
50
+ height: float = DEFAULT_HEIGHT
51
+ unit: SizeUnit = SizeUnit.INCH
52
+
53
+ def __post_init__(self) -> None:
54
+ """
55
+ Check that the width and the height are positive.
56
+
57
+ .. versionadded:: 0.1.0
58
+
59
+ Raises
60
+ ------
61
+ InvalidTypeError
62
+ When a setting is not of the type its annotation names.
63
+ InvalidSizeError
64
+ When the width or the height is zero or negative.
65
+ """
66
+ require_field_types(self)
67
+
68
+ is_positive = self.width > 0 and self.height > 0
69
+ if not is_positive:
70
+ raise InvalidSizeError(self.width, self.height)
@@ -0,0 +1,62 @@
1
+ """
2
+ Units of the width and the height of a Plot.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class SizeUnit(Enum):
11
+ """
12
+ Units of the width and the height of a Plot, used by ``Size``.
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])
20
+ >>> style = ndp.PlotStyle(size=ndp.Size(width=16, height=8, unit=ndp.SizeUnit.CENTIMETER))
21
+ >>> plot = ndp.Plot.line(prices, style=style)
22
+ >>> plot.show()
23
+ """
24
+
25
+ INCH = auto()
26
+ """
27
+ Inches, as matplotlib counts sizes. 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])
33
+ >>> style = ndp.PlotStyle(size=ndp.Size(width=6, height=3, unit=ndp.SizeUnit.INCH))
34
+ >>> plot = ndp.Plot.line(prices, style=style)
35
+ >>> plot.show()
36
+ """
37
+
38
+ CENTIMETER = auto()
39
+ """
40
+ Centimeters, 2.54 per inch.
41
+
42
+ Examples
43
+ --------
44
+ >>> import numdaplot as ndp
45
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
46
+ >>> style = ndp.PlotStyle(size=ndp.Size(width=16, height=8, unit=ndp.SizeUnit.CENTIMETER))
47
+ >>> plot = ndp.Plot.line(prices, style=style)
48
+ >>> plot.show()
49
+ """
50
+
51
+ PIXEL = auto()
52
+ """
53
+ Pixels, 100 per inch, the resolution of a PNG image saved without ``ImageOptions``.
54
+
55
+ Examples
56
+ --------
57
+ >>> import numdaplot as ndp
58
+ >>> prices = ndp.Array.from_list([12.0, 15.5, 14.0, 17.0])
59
+ >>> style = ndp.PlotStyle(size=ndp.Size(width=600, height=300, unit=ndp.SizeUnit.PIXEL))
60
+ >>> plot = ndp.Plot.line(prices, style=style)
61
+ >>> plot.show()
62
+ """
@@ -0,0 +1,5 @@
1
+ """
2
+ Positions and axes: which rows and columns an operation works on.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
@@ -0,0 +1,54 @@
1
+ """
2
+ Direction in which an operation runs on two-dimensional data.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from enum import Enum, auto
8
+
9
+
10
+ class Axis(Enum):
11
+ """
12
+ Direction in which an operation runs on two-dimensional data.
13
+
14
+ Each name describes the result: ``EACH_ROW`` handles every row on its own,
15
+ so a statistic gives one value per row.
16
+
17
+ Every method working along an axis takes it as its own ``axis`` argument, next to its settings:
18
+ ``Array.compute``, ``Array.sort``, ``Table.count_missing`` and ``Table.drop_missing``.
19
+
20
+ .. versionadded:: 0.1.0
21
+
22
+ Examples
23
+ --------
24
+ >>> import numdaplot as ndp
25
+ >>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
26
+ >>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
27
+ Array([3, 7], dtype=INT64)
28
+ >>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_COLUMN)
29
+ Array([4, 6], dtype=INT64)
30
+ """
31
+
32
+ EACH_ROW = auto()
33
+ """
34
+ Every row is handled on its own: one result per row.
35
+
36
+ Examples
37
+ --------
38
+ >>> import numdaplot as ndp
39
+ >>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
40
+ >>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_ROW)
41
+ Array([3, 7], dtype=INT64)
42
+ """
43
+
44
+ EACH_COLUMN = auto()
45
+ """
46
+ Every column is handled on its own: one result per column.
47
+
48
+ Examples
49
+ --------
50
+ >>> import numdaplot as ndp
51
+ >>> sales = ndp.Array.from_list([[1, 2], [3, 4]])
52
+ >>> sales.compute(ndp.Sum(), axis=ndp.Axis.EACH_COLUMN)
53
+ Array([4, 6], dtype=INT64)
54
+ """
@@ -0,0 +1,51 @@
1
+ """
2
+ A single position in one dimension.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.settings.field_types import require_field_types
10
+
11
+
12
+ @dataclass(frozen=True)
13
+ class Index:
14
+ """
15
+ A single position in one dimension, used by ``Region``.
16
+
17
+ .. versionadded:: 0.1.0
18
+
19
+ Parameters
20
+ ----------
21
+ position
22
+ The position, starting at 0. A negative position counts from the end:
23
+ -1 is the last one.
24
+
25
+ Raises
26
+ ------
27
+ InvalidTypeError
28
+ When a setting is not of the type its annotation names.
29
+
30
+ Examples
31
+ --------
32
+ >>> import numdaplot as ndp
33
+ >>> scores = ndp.Array.from_list([10, 20, 30])
34
+ >>> scores.take(ndp.Region(rows=ndp.Index(-1)))
35
+ Array([30], dtype=INT64)
36
+ """
37
+
38
+ position: int
39
+
40
+ def __post_init__(self) -> None:
41
+ """
42
+ Check the type of the position.
43
+
44
+ .. versionadded:: 0.1.0
45
+
46
+ Raises
47
+ ------
48
+ InvalidTypeError
49
+ When a setting is not of the type its annotation names.
50
+ """
51
+ require_field_types(self)
@@ -0,0 +1,90 @@
1
+ """
2
+ A regular sequence of numbers between two bounds.
3
+
4
+ .. versionadded:: 0.1.0
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+
9
+ from numdaplot.errors.invalid_step_error import InvalidStepError
10
+ from numdaplot.rules.bounds import Bounds
11
+ from numdaplot.settings.field_types import require_field_types
12
+
13
+ DEFAULT_STEP = 1
14
+ FORBIDDEN_STEP = 0
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class Range:
19
+ """
20
+ A regular sequence of numbers from ``start`` to ``stop``, every ``step``.
21
+
22
+ It selects positions in ``Region`` and creates values in ``Array.from_range``.
23
+ In a ``Region``, ``start`` and ``step`` must be ``int``, since a position is a whole number.
24
+ Unlike the Python ``range``, the end is included by default, as in ``Between``.
25
+
26
+ .. versionadded:: 0.1.0
27
+
28
+ Parameters
29
+ ----------
30
+ start
31
+ First number of the sequence.
32
+ stop
33
+ Last number of the sequence, reached only when it falls on a step.
34
+ step
35
+ Gap between two numbers, 1 by default. A negative step goes downwards.
36
+ bounds
37
+ Which of ``start`` and ``stop`` are part of the sequence. Both are included by default.
38
+
39
+ Raises
40
+ ------
41
+ InvalidTypeError
42
+ When a setting is not of the type its annotation names.
43
+ InvalidStepError
44
+ When ``step`` is zero, or goes away from ``stop``, such as a step of 1 from 5 to 1.
45
+
46
+ Examples
47
+ --------
48
+ >>> import numdaplot as ndp
49
+ >>> ndp.Array.from_range(ndp.Range(start=0, stop=10, step=2))
50
+ Array([ 0, 2, 4, 6, 8, 10], dtype=INT64)
51
+ >>> scores = ndp.Array.from_list([10, 20, 30, 40])
52
+ >>> scores.take(ndp.Region(rows=ndp.Range(start=1, stop=2)))
53
+ Array([20, 30], dtype=INT64)
54
+
55
+ The first 3 rows, without counting the last position: ``stop`` is left out with ``Bounds.LOW_ONLY``.
56
+
57
+ >>> first_count = 3
58
+ >>> first_rows = ndp.Range(start=0, stop=first_count, bounds=ndp.Bounds.LOW_ONLY)
59
+ >>> scores.take(ndp.Region(rows=first_rows))
60
+ Array([10, 20, 30], dtype=INT64)
61
+ """
62
+
63
+ start: int | float
64
+ stop: int | float
65
+ step: int | float = DEFAULT_STEP
66
+ bounds: Bounds = Bounds.INCLUDED
67
+
68
+ def __post_init__(self) -> None:
69
+ """
70
+ Check that the step is not zero and goes from the start to the stop.
71
+
72
+ .. versionadded:: 0.1.0
73
+
74
+ Raises
75
+ ------
76
+ InvalidTypeError
77
+ When a setting is not of the type its annotation names.
78
+ InvalidStepError
79
+ When ``step`` is zero, or goes away from ``stop``.
80
+ """
81
+ require_field_types(self)
82
+
83
+ if self.step == FORBIDDEN_STEP:
84
+ raise InvalidStepError(self.step)
85
+
86
+ distance = self.stop - self.start
87
+ signed_progress = distance * self.step
88
+ goes_away = signed_progress < 0
89
+ if goes_away:
90
+ raise InvalidStepError(self.step, self.start, self.stop)