Skip to content

Commit

Permalink
Improve pymadng to work with pandas 2.2.0
Browse files Browse the repository at this point in the history
- Change how tables are sent to prevent infinite loops
- Add a deepcopy method to references for pandas compatibility
  • Loading branch information
jgray-19 committed Jan 24, 2024
1 parent 3cdd399 commit 1430e97
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 17 deletions.
19 changes: 10 additions & 9 deletions src/pymadng/madp_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,9 +149,9 @@ def to_df(self, columns: list = None):
try:
import tfs

DataFrame, header = tfs.TfsDataFrame, "headers"
DataFrame, hattr = tfs.TfsDataFrame, "headers"
except ImportError:
DataFrame, header = pd.DataFrame, "attrs"
DataFrame, hattr = pd.DataFrame, "attrs"

py_name, obj_name = self._mad.py_name, self._name
self._mad.psend( # Sending every value individually is slow (sending vectors is fast)
Expand All @@ -177,7 +177,7 @@ def to_df(self, columns: list = None):
{py_name}:send(col) -- Send the column data
end
local header = {obj_name}.header -- Get the header names
local header = {obj_name}.header -- Get the header names
{py_name}:send(header) -- Send the header names
for i, attr in ipairs(header) do
Expand All @@ -191,20 +191,21 @@ def to_df(self, columns: list = None):
col: self._mad.recv(f"{obj_name}:getcol('{col}')") for col in colnames
}

# Get the header names and data
hnams = self._mad.recv()
header = {hnam: self._mad.recv(f"{obj_name}['{hnam}']") for hnam in hnams}

# Not keen on the .squeeze() but it works (ng always sends 2D arrays, but I need the columns in 1D)
for key, val in full_tbl.items():
if isinstance(val, np.ndarray):
full_tbl[key] = val.squeeze()

# Now create the dataframe
df = DataFrame(full_tbl)

if columns:
df = df[columns] # Only keep the columns specified
setattr(df, hattr, header)

# Get the header and add it to the dataframe
hnams = self._mad.recv()
setattr(df, header,
{hnam: self._mad.recv(f"{obj_name}['{hnam}']") for hnam in hnams}
)
return df


Expand Down
18 changes: 13 additions & 5 deletions src/pymadng/madp_pymad.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import struct, os, subprocess, sys, select
import struct, os, subprocess, sys, select, warnings, io
from typing import Union, Callable, Any
import numpy as np

Expand Down Expand Up @@ -177,7 +177,17 @@ def __getitem__(self, item: Union[str, int]):

def eval(self):
return self._mad.recv_vars(self._name)


def __deepcopy__(self, memo):

val = self.eval()
if isinstance(val, list):
for i, v in enumerate(val):
if isinstance(v, mad_ref):
val[i] = v.__deepcopy__(memo)
elif isinstance(val, type(self)) and val._name == self._name:
warnings.warn("An attempt to deepcopy a mad_ref has been made, this is not supported and will result in a copy of the reference.")
return val

# data transfer -------------------------------------------------------------- #

Expand Down Expand Up @@ -327,10 +337,8 @@ def recv_list(self: mad_process) -> list:
lstLen = recv_int(self)
vals = [self.recv(varname and varname + f"[{i+1}]") for i in range(lstLen)]
self.varname = varname # reset
if haskeys and lstLen == 0:
if haskeys:
return type_fun["ref_"]["recv"](self)
elif haskeys:
return vals, type_fun["ref_"]["recv"](self)
else:
return vals

Expand Down
6 changes: 3 additions & 3 deletions tests/obj_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,15 +363,15 @@ def generalDataFrame(self, headers, DataFrame):
[range(1, 12), range(2, 13), range(3, 14), range(4, 15), range(5, 16)]
)

def testTfsDataFrame(self):
def test_tfsDataFrame(self):
self.generalDataFrame("headers", tfs.TfsDataFrame)

def testPandasDataFrame(self):
def test_pandasDataFrame(self):
sys.modules["tfs"] = None #Remove tfs-pandas
self.generalDataFrame("attrs", pandas.DataFrame)
del sys.modules["tfs"]

def testFailure(self):
def test_failure(self):
with MAD() as mad:
mad.send("""
test = mtable{"string", "number"} + {"a", 1.1} + {"b", 2.2}
Expand Down

0 comments on commit 1430e97

Please sign in to comment.