diff --git a/cymetric/metrics.py b/cymetric/metrics.py index 788ecce0..42e2c1a7 100644 --- a/cymetric/metrics.py +++ b/cymetric/metrics.py @@ -504,4 +504,58 @@ def inventory_quantity_per_gwe(expinv,power): inv.Quantity = inv.Quantity/inv.Value inv=inv.drop(['Value'],axis=1) return inv - + +# Cumulative power from time 0 to time t in TimeSeriesPower metric +_cumpdeps = ['TimeSeriesPower'] + +_cumpschema = [ + ('SimId', ts.UUID), + ('AgentId', ts.INT), + ('Time', ts.INT), + ('Value', ts.DOUBLE) + ] + +@metric(name='CumulativeTimeSeriesPower', depends=_cumpdeps, schema=_cumpschema) +def cumulative_timeseriespower(power): + """Cumulative Timeseriespower metric returns the TimeSeriesPower metric with a cumulative sum + of the power generated by each SimId from time 0 to time t. + """ + power = pd.DataFrame(data={'SimId': power.SimId, + 'AgentId': power.AgentId, + 'Time': power.Time, + 'Value': power.Value}, + columns=['SimId','AgentID','Time', 'Value']) + power_index = ['SimId','Time'] + power = power.groupby(power_index).sum() + df1 = power.reset_index() + df1['Value'] = df1['Value'].cumsum() + return df1 + +# Quantity per GigaWattElectric Per Cumulative Power in Inventory [kg/GWe] +_invdeps = ['ExplicitInventory','CumulativeTimeSeriesPower'] + +_invschema = [ + ('SimId', ts.UUID), + ('AgentId', ts.INT), + ('Time', ts.INT), + ('InventoryName', ts.STRING), + ('NucId', ts.INT), + ('Quantity', ts.DOUBLE) + ] +@metric(name='InventoryQuantityPerCumulativePower', depends=_invdeps, schema=_invschema) +def inventory_quantity_per_cumulative_power(expinv,cumpower): + """Inventory Quantity per GWe metric returns the explicit inventory table with quantity + in units of kg/GWe, calculated by dividing the original quantity by the cumulative sum of + the electricity generated in TimeSeriesPower metric from time 0 + """ + inv = pd.DataFrame(data={'SimId': expinv.SimId, + 'AgentId': expinv.AgentId, + 'Time': expinv.Time, + 'InventoryName': expinv.InventoryName, + 'NucId': expinv.NucId, + 'Quantity': expinv.Quantity}, + columns=['SimId','AgentId','Time','InventoryName','NucId','Quantity']) + inv=pd.merge(inv,cumpower, on=['SimId','Time'],how='left') + inv.Quantity = inv.Quantity/inv.Value + inv=inv.drop(['Value'],axis=1) + return inv diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 28459eb8..40b22447 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -396,6 +396,59 @@ def test_inventory_quantity_per_gwe(): obs = metrics.inventory_quantity_per_gwe.func(inv, tsp) assert_frame_equal(exp, obs) + +def test_cumulative_timeseriespower(): + #exp is the expected output metrics + exp = pd.DataFrame(np.array([ + (UUID('f22f2281-2464-420a-8325-37320fd418f8'), 2, 300), + (UUID('f22f2281-2464-420a-8325-37320fd418f8'), 3, 700) + ], dtype=ensure_dt_bytes([ + ('SimId', 'O'), ('Time', '