rgwfuncs 0.0.55__py3-none-any.whl → 0.0.57__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- rgwfuncs/__init__.py +1 -1
- rgwfuncs/algebra_lib.py +166 -5
- {rgwfuncs-0.0.55.dist-info → rgwfuncs-0.0.57.dist-info}/METADATA +47 -6
- rgwfuncs-0.0.57.dist-info/RECORD +12 -0
- rgwfuncs-0.0.55.dist-info/RECORD +0 -12
- {rgwfuncs-0.0.55.dist-info → rgwfuncs-0.0.57.dist-info}/LICENSE +0 -0
- {rgwfuncs-0.0.55.dist-info → rgwfuncs-0.0.57.dist-info}/WHEEL +0 -0
- {rgwfuncs-0.0.55.dist-info → rgwfuncs-0.0.57.dist-info}/entry_points.txt +0 -0
- {rgwfuncs-0.0.55.dist-info → rgwfuncs-0.0.57.dist-info}/top_level.txt +0 -0
rgwfuncs/__init__.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# This file is automatically generated
|
2
2
|
# Dynamically importing functions from modules
|
3
3
|
|
4
|
-
from .algebra_lib import cancel_polynomial_expression, compute_constant_expression, compute_constant_expression_involving_matrices, compute_constant_expression_involving_ordered_series, compute_prime_factors, expand_polynomial_expression, factor_polynomial_expression, plot_polynomial_functions, python_polynomial_expression_to_latex, simplify_polynomial_expression, solve_homogeneous_polynomial_expression
|
4
|
+
from .algebra_lib import cancel_polynomial_expression, compute_constant_expression, compute_constant_expression_involving_matrices, compute_constant_expression_involving_ordered_series, compute_prime_factors, expand_polynomial_expression, factor_polynomial_expression, plot_polynomial_functions, plot_x_points_of_polynomial_functions, python_polynomial_expression_to_latex, simplify_polynomial_expression, solve_homogeneous_polynomial_expression
|
5
5
|
from .df_lib import append_columns, append_percentile_classification_column, append_ranged_classification_column, append_ranged_date_classification_column, append_rows, append_xgb_labels, append_xgb_logistic_regression_predictions, append_xgb_regression_predictions, bag_union_join, bottom_n_unique_values, cascade_sort, delete_rows, drop_duplicates, drop_duplicates_retain_first, drop_duplicates_retain_last, filter_dataframe, filter_indian_mobiles, first_n_rows, from_raw_data, insert_dataframe_in_sqlite_database, last_n_rows, left_join, limit_dataframe, load_data_from_path, load_data_from_query, load_data_from_sqlite_path, mask_against_dataframe, mask_against_dataframe_converse, numeric_clean, order_columns, print_correlation, print_dataframe, print_memory_usage, print_n_frequency_cascading, print_n_frequency_linear, rename_columns, retain_columns, right_join, send_data_to_email, send_data_to_slack, send_dataframe_via_telegram, sync_dataframe_to_sqlite_database, top_n_unique_values, union_join, update_rows
|
6
6
|
from .docs_lib import docs
|
7
7
|
from .interactive_shell_lib import interactive_shell
|
rgwfuncs/algebra_lib.py
CHANGED
@@ -744,11 +744,11 @@ def plot_polynomial_functions(
|
|
744
744
|
show_legend : bool
|
745
745
|
Whether to add a legend to the plot (defaults to True).
|
746
746
|
open_file : bool
|
747
|
-
If saving to path is not desirable, opens the SVG as a temp file;
|
748
|
-
otherwise opens the file from the actual location using the system's
|
747
|
+
If saving to path is not desirable, opens the SVG as a temp file;
|
748
|
+
otherwise opens the file from the actual location using the system's
|
749
749
|
default viewer (defaults to False).
|
750
750
|
save_path : Optional[str]
|
751
|
-
If specified, saves the output string as a .svg at the indicated path
|
751
|
+
If specified, saves the output string as a .svg at the indicated path
|
752
752
|
(defaults to None).
|
753
753
|
|
754
754
|
Returns
|
@@ -827,8 +827,6 @@ def plot_polynomial_functions(
|
|
827
827
|
x_val = sub_dict["x"]
|
828
828
|
|
829
829
|
# 1) If x == "*", generate from -zoom..+zoom
|
830
|
-
print("830", x_val)
|
831
|
-
print("830", type(x_val))
|
832
830
|
if isinstance(x_val, str) and x_val == "*":
|
833
831
|
x_values = np.linspace(-zoom, zoom, 1201)
|
834
832
|
sub_dict["x"] = x_values # might as well update it in place
|
@@ -901,3 +899,166 @@ def plot_polynomial_functions(
|
|
901
899
|
|
902
900
|
return svg_string
|
903
901
|
|
902
|
+
|
903
|
+
def plot_x_points_of_polynomial_functions(
|
904
|
+
functions: List[Dict[str, Dict[str, Any]]],
|
905
|
+
zoom: float = 10.0,
|
906
|
+
show_legend: bool = True,
|
907
|
+
open_file: bool = False,
|
908
|
+
save_path: Optional[str] = None,
|
909
|
+
) -> str:
|
910
|
+
"""
|
911
|
+
Plots one or more expressions described by a list of dictionaries. For each
|
912
|
+
item in the list, the function evaluates the given Python/NumPy expression
|
913
|
+
at the specified x-values (converted to NumPy arrays if they are Python lists)
|
914
|
+
and plots the resulting points on a single figure.
|
915
|
+
|
916
|
+
Parameters
|
917
|
+
----------
|
918
|
+
functions : List[Dict[str, Dict[str, Any]]] A list of one or more items,
|
919
|
+
each of which has exactly one key-value pair:
|
920
|
+
- Key (`str`): A valid Python/NumPy expression (e.g., `x**2`,
|
921
|
+
`np.sin(x)`, `x - a`).
|
922
|
+
- Value (`Dict[str, Any]`): Must assign `x` a value
|
923
|
+
zoom : float, optional
|
924
|
+
Determines the numeric axis range from -zoom..+zoom in both x and y
|
925
|
+
(default is 10.0).
|
926
|
+
show_legend : bool, optional
|
927
|
+
Whether to include a legend in the plot (default is True).
|
928
|
+
open_file : bool, optional
|
929
|
+
If saving to path is not desirable, opens the SVG as a temp file;
|
930
|
+
otherwise opens the file from the indicated path using the system's
|
931
|
+
default viewer (defaults to False).
|
932
|
+
save_path : Optional[str], optional
|
933
|
+
If specified, saves the output SVG at the given path (defaults to None).
|
934
|
+
|
935
|
+
Returns
|
936
|
+
-------
|
937
|
+
str
|
938
|
+
The raw SVG markup of the resulting scatter plot.
|
939
|
+
|
940
|
+
"""
|
941
|
+
def latexify_expression(expr_str: str) -> str:
|
942
|
+
# Regex to locate np.diff(...) with an optional second argument
|
943
|
+
DIFF_PATTERN = r"np\.diff\s*\(\s*([^,\)]+)(?:,\s*(\d+))?\)"
|
944
|
+
|
945
|
+
def diff_replacer(match: re.Match) -> str:
|
946
|
+
inside = match.group(1).strip()
|
947
|
+
exponent = match.group(2)
|
948
|
+
inside_no_np = inside.replace("np.", "")
|
949
|
+
if exponent:
|
950
|
+
return rf"\Delta^{exponent}\left({inside_no_np}\right)"
|
951
|
+
else:
|
952
|
+
return rf"\Delta\left({inside_no_np}\right)"
|
953
|
+
|
954
|
+
expr_tmp = re.sub(DIFF_PATTERN, diff_replacer, expr_str)
|
955
|
+
expr_tmp = expr_tmp.replace("np.", "")
|
956
|
+
|
957
|
+
# Attempt to convert basic Pythonic polynomial expressions into LaTeX
|
958
|
+
try:
|
959
|
+
from python_latex_helpers import python_polynomial_expression_to_latex
|
960
|
+
latex_expr = python_polynomial_expression_to_latex(expr_tmp)
|
961
|
+
return latex_expr
|
962
|
+
except Exception:
|
963
|
+
# Fallback: naive ** -> ^
|
964
|
+
return expr_tmp.replace("**", "^")
|
965
|
+
|
966
|
+
def handle_open_and_save(svg_string: str, open_it: bool, path: Optional[str]) -> None:
|
967
|
+
# Save the SVG to a file if a path is provided
|
968
|
+
if path:
|
969
|
+
try:
|
970
|
+
with open(path, 'w', encoding='utf-8') as file:
|
971
|
+
file.write(svg_string)
|
972
|
+
print(f"[INFO] SVG saved to: {path}")
|
973
|
+
except IOError as e:
|
974
|
+
print(f"[ERROR] Failed to save SVG to {path}. IOError: {e}")
|
975
|
+
|
976
|
+
# Handle opening the file if requested
|
977
|
+
if open_it and path:
|
978
|
+
result = subprocess.run(["xdg-open", path], stderr=subprocess.DEVNULL)
|
979
|
+
if result.returncode != 0:
|
980
|
+
print("[ERROR] Failed to open the SVG file with the default viewer.")
|
981
|
+
elif open_it:
|
982
|
+
with tempfile.NamedTemporaryFile(delete=False, suffix=".svg") as tmpfile:
|
983
|
+
temp_svg_path = tmpfile.name
|
984
|
+
tmpfile.write(svg_string.encode('utf-8'))
|
985
|
+
result = subprocess.run(["xdg-open", temp_svg_path], stderr=subprocess.DEVNULL)
|
986
|
+
if result.returncode != 0:
|
987
|
+
print("[ERROR] Failed to open the SVG file with the default viewer.")
|
988
|
+
|
989
|
+
# Set up a buffer for the SVG output
|
990
|
+
buffer = BytesIO()
|
991
|
+
fig, ax = plt.subplots()
|
992
|
+
|
993
|
+
# Iterate over each expression-substitution dictionary
|
994
|
+
for item in functions:
|
995
|
+
# Each entry in 'functions' must have exactly one key-value pair
|
996
|
+
if len(item) != 1:
|
997
|
+
print("[WARNING] Skipping invalid item. It must have exactly 1 expression->substitutions pair.")
|
998
|
+
continue
|
999
|
+
|
1000
|
+
expression, sub_dict = next(iter(item.items()))
|
1001
|
+
|
1002
|
+
# Ensure 'x' is present
|
1003
|
+
if "x" not in sub_dict:
|
1004
|
+
print(f"[WARNING] Skipping '{expression}' because there is no 'x' key.")
|
1005
|
+
continue
|
1006
|
+
|
1007
|
+
x_vals = sub_dict["x"]
|
1008
|
+
# Convert to numpy array if needed
|
1009
|
+
if not isinstance(x_vals, np.ndarray):
|
1010
|
+
x_vals = np.array(x_vals)
|
1011
|
+
|
1012
|
+
# Evaluate expression with the given variables
|
1013
|
+
try:
|
1014
|
+
eval_context = {"np": np}
|
1015
|
+
eval_context.update(sub_dict) # put all user-provided variables in the context
|
1016
|
+
y_vals = eval(expression, {"np": np}, eval_context)
|
1017
|
+
except Exception as e:
|
1018
|
+
print(f"[ERROR] Could not evaluate expression '{expression}': {e}")
|
1019
|
+
continue
|
1020
|
+
|
1021
|
+
# Convert y-values to a numpy array if needed
|
1022
|
+
if not isinstance(y_vals, np.ndarray):
|
1023
|
+
y_vals = np.array(y_vals)
|
1024
|
+
|
1025
|
+
# Prepare label (LaTeXified)
|
1026
|
+
label_expr = latexify_expression(expression)
|
1027
|
+
|
1028
|
+
# Scatter plot
|
1029
|
+
ax.scatter(x_vals, y_vals, label=rf"${label_expr}$")
|
1030
|
+
|
1031
|
+
# Configure axes
|
1032
|
+
ax.set_xlim(-zoom, zoom)
|
1033
|
+
ax.set_ylim(-zoom, zoom)
|
1034
|
+
|
1035
|
+
# Place spines at center (optional styling preference)
|
1036
|
+
ax.spines['left'].set_position('zero')
|
1037
|
+
ax.spines['bottom'].set_position('zero')
|
1038
|
+
ax.spines['right'].set_color('none')
|
1039
|
+
ax.spines['top'].set_color('none')
|
1040
|
+
ax.xaxis.set_ticks_position('bottom')
|
1041
|
+
ax.yaxis.set_ticks_position('left')
|
1042
|
+
ax.set_aspect('equal', 'box')
|
1043
|
+
ax.grid(True)
|
1044
|
+
|
1045
|
+
# If requested, show the legend
|
1046
|
+
if show_legend:
|
1047
|
+
leg = ax.legend(
|
1048
|
+
loc='upper center',
|
1049
|
+
bbox_to_anchor=(0.5, -0.03),
|
1050
|
+
fancybox=True,
|
1051
|
+
shadow=True,
|
1052
|
+
ncol=1
|
1053
|
+
)
|
1054
|
+
plt.savefig(buffer, format='svg', bbox_inches='tight', bbox_extra_artists=[leg])
|
1055
|
+
else:
|
1056
|
+
plt.savefig(buffer, format='svg', bbox_inches='tight')
|
1057
|
+
|
1058
|
+
plt.close(fig)
|
1059
|
+
svg_string = buffer.getvalue().decode('utf-8')
|
1060
|
+
|
1061
|
+
# Optionally open/save the file
|
1062
|
+
handle_open_and_save(svg_string, open_file, save_path)
|
1063
|
+
|
1064
|
+
return svg_string
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: rgwfuncs
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.57
|
4
4
|
Summary: A functional programming paradigm for mathematical modelling and data science
|
5
5
|
Home-page: https://github.com/ryangerardwilson/rgwfunc
|
6
6
|
Author: Ryan Gerard Wilson
|
@@ -541,19 +541,60 @@ This function plots polynomial functions described by a list of expressions and
|
|
541
541
|
{"x**2/(2 + a) + a": {"x": np.linspace(-3, 4, 101), "a": 1.23}},
|
542
542
|
{"np.diff(x**3, 2)": {"x": np.linspace(-2, 2, 10)}}
|
543
543
|
],
|
544
|
-
zoom=2
|
544
|
+
zoom=2,
|
545
|
+
open_file=True,
|
546
|
+
save_path="plot_polynomial_functions_example_1.svg"
|
545
547
|
)
|
546
548
|
|
547
|
-
# Write the SVG to an actual file
|
548
|
-
with open("plot.svg", "w", encoding="utf-8") as file:
|
549
|
-
file.write(plot_svg_string)
|
550
|
-
|
551
549
|
• Displaying the SVG:
|
552
550
|
|
553
551
|

|
554
552
|
|
555
553
|
--------------------------------------------------------------------------------
|
556
554
|
|
555
|
+
media/plot_x_points_of_polynomial_functions_example_5.svg
|
556
|
+
|
557
|
+
### 12. `plot_x_points_of_polynomial_functions`
|
558
|
+
|
559
|
+
This function plots one or more expressions described by a list of dictionaries. For each item in the list, the function evaluates the given Python/NumPy expression at the specified x-values (converted to NumPy arrays if they are Python lists) and plots the resulting points on a single figure.
|
560
|
+
|
561
|
+
• Parameters:
|
562
|
+
- `functions` (`List[Dict[str, Dict[str, Any]]]`): A list of one or more items, each of which has exactly one key-value pair:
|
563
|
+
- Key (`str`): A valid Python/NumPy expression (e.g., `x**2`, `np.sin(x)`, `x - a`).
|
564
|
+
- Value (`Dict[str, Any]`): Must assign `x` a value
|
565
|
+
- `zoom` (`float`): Numeric range from -zoom to +zoom on both x and y axes (default 10.0).
|
566
|
+
- `show_legend` (`bool`): If True, includes a legend (default True).
|
567
|
+
- `open_file` (bool):
|
568
|
+
- If True and `save_path` is given, opens that file with the system viewer.
|
569
|
+
- If True and `save_path` is None, writes to a temporary file and opens it (default False).
|
570
|
+
- `save_path` (`Optional[str]`): If specified, writes the resulting SVG to this path (default None).
|
571
|
+
|
572
|
+
• Returns:
|
573
|
+
- `str`: The raw SVG markup of the resulting scatter plot.
|
574
|
+
|
575
|
+
• Example:
|
576
|
+
|
577
|
+
from rgwfuncs import plot_x_points_of_polynomial_functions
|
578
|
+
import numpy as np
|
579
|
+
|
580
|
+
svg_output = plot_x_points_of_polynomial_functions(
|
581
|
+
functions=[
|
582
|
+
{"x**2": {"x": np.array([-2, -1, 0, 1, 2])}},
|
583
|
+
{"np.sin(x)": {"x": np.linspace(0, 2*np.pi, 5)}},
|
584
|
+
{"x - 3": {"x": np.array([-2, 0, 2, 4, 6])}}
|
585
|
+
],
|
586
|
+
zoom=6,
|
587
|
+
show_legend=True,
|
588
|
+
open_file=True,
|
589
|
+
save_path="plot_x_points_of_polynomial_functions_example_5.svg"
|
590
|
+
)
|
591
|
+
|
592
|
+
• Displaying the SVG:
|
593
|
+
|
594
|
+

|
595
|
+
|
596
|
+
--------------------------------------------------------------------------------
|
597
|
+
|
557
598
|
## String Based Functions
|
558
599
|
|
559
600
|
### 1. send_telegram_message
|
@@ -0,0 +1,12 @@
|
|
1
|
+
rgwfuncs/__init__.py,sha256=-rcdj4_9zq82h0Tl00S9GvEqDYh7yhPCNhnhBs3mZCg,1676
|
2
|
+
rgwfuncs/algebra_lib.py,sha256=rKFITfpWfgdBswnbMUuS41XgndEt-jUVz2ObO_ik7eM,42234
|
3
|
+
rgwfuncs/df_lib.py,sha256=qqRQdakheLy8wMZRBfHwKyIp8DmdZIWfAiLKWgq03QU,68977
|
4
|
+
rgwfuncs/docs_lib.py,sha256=y3wSAOPO3qsA4HZ7xAtW8HimM8w-c8hjcEzMRLJ96ao,1960
|
5
|
+
rgwfuncs/interactive_shell_lib.py,sha256=A7EWsYxAfDev_N0-2GjRvAtp0bAwBPHIczXb8Gu9fzI,1107
|
6
|
+
rgwfuncs/str_lib.py,sha256=rtAdRlnSJIu3JhI-tA_A0wCiPK2m-zn5RoGpBxv_g-4,2228
|
7
|
+
rgwfuncs-0.0.57.dist-info/LICENSE,sha256=7EI8xVBu6h_7_JlVw-yPhhOZlpY9hP8wal7kHtqKT_E,1074
|
8
|
+
rgwfuncs-0.0.57.dist-info/METADATA,sha256=DaC1s1J3mT_4GEnxmmCq6CA418CbkuAT0myFCDNpbik,59010
|
9
|
+
rgwfuncs-0.0.57.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
10
|
+
rgwfuncs-0.0.57.dist-info/entry_points.txt,sha256=j-c5IOPIQ0252EaOV6j6STio56sbXl2C4ym_fQ0lXx0,43
|
11
|
+
rgwfuncs-0.0.57.dist-info/top_level.txt,sha256=aGuVIzWsKiV1f2gCb6mynx0zx5ma0B1EwPGFKVEMTi4,9
|
12
|
+
rgwfuncs-0.0.57.dist-info/RECORD,,
|
rgwfuncs-0.0.55.dist-info/RECORD
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
rgwfuncs/__init__.py,sha256=JjkuVeRV_Bkw8vnqSbJsRcYQRm4iCI3futR86cf3tRI,1637
|
2
|
-
rgwfuncs/algebra_lib.py,sha256=YlXv8R-xD4IQoTaatw9AQyAsi5lWh00K1huQ53figC8,36017
|
3
|
-
rgwfuncs/df_lib.py,sha256=qqRQdakheLy8wMZRBfHwKyIp8DmdZIWfAiLKWgq03QU,68977
|
4
|
-
rgwfuncs/docs_lib.py,sha256=y3wSAOPO3qsA4HZ7xAtW8HimM8w-c8hjcEzMRLJ96ao,1960
|
5
|
-
rgwfuncs/interactive_shell_lib.py,sha256=A7EWsYxAfDev_N0-2GjRvAtp0bAwBPHIczXb8Gu9fzI,1107
|
6
|
-
rgwfuncs/str_lib.py,sha256=rtAdRlnSJIu3JhI-tA_A0wCiPK2m-zn5RoGpBxv_g-4,2228
|
7
|
-
rgwfuncs-0.0.55.dist-info/LICENSE,sha256=7EI8xVBu6h_7_JlVw-yPhhOZlpY9hP8wal7kHtqKT_E,1074
|
8
|
-
rgwfuncs-0.0.55.dist-info/METADATA,sha256=2fr5olJy55MoAetAhCcPOsEVa6Ia3CGiDcKBnpiU-0g,57136
|
9
|
-
rgwfuncs-0.0.55.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
10
|
-
rgwfuncs-0.0.55.dist-info/entry_points.txt,sha256=j-c5IOPIQ0252EaOV6j6STio56sbXl2C4ym_fQ0lXx0,43
|
11
|
-
rgwfuncs-0.0.55.dist-info/top_level.txt,sha256=aGuVIzWsKiV1f2gCb6mynx0zx5ma0B1EwPGFKVEMTi4,9
|
12
|
-
rgwfuncs-0.0.55.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|