The ResultSet Object¶
Your query results come as a Marvin marvin.tools.results.ResultSet
object. As ResultSet
is sub-classed from a Python list, it behaves exactly as a Python list object. ResultSet
contains a list of query results, where each item in the list is a Marvin ResultRow
object. The Marvin ResultRow
behaves exactly as a python NamedTuple object.
Basics¶
The representation of the ResultSet
indicates some metadata like the total result count, the current set (page) of the total, the current count in the current set, and the array indices out of the total set. For example, <ResultSet(set=1/257, index=0:5, count_in_set=5, total=1282)>
# let's get a sample ResultSet
q = Query(search_filter='nsa.z < 0.1')
r = q.run()
res = r.results
To see what columns are available, you can access them via the columns
attribute. This returns a Query ParameterGroup
object containing only those parameters contained in your query.
cols = res.columns
<ParameterGroup name=Columns, n_parameters=6>
[<QueryParameter full=cube.mangaid, name=mangaid, short=mangaid, remote=mangaid, display=Manga-ID>,
<QueryParameter full=cube.plate, name=plate, short=plate, remote=plate, display=Plate>,
<QueryParameter full=cube.plateifu, name=plateifu, short=plateifu, remote=plateifu, display=Plate-IFU>,
<QueryParameter full=ifu.name, name=ifu_name, short=ifu_name, remote=ifu_name, display=Name>,
<QueryParameter full=nsa.elpetro_absmag_g_r, name=elpetro_absmag_g_r, short=absmag_g_r, remote=elpetro_absmag_g_r, display=Absmag g-r>,
<QueryParameter full=nsa.z, name=z, short=z, remote=z, display=Redshift>]
To convert to a normal Python list, use the to_list
method:
res_list = res.to_list()
To convert to a list of Python dictionaries, use the to_dict
method:
res_dict = res.to_dict()
To in-place sort the set, use the sort
method:
res.sort('z')
You can slice a ResultSet
to return a subset of data which is a new ResultSet
:
subset = res[0:5]
print(subset)
<ResultSet(set=1/257, index=0:5, count_in_set=5, total=1282)>
[ResultRow(mangaid=u'1-109394', plate=8082, plateifu=u'8082-9102', ifu_name=u'9102', elpetro_absmag_g_r=1.26038932800293, z=0.0361073),
ResultRow(mangaid=u'1-113208', plate=8618, plateifu=u'8618-3701', ifu_name=u'3701', elpetro_absmag_g_r=1.48788070678711, z=0.0699044),
ResultRow(mangaid=u'1-113219', plate=7815, plateifu=u'7815-9102', ifu_name=u'9102', elpetro_absmag_g_r=0.543312072753906, z=0.0408897),
ResultRow(mangaid=u'1-113375', plate=7815, plateifu=u'7815-9101', ifu_name=u'9101', elpetro_absmag_g_r=0.757579803466797, z=0.028215),
ResultRow(mangaid=u'1-113379', plate=7815, plateifu=u'7815-6101', ifu_name=u'6101', elpetro_absmag_g_r=1.09770011901855, z=0.0171611)]
Combining¶
If you have more than one group of ResultSets
, you can merge them together using the +
operand. Adding works in either the row-wise or
column-wise direction, depending on the data one is adding. Marvin will only add sets together that come from queries using the same release of data,
as well as the same search_filter. These two parameters uniquely identify a query+results. You cannot add results coming from different queries.
Note: This describes the underlying functionality of adding sets together. However, in practice it is recommended to add Marvin Results together at the top level only. See Adding Results.
row-wise¶
If the indices of all rows in the two ResultSets
are the same, Marvin will add them row-wise. This is useful when you want to combine different return parameters for the same query into a single set:
# get and run a query 1
q = Query(search_filter='nsa.z < 0.1', return_params=['absmag_g_r'])
r = q.run()
e = r.results[0:5]
print(e)
<ResultSet(set=1/257, index=0:5, count_in_set=5, total=1282)>
[ResultRow(mangaid=u'1-109394', plate=8082, plateifu=u'8082-9102', ifu_name=u'9102', elpetro_absmag_g_r=1.26038932800293, z=0.0361073),
ResultRow(mangaid=u'1-113208', plate=8618, plateifu=u'8618-3701', ifu_name=u'3701', elpetro_absmag_g_r=1.48788070678711, z=0.0699044),
ResultRow(mangaid=u'1-113219', plate=7815, plateifu=u'7815-9102', ifu_name=u'9102', elpetro_absmag_g_r=0.543312072753906, z=0.0408897),
ResultRow(mangaid=u'1-113375', plate=7815, plateifu=u'7815-9101', ifu_name=u'9101', elpetro_absmag_g_r=0.757579803466797, z=0.028215),
ResultRow(mangaid=u'1-113379', plate=7815, plateifu=u'7815-6101', ifu_name=u'6101', elpetro_absmag_g_r=1.09770011901855, z=0.0171611)]
# get and run a query 1 with additional return parameters
q2 = Query(search_filter='nsa.z < 0.1', return_params=['nsa.elpetro_ba', 'nsa.sersic_logmass', 'cube.ra', 'cube.dec'])
r2 = q2.run()
e2 = r2.results[0:5]
print(e2)
<ResultSet(set=1/257, index=0:5, count_in_set=5, total=1282)>
[ResultRow(mangaid=u'1-109394', plate=8082, plateifu=u'8082-9102', ifu_name=u'9102', elpetro_ba=0.42712, sersic_logmass=10.3649916322316, ra=50.179936141, dec=-1.0022917898, z=0.0361073),
ResultRow(mangaid=u'1-113208', plate=8618, plateifu=u'8618-3701', ifu_name=u'3701', elpetro_ba=0.752286, sersic_logmass=10.7910706881067, ra=317.504479435, dec=9.86822191739, z=0.0699044),
ResultRow(mangaid=u'1-113219', plate=7815, plateifu=u'7815-9102', ifu_name=u'9102', elpetro_ba=0.517058, sersic_logmass=9.37199275559893, ra=317.374745914, dec=10.0519434342, z=0.0408897),
ResultRow(mangaid=u'1-113375', plate=7815, plateifu=u'7815-9101', ifu_name=u'9101', elpetro_ba=0.570455, sersic_logmass=9.82192731931789, ra=316.639658795, dec=10.7512221884, z=0.028215),
ResultRow(mangaid=u'1-113379', plate=7815, plateifu=u'7815-6101', ifu_name=u'6101', elpetro_ba=0.373641, sersic_logmass=8.72936001627318, ra=316.541566803, dec=10.3454195236, z=0.0171611)]
# add them together
new_set = e + e2
print(new_set)
<ResultSet(set=1/257, index=0:5, count_in_set=5, total=1282)>
[ResultRow(mangaid=u'1-109394', plate=8082, plateifu=u'8082-9102', ifu_name=u'9102', elpetro_absmag_g_r=1.26038932800293, z=0.0361073, elpetro_ba=0.42712, sersic_logmass=10.3649916322316, ra=50.179936141, dec=-1.0022917898),
ResultRow(mangaid=u'1-113208', plate=8618, plateifu=u'8618-3701', ifu_name=u'3701', elpetro_absmag_g_r=1.48788070678711, z=0.0699044, elpetro_ba=0.752286, sersic_logmass=10.7910706881067, ra=317.504479435, dec=9.86822191739),
ResultRow(mangaid=u'1-113219', plate=7815, plateifu=u'7815-9102', ifu_name=u'9102', elpetro_absmag_g_r=0.543312072753906, z=0.0408897, elpetro_ba=0.517058, sersic_logmass=9.37199275559893, ra=317.374745914, dec=10.0519434342),
ResultRow(mangaid=u'1-113375', plate=7815, plateifu=u'7815-9101', ifu_name=u'9101', elpetro_absmag_g_r=0.757579803466797, z=0.028215, elpetro_ba=0.570455, sersic_logmass=9.82192731931789, ra=316.639658795, dec=10.7512221884),
ResultRow(mangaid=u'1-113379', plate=7815, plateifu=u'7815-6101', ifu_name=u'6101', elpetro_absmag_g_r=1.09770011901855, z=0.0171611, elpetro_ba=0.373641, sersic_logmass=8.72936001627318, ra=316.541566803, dec=10.3454195236)]
column-wise¶
If the indices of the rows in the two ResultSets
do not match, then Marvin will simply append them together into a new list. This is useful when you simply want to construct a custom list of objects.:
# grab the first set of 5 from query 1
e = r.results[0:5]
# grab some middle chunk of 10 from query 1
e2 = r.results[50:60]
new_set = e + e2
print(new_set)
<ResultSet(set=1/86, index=0:15, count_in_set=15, total=1282)>
[ResultRow(mangaid=u'1-109394', plate=8082, plateifu=u'8082-9102', ifu_name=u'9102', elpetro_absmag_g_r=1.26038932800293, z=0.0361073),
ResultRow(mangaid=u'1-113208', plate=8618, plateifu=u'8618-3701', ifu_name=u'3701', elpetro_absmag_g_r=1.48788070678711, z=0.0699044),
ResultRow(mangaid=u'1-113219', plate=7815, plateifu=u'7815-9102', ifu_name=u'9102', elpetro_absmag_g_r=0.543312072753906, z=0.0408897),
ResultRow(mangaid=u'1-113375', plate=7815, plateifu=u'7815-9101', ifu_name=u'9101', elpetro_absmag_g_r=0.757579803466797, z=0.028215),
ResultRow(mangaid=u'1-113379', plate=7815, plateifu=u'7815-6101', ifu_name=u'6101', elpetro_absmag_g_r=1.09770011901855, z=0.0171611),
ResultRow(mangaid=u'1-115162', plate=7977, plateifu=u'7977-12703', ifu_name=u'12703', elpetro_absmag_g_r=1.13131713867188, z=0.0738627),
ResultRow(mangaid=u'1-115320', plate=7977, plateifu=u'7977-3703', ifu_name=u'3703', elpetro_absmag_g_r=0.99519157409668, z=0.0275274),
ResultRow(mangaid=u'1-124604', plate=8439, plateifu=u'8439-6103', ifu_name=u'6103', elpetro_absmag_g_r=1.38611221313477, z=0.0253001),
ResultRow(mangaid=u'1-133922', plate=8486, plateifu=u'8486-6104', ifu_name=u'6104', elpetro_absmag_g_r=1.51949119567871, z=0.0174718),
ResultRow(mangaid=u'1-133941', plate=8486, plateifu=u'8486-9102', ifu_name=u'9102', elpetro_absmag_g_r=1.04214859008789, z=0.0189045),
ResultRow(mangaid=u'1-133945', plate=8486, plateifu=u'8486-3703', ifu_name=u'3703', elpetro_absmag_g_r=1.70501899719238, z=0.0183248),
ResultRow(mangaid=u'1-133948', plate=8486, plateifu=u'8486-6103', ifu_name=u'6103', elpetro_absmag_g_r=1.62374401092529, z=0.0195194),
ResultRow(mangaid=u'1-133976', plate=8486, plateifu=u'8486-9101', ifu_name=u'9101', elpetro_absmag_g_r=1.26091766357422, z=0.0182938),
ResultRow(mangaid=u'1-133987', plate=8486, plateifu=u'8486-1902', ifu_name=u'1902', elpetro_absmag_g_r=1.73217391967773, z=0.0195435),
ResultRow(mangaid=u'1-134004', plate=8486, plateifu=u'8486-1901', ifu_name=u'1901', elpetro_absmag_g_r=1.27153015136719, z=0.0185601)]
Subsets¶
Using numpy, you can handle the ResultSet
and extract a subset of elements that satisfy some condition. Slicing a ResultSet
with Numpy array of indices will return a standard Numpy array. For fancier manipulation, consider converting the results into an Astropy Table or Pandas dataframe:
# extract from the set those rows with redshift < 0.07 and g-r color > 1.5
sub = np.where((np.array(res['z']) < 0.07) & (np.array(res['g_r']) > 1.5))[0]
# return a Numpy array subset
subset = res[sub]
len(subset)
24
print(subset)
array([[u'1-113520', u'7815', u'7815-1901', u'1901', u'1.75103473663',
u'0.0167652'],
[u'1-113525', u'8618', u'8618-6103', u'6103', u'1.57906627655',
u'0.0169457'],
[u'1-113525', u'7815', u'7815-1902', u'1902', u'1.57906627655',
u'0.0169457'],
[u'1-113663', u'8618', u'8618-3703', u'3703', u'2.80322933197',
u'0.0316328'],
...
],
dtype='<U14')