Skip to content

Commit b4fdf72

Browse files
authored
Merge pull request #10268 from gem/agg_values
Added a new output "Aggregated Exposure Values"
2 parents de40201 + 089bec1 commit b4fdf72

12 files changed

Lines changed: 55 additions & 3 deletions

File tree

debian/changelog

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
[Michele Simionato]
2+
* Added a new output "Aggregated Exposure Values"
3+
14
python3-oq-engine (3.22.0-1~xenial01) xenial; urgency=low
25

36
[Michele Simionato]

openquake/calculators/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1553,7 +1553,7 @@ def save_agg_values(dstore, assetcol, lossnames, aggby, maxagg):
15531553
if aggby:
15541554
aggids, aggtags = assetcol.build_aggids(aggby, maxagg)
15551555
logging.info('Storing %d aggregation keys', len(aggids))
1556-
agg_keys = [','.join(tags) for tags in aggtags]
1556+
agg_keys = ['\t'.join(tags) for tags in aggtags]
15571557
dstore['agg_keys'] = numpy.array(agg_keys, hdf5.vstr)
15581558
if 'assetcol' not in set(dstore):
15591559
dstore['assetcol'] = assetcol

openquake/calculators/export/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
'loss_curves-stats': 'Asset Loss Curves Statistics',
4343
'loss_maps-rlzs': 'Asset Loss Maps',
4444
'loss_maps-stats': 'Asset Loss Maps Statistics',
45+
'agg_keys': 'Aggregated Exposure Values',
4546
'aggrisk': 'Aggregate Risk',
4647
'aggrisk-stats': 'Aggregate Risk Statistics',
4748
'agg_risk': 'Total Risk',

openquake/calculators/export/risk.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,19 @@ def _fix(col):
594594
return col
595595

596596

597+
@export.add(('agg_keys', 'csv'))
598+
def export_agg_keys_csv(ekey, dstore):
599+
"""
600+
:param ekey: export key, i.e. a pair (datastore key, fmt)
601+
:param dstore: datastore object
602+
"""
603+
df = extract(dstore, ekey[0] + '?')
604+
writer = writers.CsvWriter(fmt=writers.FIVEDIGITS)
605+
fname = dstore.export_path('%s.%s' % ekey)
606+
writer.save(df, fname, comment=dstore.metadata)
607+
return [fname]
608+
609+
597610
@export.add(('aggcurves', 'csv'))
598611
def export_aggcurves_csv(ekey, dstore):
599612
"""

openquake/calculators/extract.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ def extract_agg_curves(dstore, what):
769769
tagvalues = [tagdict[t][0] for t in tagnames]
770770
if tagnames:
771771
lst = decode(dstore['agg_keys'][:])
772-
agg_id = lst.index(','.join(tagvalues))
772+
agg_id = lst.index('\t'.join(tagvalues))
773773
else:
774774
agg_id = 0 # total aggregation
775775
ep_fields = dstore.get_attr('aggcurves', 'ep_fields')
@@ -815,6 +815,26 @@ def extract_agg_curves(dstore, what):
815815
return ArrayWrapper(arr, dict(json=hdf5.dumps(attrs)))
816816

817817

818+
@extract.add('agg_keys')
819+
def extract_agg_keys(dstore, what):
820+
"""
821+
Aggregate the exposure values (one for each loss type) by tag. Use it as
822+
/extract/agg_keys?
823+
"""
824+
aggby = dstore['oqparam'].aggregate_by[0]
825+
keys = numpy.array([line.decode('utf8').split('\t')
826+
for line in dstore['agg_keys'][:]])
827+
values = dstore['agg_values'][:-1] # discard the total aggregation
828+
ok = values['structural'] > 0
829+
okvalues = values[ok]
830+
dic = {}
831+
for i, tag in enumerate(aggby):
832+
dic[tag] = keys[ok, i]
833+
for name in values.dtype.names:
834+
dic[name] = okvalues[name]
835+
return pandas.DataFrame(dic)
836+
837+
818838
@extract.add('agg_losses')
819839
def extract_agg_losses(dstore, what):
820840
"""

openquake/calculators/tests/event_based_risk_test.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ def test_case_1_ins(self):
9999
# this is a case with insured losses and tags
100100
self.run_calc(case_1.__file__, 'job_ins.ini', concurrent_tasks='4')
101101

102+
# testing agg_keys
103+
[fname] = export(('agg_keys', 'csv'), self.calc.datastore)
104+
self.assertEqualFiles('expected/%s' % strip_calc_id(fname), fname,
105+
delta=1E-5)
106+
102107
# testing the view agg_id
103108
agg_id = view('agg_id', self.calc.datastore)
104109
self.assertEqual(str(agg_id), '''\

openquake/calculators/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1524,7 +1524,7 @@ def view_agg_id(token, dstore):
15241524
Show the available aggregations
15251525
"""
15261526
[aggby] = dstore['oqparam'].aggregate_by
1527-
keys = [key.decode('utf8').split(',') for key in dstore['agg_keys'][:]]
1527+
keys = [key.decode('utf8').split('\t') for key in dstore['agg_keys'][:]]
15281528
keys = numpy.array(keys) # shape (N, A)
15291529
dic = {aggkey: keys[:, a] for a, aggkey in enumerate(aggby)}
15301530
df = pandas.DataFrame(dic)

openquake/engine/tests/aristotle1/job.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ maximum_distance = 600
1010
number_of_ground_motion_fields = 10
1111
asset_hazard_distance = 50
1212
tectonic_region_type = Active Shallow Crust
13+
aggregate_by = ID_1,OCCUPANCY

openquake/engine/tests/aristotle2/job.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ maximum_distance = 400
1010
number_of_ground_motion_fields = 10
1111
asset_hazard_distance = 50
1212
tectonic_region_type = Tectonic_Type_A
13+
aggregate_by = ID_1,OCCUPANCY

openquake/engine/tests/aristotle3/job.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ maximum_distance = 600
1010
number_of_ground_motion_fields = 10
1111
asset_hazard_distance = 50
1212
tectonic_region_type = Shallow Default
13+
aggregate_by = ID_1,OCCUPANCY

0 commit comments

Comments
 (0)