Skip to content

Commit 73168b1

Browse files
committed
fix #803 :
- included key associated with Axis and Group objects when exporting Session objects to CSV or Excel files - removed useless kwargs['name'] = key in PandasHDFHandler._read_item() fix #804 : wildcard axes are handled correctly when reading/exporting from/to CSV or Excel files
1 parent fffdf87 commit 73168b1

File tree

5 files changed

+45
-36
lines changed

5 files changed

+45
-36
lines changed

doc/source/changes/version_0_32.rst.inc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,5 @@ Miscellaneous improvements
5555
Fixes
5656
^^^^^
5757

58-
* fixed something (closes :issue:`1`).
58+
* fixed reading/exporting sessions containing two or more axes/groups
59+
with the same name (or anonymous) from/to CSV, Excel and HDF files (closes :issue:`803`).

larray/inout/csv.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,15 @@ def list_items(self):
329329
pass
330330
try:
331331
fnames.remove('__axes__')
332-
items = [(name, 'Axis') for name in sorted(self.axes.keys())]
332+
items = [(key, 'Axis') for key in sorted(self.axes.keys())]
333333
except:
334334
pass
335335
try:
336336
fnames.remove('__groups__')
337-
items += [(name, 'Group') for name in sorted(self.groups.keys())]
337+
items += [(key, 'Group') for key in sorted(self.groups.keys())]
338338
except:
339339
pass
340-
items += [(name, 'Array') for name in fnames]
340+
items += [(key, 'Array') for key in fnames]
341341
return items
342342

343343
def _read_item(self, key, type, *args, **kwargs):
@@ -375,10 +375,10 @@ def _dump_metadata(self, metadata):
375375

376376
def save(self):
377377
if len(self.axes) > 0:
378-
df = _axes_to_df(self.axes.values())
378+
df = _axes_to_df(self.axes)
379379
df.to_csv(self._to_filepath('__axes__'), sep=self.sep, index=False)
380380
if len(self.groups) > 0:
381-
df = _groups_to_df(self.groups.values())
381+
df = _groups_to_df(self.groups)
382382
df.to_csv(self._to_filepath('__groups__'), sep=self.sep, index=False)
383383

384384
def close(self):

larray/inout/excel.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -268,15 +268,15 @@ def list_items(self):
268268
pass
269269
try:
270270
sheet_names.remove('__axes__')
271-
items = [(name, 'Axis') for name in sorted(self.axes.keys())]
271+
items = [(key, 'Axis') for key in sorted(self.axes.keys())]
272272
except:
273273
pass
274274
try:
275275
sheet_names.remove('__groups__')
276-
items += [(name, 'Group') for name in sorted(self.groups.keys())]
276+
items += [(key, 'Group') for key in sorted(self.groups.keys())]
277277
except:
278278
pass
279-
items += [(name, 'Array') for name in sheet_names]
279+
items += [(key, 'Array') for key in sheet_names]
280280
return items
281281

282282
def _read_item(self, key, type, *args, **kwargs):
@@ -316,10 +316,10 @@ def _dump_metadata(self, metadata):
316316

317317
def save(self):
318318
if len(self.axes) > 0:
319-
df = _axes_to_df(self.axes.values())
319+
df = _axes_to_df(self.axes)
320320
df.to_excel(self.handle, '__axes__', index=False, engine='xlsxwriter')
321321
if len(self.groups) > 0:
322-
df = _groups_to_df(self.groups.values())
322+
df = _groups_to_df(self.groups)
323323
df.to_excel(self.handle, '__groups__', index=False, engine='xlsxwriter')
324324

325325
def close(self):
@@ -373,15 +373,15 @@ def list_items(self):
373373
pass
374374
try:
375375
sheet_names.remove('__axes__')
376-
items = [(name, 'Axis') for name in sorted(self.axes.keys())]
376+
items = [(key, 'Axis') for key in sorted(self.axes.keys())]
377377
except:
378378
pass
379379
try:
380380
sheet_names.remove('__groups__')
381-
items += [(name, 'Group') for name in sorted(self.groups.keys())]
381+
items += [(key, 'Group') for key in sorted(self.groups.keys())]
382382
except:
383383
pass
384-
items += [(name, 'Array') for name in sheet_names]
384+
items += [(key, 'Array') for key in sheet_names]
385385
return items
386386

387387
def _read_item(self, key, type, *args, **kwargs):
@@ -419,11 +419,11 @@ def _dump_metadata(self, metadata):
419419

420420
def save(self):
421421
if len(self.axes) > 0:
422-
df = _axes_to_df(self.axes.values())
422+
df = _axes_to_df(self.axes)
423423
self.handle['__axes__'] = ''
424424
self.handle['__axes__'][:].options(pd.DataFrame, index=False).value = df
425425
if len(self.groups) > 0:
426-
df = _groups_to_df(self.groups.values())
426+
df = _groups_to_df(self.groups)
427427
self.handle['__groups__'] = ''
428428
self.handle['__groups__'][:].options(pd.DataFrame, index=False).value = df
429429
self.handle.save()

larray/inout/hdf.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,8 @@ def _read_item(self, key, type, *args, **kwargs):
132132
hdf_key = '/' + key
133133
elif type == 'Axis':
134134
hdf_key = '__axes__/' + key
135-
kwargs['name'] = key
136135
elif type == 'Group':
137136
hdf_key = '__groups__/' + key
138-
kwargs['name'] = key
139137
else:
140138
raise TypeError()
141139
return read_hdf(self.handle, hdf_key, *args, **kwargs)

larray/inout/pandas.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -338,51 +338,61 @@ def df_aslarray(df, sort_rows=False, sort_columns=False, raw=False, parse_header
338338
# SERIES <--> AXIS, GROUP, META #
339339
# #################################### #
340340

341-
def _axis_to_series(axis, dtype=None):
342-
return pd.Series(data=axis.labels, name=str(axis), dtype=dtype)
341+
def _axis_to_series(key, axis, dtype=None):
342+
name = '{}:{}'.format(key, str(axis))
343+
labels = len(axis) if axis.iswildcard else axis.labels
344+
return pd.Series(data=labels, name=name, dtype=dtype)
343345

344346

345347
def _series_to_axis(series):
346-
return Axis(labels=series.values, name=series.name)
348+
name = str(series.name)
349+
if ':' in name:
350+
key, axis_name = name.split(':')
351+
labels = int(series.values[0]) if '*' in axis_name else series.values
352+
if '{?}' in axis_name:
353+
axis_name = None
354+
else:
355+
# for backward compatibility
356+
key = axis_name = name
357+
labels = series.values
358+
return key, Axis(labels=labels, name=axis_name)
347359

348360

349-
def _group_to_series(group, dtype=None):
350-
name = group.name if group.name is not None else '{?}'
361+
def _group_to_series(key, group, dtype=None):
351362
if group.axis.name is None:
352363
raise ValueError("Cannot save a group with an anonymous associated axis")
353-
name += '@{}'.format(group.axis.name)
364+
name = '{}:{}@{}'.format(key, group.name, group.axis.name)
354365
return pd.Series(data=group.eval(), name=name, dtype=dtype)
355366

356367

357-
def _series_to_group(series, axis):
358-
name = series.name.split('@')[0]
359-
return LGroup(key=series.values, name=name, axis=axis)
368+
def _series_to_group(series, axes):
369+
key, name = str(series.name).split(':')
370+
group_name, axis_name = name.split('@')
371+
if group_name == 'None':
372+
group_name = None
373+
axis = axes[axis_name]
374+
return key, LGroup(key=series.values, name=group_name, axis=axis)
360375

361376

362377
# ######################################## #
363378
# DATAFRAME <--> AXES, GROUPS, META #
364379
# ######################################## #
365380

366381
def _df_to_axes(df):
367-
return OrderedDict([(col_name, _series_to_axis(df[col_name])) for col_name in df.columns.values])
382+
return OrderedDict([_series_to_axis(df[col_name]) for col_name in df.columns.values])
368383

369384

370385
def _axes_to_df(axes):
371386
# set dtype to np.object otherwise pd.concat below may convert an int row/column as float
372387
# if trailing NaN need to be added
373-
return pd.concat([_axis_to_series(axis, dtype=np.object) for axis in axes], axis=1)
388+
return pd.concat([_axis_to_series(key, axis, dtype=np.object) for key, axis in axes.items()], axis=1)
374389

375390

376391
def _df_to_groups(df, axes):
377-
groups = OrderedDict()
378-
for name, values in df.iteritems():
379-
group_name, axis_name = name.split('@')
380-
axis = axes[axis_name]
381-
groups[group_name] = _series_to_group(values, axis)
382-
return groups
392+
return OrderedDict([_series_to_group(df[col_name], axes) for col_name in df.columns.values])
383393

384394

385395
def _groups_to_df(groups):
386396
# set dtype to np.object otherwise pd.concat below may convert an int row/column as float
387397
# if trailing NaN need to be added
388-
return pd.concat([_group_to_series(group, dtype=np.object) for group in groups], axis=1)
398+
return pd.concat([_group_to_series(key, group, dtype=np.object) for key, group in groups.items()], axis=1)

0 commit comments

Comments
 (0)