Skip to content

Commit 0ec584d

Browse files
committed
NEW: distance-matrix-to-pd-series-transformer
1 parent 72ffbac commit 0ec584d

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

q2_types/distance_matrix/_deferred_setup/_transformers.py

+32
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# ----------------------------------------------------------------------------
88

99
import skbio
10+
import pandas as pd
1011

1112
from .. import LSMatFormat
1213

@@ -24,3 +25,34 @@ def _1(data: skbio.DistanceMatrix) -> LSMatFormat:
2425
@plugin.register_transformer
2526
def _2(ff: LSMatFormat) -> skbio.DistanceMatrix:
2627
return skbio.DistanceMatrix.read(str(ff), format='lsmat', verify=False)
28+
29+
30+
@plugin.register_transformer
31+
def _3(ff: LSMatFormat) -> pd.Series:
32+
dm = skbio.DistanceMatrix.read(str(ff), format='lsmat', verify=False)
33+
series = dm.to_series()
34+
assert series.size != 0, ("Distance Matrix must contain more"
35+
"than one sample")
36+
return series
37+
38+
39+
@plugin.register_transformer
40+
def _4(data: pd.Series) -> skbio.DistanceMatrix:
41+
ids = data.index.get_level_values(0).unique().union(
42+
data.index.get_level_values(1).unique(), sort=False).values
43+
dm_df = pd.DataFrame(data=[], index=ids, columns=ids)
44+
for index, row in dm_df.iterrows():
45+
dm_df.loc[index, index] = float(0)
46+
for col in dm_df.columns:
47+
if dm_df.loc[index, col] != 0:
48+
try:
49+
dm_df.loc[index, col] = data[index, col]
50+
dm_df.loc[col, index] = data[index, col]
51+
except KeyError:
52+
dm_df.loc[index, col] = data[col, index]
53+
dm_df.loc[col, index] = data[col, index]
54+
dm = skbio.DistanceMatrix(dm_df, ids=dm_df.index)
55+
ff = LSMatFormat()
56+
with ff.open() as fh:
57+
dm.write(fh, format='lsmat')
58+
return ff

q2_types/distance_matrix/tests/test_transformers.py

+31
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import unittest
1010

1111
import skbio
12+
import pandas as pd
1213

1314
from q2_types.distance_matrix import LSMatFormat
1415
from qiime2.plugin.testing import TestPluginBase
@@ -40,6 +41,36 @@ def test_lsmat_format_to_skbio_distance_matrix(self):
4041
exp = skbio.DistanceMatrix.read(str(input))
4142
self.assertEqual(obs, exp)
4243

44+
def test_lsmat_format_to_pd_series(self):
45+
filenames = ('distance-matrix-2x2.tsv',
46+
'distance-matrix-NxN.tsv')
47+
for filename in filenames:
48+
input, obs = self.transform_format(LSMatFormat,
49+
pd.Series,
50+
filename=filename)
51+
exp = skbio.DistanceMatrix.read(str(input)).to_series()
52+
pd.testing.assert_series_equal(obs, exp)
53+
54+
def test_lsmat_format_to_pd_series_1x1(self):
55+
filename = 'distance-matrix-1x1.tsv'
56+
with self.assertRaisesRegex(AssertionError, "Distance Matrix *"):
57+
self.transform_format(LSMatFormat,
58+
pd.Series,
59+
filename=filename)
60+
61+
def test_pd_series_to_skbio_distance_matrix(self):
62+
transformer = self.get_transformer(pd.Series, skbio.DistanceMatrix)
63+
64+
filenames = ('distance-matrix-NxN.tsv', 'distance-matrix-2x2.tsv')
65+
for filename in filenames:
66+
input = skbio.DistanceMatrix.read(self.get_data_path(filename))
67+
obs = transformer(input.to_series())
68+
obs = skbio.DistanceMatrix.read(str(obs))
69+
70+
exp = input
71+
72+
self.assertEqual(obs, exp)
73+
4374

4475
if __name__ == "__main__":
4576
unittest.main()

0 commit comments

Comments
 (0)