Metrics Calculations Tutorial
This notebook provides examples on how to carry out data metrics calcuations and analysis using the post_processing python library. Be sure to go through the Quick Start section of the documentation for instructions on how to access and import the libary and its packages.
If you would like to open an editable runnable version of the tutorial click here to be directed to a binder platform
The Library is still under active development and empty sections will be completed in Due time
Table of content
All files are available in the github repository here
Requirements
The conda environmnent contains all libraries associated the post processing library. After setting up the conda environment, you only have to import the metrics maniupulation module from postprocessinglib.evaluation.
[2]:
import pandas as pd
from postprocessinglib.evaluation import data, metrics
Lets use one of the data blocks from the data manipulation tutorial
[3]:
# passing a controlled csv file for testing
path_output = "MESH_output_streamflow_2.csv"
path_input = "Station_data.xlsx"
DATAFRAMES = data.generate_dataframes(csv_fpaths=path_output, warm_up=91)
Stations = pd.read_excel(io=path_input)
ignore = []
for i in range(0, len(Stations)):
if Stations['Properties'][i] == 'X':
ignore.append(i)
Stations = Stations.drop(Stations[Stations['Properties'] == 'X'].index)
Stations = Stations.set_index('Station Number')
for i in reversed(ignore):
DATAFRAMES["DF_OBSERVED"] = DATAFRAMES["DF_OBSERVED"].drop(columns = DATAFRAMES['DF_OBSERVED'].columns[i])
DATAFRAMES['DF_SIMULATED'] = DATAFRAMES["DF_SIMULATED"].drop(columns = DATAFRAMES['DF_SIMULATED'].columns[i])
for key, dataframe in DATAFRAMES.items():
if key != "DF_SIMULATED" and key != "DF_OBSERVED":
DATAFRAMES[key] = dataframe.drop(columns = dataframe.columns[[2*i, 2*i+1]])
# for key, value in DATAFRAMES.items():
# print(f"{key}:\n{value.head}")
The start date for the Data is 1982-01-01
Now that we have our data, let’s jump right in!
Available Metrics
Because the library is in active development, there will be regular removals and additions to its features. As a rule of thumb therefore it is always a good idea to check what it can do at the time of use. We can do this by going ->
[4]:
metrics.available_metrics()
[4]:
['MSE - Mean Square Error',
'RMSE - Roor Mean Square Error',
'MAE - Mean Average Error',
'NSE - Nash-Sutcliffe Efficiency ',
'NegNSE - Nash-Sutcliffe Efficiency * -1',
'LogNSE - Log of Nash-Sutcliffe Efficiency',
'NegLogNSE - Log of Nash-Sutcliffe Efficiency * -1',
'KGE - Kling-Gupta Efficiency',
'NegKGE - Kling-Gupta Efficiency * -1',
'KGE 2012 - Kling-Gupta Efficiency modified as of 2012',
'BIAS- Prcentage Bias',
'AbsBIAS - Absolute Value of the Percentage Bias',
'TTP - Time to Peak',
'TTCoM - Time to Centre of Mass',
'SPOD - Spring Pulse ONset Delay',
'FDC Slope - Slope of the Flow Duration Curve']
Single Data Metrics
These are the metrics that only apply to just one of either the simulated or observed data. They are less about analysis and more about obtaining information about the data. These aren’t made to compare but rather to inform trends and behaviours at a particular station. The library has 4 of them :
Time to Peak
This helps to show how long it takes on average to get to the highest streamflow each year. An example is shown below:
[5]:
# The Time to Peak for the simulated data will look like
print(metrics.time_to_peak(df=DATAFRAMES['DF_SIMULATED']))
# The time to peak for the observed data looks like:-
print(metrics.time_to_peak(df=DATAFRAMES['DF_OBSERVED']))
ttp
Station 1 170.0
Station 2 177.0
Station 3 176.0
Station 4 168.0
Station 5 171.0
Station 6 175.0
Station 7 166.0
Station 8 156.0
Station 9 156.0
Station 10 170.0
Station 11 179.0
Station 12 162.0
Station 13 171.0
Station 14 171.0
Station 15 168.0
Station 16 175.0
Station 17 170.0
Station 18 190.0
Station 19 187.0
Station 20 184.0
Station 21 187.0
Station 22 174.0
Station 23 173.0
Station 24 214.0
Station 25 176.0
Station 26 184.0
Station 27 149.0
Station 28 148.0
Station 29 155.0
Station 30 186.0
Station 31 141.0
Station 32 143.0
Station 33 154.0
Station 34 171.0
Station 35 177.0
Station 36 170.0
Station 37 172.0
Station 38 178.0
Station 39 147.0
Station 40 155.0
ttp
Station 1 157.0
Station 2 157.0
Station 3 158.0
Station 4 159.0
Station 5 160.0
Station 6 172.0
Station 7 175.0
Station 8 166.0
Station 9 165.0
Station 10 173.0
Station 11 189.0
Station 12 169.0
Station 13 164.0
Station 14 169.0
Station 15 167.0
Station 16 167.0
Station 17 171.0
Station 18 163.0
Station 19 169.0
Station 20 159.0
Station 21 156.0
Station 22 184.0
Station 23 178.0
Station 24 179.0
Station 25 184.0
Station 26 174.0
Station 27 119.0
Station 28 115.0
Station 29 121.0
Station 30 172.0
Station 31 128.0
Station 32 123.0
Station 33 134.0
Station 34 123.0
Station 35 158.0
Station 36 111.0
Station 37 150.0
Station 38 152.0
Station 39 161.0
Station 40 139.0
As you can see, at the first station, on average, over the years, the highest predicted streamflow value will usually occur after 170 days - somewhere in the third week of June. For the second station on average, over the years, the highest predicted streamflow value usually occur after 177 days - somewhere in the final week of June. As you can see, you are able to observe and notice trends with the data at specific stations.
Time to Centre of Mass
This helps to show how long it takes on average to obtain 50% of the streamflow each year. An example is shown below:
[6]:
# The Time to Centre of Mass for the simulated data will look like
print(metrics.time_to_centre_of_mass(df=DATAFRAMES['DF_SIMULATED']))
# The time to Centre of Mass for the observed data looks like:-
print(metrics.time_to_centre_of_mass(df=DATAFRAMES['DF_OBSERVED']))
ttcom
Station 1 184.0
Station 2 166.0
Station 3 188.0
Station 4 182.0
Station 5 182.0
Station 6 183.0
Station 7 190.0
Station 8 183.0
Station 9 180.0
Station 10 158.0
Station 11 175.0
Station 12 185.0
Station 13 169.0
Station 14 181.0
Station 15 182.0
Station 16 181.0
Station 17 187.0
Station 18 175.0
Station 19 190.0
Station 20 190.0
Station 21 192.0
Station 22 187.0
Station 23 193.0
Station 24 205.0
Station 25 189.0
Station 26 190.0
Station 27 152.0
Station 28 147.0
Station 29 161.0
Station 30 189.0
Station 31 155.0
Station 32 160.0
Station 33 167.0
Station 34 169.0
Station 35 187.0
Station 36 171.0
Station 37 190.0
Station 38 187.0
Station 39 156.0
Station 40 183.0
ttcom
Station 1 0.0
Station 2 0.0
Station 3 0.0
Station 4 178.0
Station 5 0.0
Station 6 178.0
Station 7 0.0
Station 8 194.0
Station 9 186.0
Station 10 172.0
Station 11 0.0
Station 12 186.0
Station 13 177.0
Station 14 0.0
Station 15 0.0
Station 16 177.0
Station 17 194.0
Station 18 0.0
Station 19 182.0
Station 20 177.0
Station 21 180.0
Station 22 195.0
Station 23 0.0
Station 24 184.0
Station 25 0.0
Station 26 183.0
Station 27 0.0
Station 28 0.0
Station 29 0.0
Station 30 0.0
Station 31 0.0
Station 32 0.0
Station 33 0.0
Station 34 157.0
Station 35 181.0
Station 36 0.0
Station 37 0.0
Station 38 173.0
Station 39 0.0
Station 40 0.0
As you can see, at the fourth station, on average, over the years, 50% of the total volume of streamflow each year will usually have occured by 178 days - somewhere in the final week of June and for the twentieth station, after 179 days - Right at the end of June.
Spring Pulse Onset Delay
This is used to determine what day snowmelt starts. An example is shown below:
[7]:
# The Spring Pulse Onset for the simulated data will look like
print(metrics.SpringPulseOnset(df=DATAFRAMES['DF_SIMULATED']))
# The Spring Pulse Onset for the observed data looks like:-
print(metrics.SpringPulseOnset(df=DATAFRAMES['DF_OBSERVED']))
SPOD
Station
Station 1 127.0
Station 2 116.0
Station 3 126.0
Station 4 119.0
Station 5 121.0
Station 6 124.0
Station 7 139.0
Station 8 126.0
Station 9 125.0
Station 10 297.0
Station 11 114.0
Station 12 134.0
Station 13 109.0
Station 14 123.0
Station 15 126.0
Station 16 132.0
Station 17 128.0
Station 18 124.0
Station 19 144.0
Station 20 146.0
Station 21 145.0
Station 22 122.0
Station 23 119.0
Station 24 199.0
Station 25 136.0
Station 26 120.0
Station 27 108.0
Station 28 107.0
Station 29 105.0
Station 30 116.0
Station 31 112.0
Station 32 108.0
Station 33 113.0
Station 34 107.0
Station 35 115.0
Station 36 126.0
Station 37 205.0
Station 38 135.0
Station 39 103.0
Station 40 110.0
SPOD
Station
Station 1 109.0
Station 2 73.4
Station 3 96.7
Station 4 114.0
Station 5 113.0
Station 6 114.0
Station 7 142.0
Station 8 136.0
Station 9 137.0
Station 10 297.0
Station 11 169.0
Station 12 138.0
Station 13 118.0
Station 14 54.5
Station 15 89.1
Station 16 157.0
Station 17 135.0
Station 18 102.0
Station 19 114.0
Station 20 105.0
Station 21 110.0
Station 22 140.0
Station 23 49.4
Station 24 144.0
Station 25 NaN
Station 26 108.0
Station 27 48.6
Station 28 60.1
Station 29 37.2
Station 30 104.0
Station 31 97.8
Station 32 44.1
Station 33 38.1
Station 34 88.7
Station 35 97.5
Station 36 85.3
Station 37 223.0
Station 38 108.0
Station 39 95.5
Station 40 99.3
This shows us that at the first station, on average, over the years, snowmelt is predicted to begin 127 days into the year - somewhere in the First week of May. For the third station on average, over the years, snowmelt is predicted to begin 126 days into the year - somewhere in the First week of May as well
Flow Duration Curve Slope
This is used to calculate the slope of the flow duration curve. An example is shown below:
[8]:
# The Fliw Duration Curve for the Simulated Data will look like
print(metrics.slope_fdc(df=DATAFRAMES['DF_SIMULATED']))
# You can also specify which percentile to pick values from
print(metrics.slope_fdc(df=DATAFRAMES['DF_OBSERVED'], percentiles=(25, 77)))
fdc_Slope
Station 1 3.1504
Station 2 2.3760
Station 3 2.1143
Station 4 4.2863
Station 5 3.7256
Station 6 2.7546
Station 7 8.0229
Station 8 7.0940
Station 9 1.5833
Station 10 4.0913
Station 11 6.9928
Station 12 2.3851
Station 13 5.7800
Station 14 2.7093
Station 15 2.6374
Station 16 2.3301
Station 17 5.6500
Station 18 5.6270
Station 19 1.1424
Station 20 1.3281
Station 21 1.5908
Station 22 6.1167
Station 23 0.7576
Station 24 0.7100
Station 25 6.3471
Station 26 1.0788
Station 27 4.4442
Station 28 3.1001
Station 29 5.1716
Station 30 1.2852
Station 31 5.2684
Station 32 4.5245
Station 33 3.5924
Station 34 3.9921
Station 35 1.7148
Station 36 5.9512
Station 37 1.3825
Station 38 0.6681
Station 39 5.2883
Station 40 1.1330
fdc_Slope
Station 1 3.1056
Station 2 2.8474
Station 3 1.9309
Station 4 2.2899
Station 5 2.2318
Station 6 1.6073
Station 7 2.9915
Station 8 3.4933
Station 9 1.2973
Station 10 3.6535
Station 11 1.4577
Station 12 1.2231
Station 13 3.3378
Station 14 1.6942
Station 15 3.0053
Station 16 1.4711
Station 17 3.1848
Station 18 3.6244
Station 19 2.1304
Station 20 2.3770
Station 21 2.6112
Station 22 2.3924
Station 23 0.9128
Station 24 0.7879
Station 25 1.8806
Station 26 1.2756
Station 27 5.0300
Station 28 6.7349
Station 29 6.2949
Station 30 1.3945
Station 31 4.0213
Station 32 5.7024
Station 33 5.5476
Station 34 4.0779
Station 35 1.6382
Station 36 2.1300
Station 37 1.9487
Station 38 1.3509
Station 39 4.3516
Station 40 1.3356
Comparison Metrics
These are the metrics that are used to compare the simulated and observed data. They work to show accurately we are able to predict the streamflow values using the models. Every other metric is a comparison metric. They are shown below:
Mean Square Error
[9]:
# Mean square error for the data we were given
print(metrics.mse(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 1304.000
Station 2 801.200
Station 3 17.440
Station 4 5539.000
Station 5 4951.000
Station 6 14250.000
Station 7 85.480
Station 8 577.500
Station 9 1838.000
Station 10 45.260
Station 11 87.610
Station 12 1898.000
Station 13 535.500
Station 14 4722.000
Station 15 6484.000
Station 16 4763.000
Station 17 621.800
Station 18 125.100
Station 19 1415.000
Station 20 2282.000
Station 21 3487.000
Station 22 798.200
Station 23 11150.000
Station 24 1876.000
Station 25 1287.000
Station 26 13730.000
Station 27 54.800
Station 28 8.375
Station 29 41.190
Station 30 17410.000
Station 31 19.850
Station 32 89.690
Station 33 166.600
Station 34 170.600
Station 35 20190.000
Station 36 36.270
Station 37 21630.000
Station 38 68600.000
Station 39 2450.000
Station 40 139600.000
Root Mean Square Error
[10]:
# Root Mean square error for the data we were given
print(metrics.rmse(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 36.110
Station 2 28.310
Station 3 4.177
Station 4 74.420
Station 5 70.360
Station 6 119.400
Station 7 9.246
Station 8 24.030
Station 9 42.870
Station 10 6.728
Station 11 9.360
Station 12 43.570
Station 13 23.140
Station 14 68.720
Station 15 80.530
Station 16 69.010
Station 17 24.940
Station 18 11.190
Station 19 37.610
Station 20 47.770
Station 21 59.050
Station 22 28.250
Station 23 105.600
Station 24 43.320
Station 25 35.870
Station 26 117.200
Station 27 7.403
Station 28 2.894
Station 29 6.418
Station 30 131.900
Station 31 4.456
Station 32 9.471
Station 33 12.910
Station 34 13.060
Station 35 142.100
Station 36 6.023
Station 37 147.100
Station 38 261.900
Station 39 49.500
Station 40 373.600
Mean Average Error
[11]:
# Mean Average error for the data we were given
print(metrics.mae(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 210400.0
Station 2 29700.0
Station 3 15570.0
Station 4 492800.0
Station 5 450700.0
Station 6 941100.0
Station 7 50290.0
Station 8 228500.0
Station 9 467100.0
Station 10 58020.0
Station 11 50720.0
Station 12 463000.0
Station 13 134400.0
Station 14 355200.0
Station 15 415100.0
Station 16 584800.0
Station 17 151100.0
Station 18 51360.0
Station 19 241900.0
Station 20 290000.0
Station 21 346600.0
Station 22 156500.0
Station 23 468600.0
Station 24 423300.0
Station 25 163000.0
Station 26 874300.0
Station 27 27240.0
Station 28 8091.0
Station 29 14870.0
Station 30 943500.0
Station 31 19570.0
Station 32 36810.0
Station 33 15320.0
Station 34 63130.0
Station 35 994400.0
Station 36 20120.0
Station 37 994500.0
Station 38 2110000.0
Station 39 194800.0
Station 40 2793000.0
Nash-Sutcliffe Efficiency
[12]:
# Nash-Sutcliffe Efficiency for the data we were given
print(metrics.nse(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 0.515000
Station 2 -1.746000
Station 3 -2.021000
Station 4 0.616500
Station 5 0.658800
Station 6 0.658800
Station 7 0.366200
Station 8 0.663000
Station 9 0.331100
Station 10 -0.392200
Station 11 -2.092000
Station 12 0.463900
Station 13 0.703700
Station 14 0.690500
Station 15 0.579000
Station 16 0.514400
Station 17 0.401900
Station 18 -0.175000
Station 19 0.588000
Station 20 0.482900
Station 21 0.329100
Station 22 -0.931100
Station 23 -0.763800
Station 24 -1.619000
Station 25 0.186000
Station 26 0.396100
Station 27 -0.881000
Station 28 -0.016910
Station 29 -1.577000
Station 30 0.332200
Station 31 0.365600
Station 32 -0.009723
Station 33 0.215400
Station 34 -0.204100
Station 35 0.369400
Station 36 -0.252500
Station 37 0.191100
Station 38 0.162100
Station 39 -5.021000
Station 40 -0.110300
Logarithm of the Nash-Sutcliffe Efficiency
[13]:
# Logarithm of the Nash-Sutcliffe Efficiency for the data we were given
print(metrics.lognse(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 -0.29320
Station 2 -0.19990
Station 3 -0.03280
Station 4 0.12760
Station 5 0.16830
Station 6 -0.16750
Station 7 -0.47860
Station 8 -1.66000
Station 9 -1.87100
Station 10 0.03629
Station 11 -24.23000
Station 12 -2.01400
Station 13 -1.09600
Station 14 -0.11540
Station 15 0.03147
Station 16 -0.76310
Station 17 -0.01762
Station 18 -1.82600
Station 19 -0.02795
Station 20 0.05579
Station 21 0.21040
Station 22 -1.47800
Station 23 -1.82200
Station 24 -7.55300
Station 25 -0.83130
Station 26 -0.99350
Station 27 -0.51630
Station 28 -0.06095
Station 29 0.03787
Station 30 -0.38420
Station 31 -2.06700
Station 32 -0.07810
Station 33 0.12600
Station 34 0.40760
Station 35 0.19540
Station 36 -9.34200
Station 37 0.36230
Station 38 0.22310
Station 39 -0.67950
Station 40 0.26580
Kling-Gupta Efficiency
[14]:
# Kling-Gupta Efficiency for the data we were given
print(metrics.kge(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 0.50170
Station 2 -0.11880
Station 3 -0.02808
Station 4 0.78110
Station 5 0.82350
Station 6 0.80610
Station 7 0.59930
Station 8 0.58330
Station 9 0.58140
Station 10 0.09846
Station 11 -0.20680
Station 12 0.61750
Station 13 0.71600
Station 14 0.76860
Station 15 0.70680
Station 16 0.69220
Station 17 0.51780
Station 18 0.36490
Station 19 0.75520
Station 20 0.69010
Station 21 0.64740
Station 22 -0.01263
Station 23 0.08817
Station 24 0.03350
Station 25 0.43390
Station 26 0.60640
Station 27 0.23640
Station 28 0.50080
Station 29 0.07385
Station 30 0.62840
Station 31 0.20520
Station 32 0.21400
Station 33 0.23620
Station 34 0.42820
Station 35 0.64150
Station 36 -0.16920
Station 37 0.61540
Station 38 0.60540
Station 39 -0.81910
Station 40 0.46120
Modified Kling Gupta efficiency
This is different from the regular kge in that this uses the coefficient of Variation as its bias term (i.e., std/mean) as opposed to just the mean
[15]:
# Kling-Gupta Efficiency for the data we were given
print(metrics.kge_2012(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 0.556500
Station 2 0.059540
Station 3 -0.232300
Station 4 0.756200
Station 5 0.823000
Station 6 0.746500
Station 7 0.320900
Station 8 0.365600
Station 9 0.111200
Station 10 0.108600
Station 11 -0.175000
Station 12 0.207600
Station 13 0.570600
Station 14 0.694600
Station 15 0.764700
Station 16 0.539700
Station 17 0.652300
Station 18 -0.263600
Station 19 0.649100
Station 20 0.636600
Station 21 0.571400
Station 22 0.170600
Station 23 -0.084050
Station 24 0.009723
Station 25 0.208900
Station 26 0.414800
Station 27 -0.066640
Station 28 0.511100
Station 29 0.012960
Station 30 0.452700
Station 31 0.269300
Station 32 -0.085330
Station 33 0.001935
Station 34 0.242400
Station 35 0.525000
Station 36 -0.185300
Station 37 0.610100
Station 38 0.615200
Station 39 -0.080510
Station 40 0.393800
Percentage Bias
[16]:
# Percentage Bias for the data we were given
print(metrics.bias(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED']))
model1
Station 1 -34.7500
Station 2 10.6600
Station 3 -14.5900
Station 4 9.7750
Station 5 0.3038
Station 6 -8.0200
Station 7 -20.2900
Station 8 -39.0200
Station 9 -35.3200
Station 10 -48.4300
Station 11 1.6260
Station 12 -33.7400
Station 13 -24.5700
Station 14 -6.6710
Station 15 17.3900
Station 16 -13.5300
Station 17 11.5000
Station 18 -38.0200
Station 19 -12.2800
Station 20 -17.6700
Station 21 -15.9200
Station 22 10.7300
Station 23 -8.7560
Station 24 -36.1700
Station 25 -13.4700
Station 26 -14.1300
Station 27 -23.3200
Station 28 18.7200
Station 29 -4.6580
Station 30 -14.9400
Station 31 -56.1900
Station 32 -53.9500
Station 33 -57.1200
Station 34 -23.1600
Station 35 -10.0600
Station 36 -60.6800
Station 37 -2.5050
Station 38 1.3850
Station 39 56.7800
Station 40 -5.4300
Now that we have seen individual metrics, we also have the ability to calculate a list of metrics using our calculate_all_metrics or calculate_metrics(list of merics). These are shown below:
[17]:
metrices = ["MSE", "RMSE", "MAE", "NSE", "NegNSE"]
metrics.calculate_metrics(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED'],
metrices=metrices)
[17]:
| MSE | RMSE | MAE | NSE | NEGNSE | |
|---|---|---|---|---|---|
| model1 | model1 | model1 | model1 | model1 | |
| Station 1 | 1304.000 | 36.110 | 210400.0 | 0.515000 | -0.515000 |
| Station 2 | 801.200 | 28.310 | 29700.0 | -1.746000 | 1.746000 |
| Station 3 | 17.440 | 4.177 | 15570.0 | -2.021000 | 2.021000 |
| Station 4 | 5539.000 | 74.420 | 492800.0 | 0.616500 | -0.616500 |
| Station 5 | 4951.000 | 70.360 | 450700.0 | 0.658800 | -0.658800 |
| Station 6 | 14250.000 | 119.400 | 941100.0 | 0.658800 | -0.658800 |
| Station 7 | 85.480 | 9.246 | 50290.0 | 0.366200 | -0.366200 |
| Station 8 | 577.500 | 24.030 | 228500.0 | 0.663000 | -0.663000 |
| Station 9 | 1838.000 | 42.870 | 467100.0 | 0.331100 | -0.331100 |
| Station 10 | 45.260 | 6.728 | 58020.0 | -0.392200 | 0.392200 |
| Station 11 | 87.610 | 9.360 | 50720.0 | -2.092000 | 2.092000 |
| Station 12 | 1898.000 | 43.570 | 463000.0 | 0.463900 | -0.463900 |
| Station 13 | 535.500 | 23.140 | 134400.0 | 0.703700 | -0.703700 |
| Station 14 | 4722.000 | 68.720 | 355200.0 | 0.690500 | -0.690500 |
| Station 15 | 6484.000 | 80.530 | 415100.0 | 0.579000 | -0.579000 |
| Station 16 | 4763.000 | 69.010 | 584800.0 | 0.514400 | -0.514400 |
| Station 17 | 621.800 | 24.940 | 151100.0 | 0.401900 | -0.401900 |
| Station 18 | 125.100 | 11.190 | 51360.0 | -0.175000 | 0.175000 |
| Station 19 | 1415.000 | 37.610 | 241900.0 | 0.588000 | -0.588000 |
| Station 20 | 2282.000 | 47.770 | 290000.0 | 0.482900 | -0.482900 |
| Station 21 | 3487.000 | 59.050 | 346600.0 | 0.329100 | -0.329100 |
| Station 22 | 798.200 | 28.250 | 156500.0 | -0.931100 | 0.931100 |
| Station 23 | 11150.000 | 105.600 | 468600.0 | -0.763800 | 0.763800 |
| Station 24 | 1876.000 | 43.320 | 423300.0 | -1.619000 | 1.619000 |
| Station 25 | 1287.000 | 35.870 | 163000.0 | 0.186000 | -0.186000 |
| Station 26 | 13730.000 | 117.200 | 874300.0 | 0.396100 | -0.396100 |
| Station 27 | 54.800 | 7.403 | 27240.0 | -0.881000 | 0.881000 |
| Station 28 | 8.375 | 2.894 | 8091.0 | -0.016910 | 0.016910 |
| Station 29 | 41.190 | 6.418 | 14870.0 | -1.577000 | 1.577000 |
| Station 30 | 17410.000 | 131.900 | 943500.0 | 0.332200 | -0.332200 |
| Station 31 | 19.850 | 4.456 | 19570.0 | 0.365600 | -0.365600 |
| Station 32 | 89.690 | 9.471 | 36810.0 | -0.009723 | 0.009723 |
| Station 33 | 166.600 | 12.910 | 15320.0 | 0.215400 | -0.215400 |
| Station 34 | 170.600 | 13.060 | 63130.0 | -0.204100 | 0.204100 |
| Station 35 | 20190.000 | 142.100 | 994400.0 | 0.369400 | -0.369400 |
| Station 36 | 36.270 | 6.023 | 20120.0 | -0.252500 | 0.252500 |
| Station 37 | 21630.000 | 147.100 | 994500.0 | 0.191100 | -0.191100 |
| Station 38 | 68600.000 | 261.900 | 2110000.0 | 0.162100 | -0.162100 |
| Station 39 | 2450.000 | 49.500 | 194800.0 | -5.021000 | 5.021000 |
| Station 40 | 139600.000 | 373.600 | 2793000.0 | -0.110300 | 0.110300 |
We are also able to save these metrics as text files and csv files by specifying the format parameter and even the out parameter to specify a name to save it as.
[18]:
metrics.calculate_all_metrics(observed=DATAFRAMES['DF_OBSERVED'], simulated=DATAFRAMES['DF_SIMULATED'],
# format='txt', out='metrics'
)
[18]:
| MSE | RMSE | MAE | NSE | NegNSE | LogNSE | NegLogNSE | KGE | NegKGE | KGE 2012 | BIAS | AbsBIAS | TTP_obs | TTCoM_obs | SPOD_obs | TTP_sim_model1 | TTCoM_sim_model1 | SPOD_sim_model1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| model1 | model1 | model1 | model1 | model1 | model1 | model1 | model1 | model1 | model1 | model1 | model1 | ttp | ttcom | SPOD | ttp | ttcom | SPOD | |
| Station 1 | 1304.000 | 36.110 | 210400.0 | 0.515000 | -0.515000 | -0.29320 | 0.29320 | 0.50170 | -0.50170 | 0.556500 | -34.7500 | 34.7500 | 157.0 | 0.0 | 109.0 | 170.0 | 184.0 | 127.0 |
| Station 2 | 801.200 | 28.310 | 29700.0 | -1.746000 | 1.746000 | -0.19990 | 0.19990 | -0.11880 | 0.11880 | 0.059540 | 10.6600 | 10.6600 | 157.0 | 0.0 | 73.4 | 177.0 | 166.0 | 116.0 |
| Station 3 | 17.440 | 4.177 | 15570.0 | -2.021000 | 2.021000 | -0.03280 | 0.03280 | -0.02808 | 0.02808 | -0.232300 | -14.5900 | 14.5900 | 158.0 | 0.0 | 96.7 | 176.0 | 188.0 | 126.0 |
| Station 4 | 5539.000 | 74.420 | 492800.0 | 0.616500 | -0.616500 | 0.12760 | -0.12760 | 0.78110 | -0.78110 | 0.756200 | 9.7750 | 9.7750 | 159.0 | 178.0 | 114.0 | 168.0 | 182.0 | 119.0 |
| Station 5 | 4951.000 | 70.360 | 450700.0 | 0.658800 | -0.658800 | 0.16830 | -0.16830 | 0.82350 | -0.82350 | 0.823000 | 0.3038 | 0.3038 | 160.0 | 0.0 | 113.0 | 171.0 | 182.0 | 121.0 |
| Station 6 | 14250.000 | 119.400 | 941100.0 | 0.658800 | -0.658800 | -0.16750 | 0.16750 | 0.80610 | -0.80610 | 0.746500 | -8.0200 | 8.0200 | 172.0 | 178.0 | 114.0 | 175.0 | 183.0 | 124.0 |
| Station 7 | 85.480 | 9.246 | 50290.0 | 0.366200 | -0.366200 | -0.47860 | 0.47860 | 0.59930 | -0.59930 | 0.320900 | -20.2900 | 20.2900 | 175.0 | 0.0 | 142.0 | 166.0 | 190.0 | 139.0 |
| Station 8 | 577.500 | 24.030 | 228500.0 | 0.663000 | -0.663000 | -1.66000 | 1.66000 | 0.58330 | -0.58330 | 0.365600 | -39.0200 | 39.0200 | 166.0 | 194.0 | 136.0 | 156.0 | 183.0 | 126.0 |
| Station 9 | 1838.000 | 42.870 | 467100.0 | 0.331100 | -0.331100 | -1.87100 | 1.87100 | 0.58140 | -0.58140 | 0.111200 | -35.3200 | 35.3200 | 165.0 | 186.0 | 137.0 | 156.0 | 180.0 | 125.0 |
| Station 10 | 45.260 | 6.728 | 58020.0 | -0.392200 | 0.392200 | 0.03629 | -0.03629 | 0.09846 | -0.09846 | 0.108600 | -48.4300 | 48.4300 | 173.0 | 172.0 | 297.0 | 170.0 | 158.0 | 297.0 |
| Station 11 | 87.610 | 9.360 | 50720.0 | -2.092000 | 2.092000 | -24.23000 | 24.23000 | -0.20680 | 0.20680 | -0.175000 | 1.6260 | 1.6260 | 189.0 | 0.0 | 169.0 | 179.0 | 175.0 | 114.0 |
| Station 12 | 1898.000 | 43.570 | 463000.0 | 0.463900 | -0.463900 | -2.01400 | 2.01400 | 0.61750 | -0.61750 | 0.207600 | -33.7400 | 33.7400 | 169.0 | 186.0 | 138.0 | 162.0 | 185.0 | 134.0 |
| Station 13 | 535.500 | 23.140 | 134400.0 | 0.703700 | -0.703700 | -1.09600 | 1.09600 | 0.71600 | -0.71600 | 0.570600 | -24.5700 | 24.5700 | 164.0 | 177.0 | 118.0 | 171.0 | 169.0 | 109.0 |
| Station 14 | 4722.000 | 68.720 | 355200.0 | 0.690500 | -0.690500 | -0.11540 | 0.11540 | 0.76860 | -0.76860 | 0.694600 | -6.6710 | 6.6710 | 169.0 | 0.0 | 54.5 | 171.0 | 181.0 | 123.0 |
| Station 15 | 6484.000 | 80.530 | 415100.0 | 0.579000 | -0.579000 | 0.03147 | -0.03147 | 0.70680 | -0.70680 | 0.764700 | 17.3900 | 17.3900 | 167.0 | 0.0 | 89.1 | 168.0 | 182.0 | 126.0 |
| Station 16 | 4763.000 | 69.010 | 584800.0 | 0.514400 | -0.514400 | -0.76310 | 0.76310 | 0.69220 | -0.69220 | 0.539700 | -13.5300 | 13.5300 | 167.0 | 177.0 | 157.0 | 175.0 | 181.0 | 132.0 |
| Station 17 | 621.800 | 24.940 | 151100.0 | 0.401900 | -0.401900 | -0.01762 | 0.01762 | 0.51780 | -0.51780 | 0.652300 | 11.5000 | 11.5000 | 171.0 | 194.0 | 135.0 | 170.0 | 187.0 | 128.0 |
| Station 18 | 125.100 | 11.190 | 51360.0 | -0.175000 | 0.175000 | -1.82600 | 1.82600 | 0.36490 | -0.36490 | -0.263600 | -38.0200 | 38.0200 | 163.0 | 0.0 | 102.0 | 190.0 | 175.0 | 124.0 |
| Station 19 | 1415.000 | 37.610 | 241900.0 | 0.588000 | -0.588000 | -0.02795 | 0.02795 | 0.75520 | -0.75520 | 0.649100 | -12.2800 | 12.2800 | 169.0 | 182.0 | 114.0 | 187.0 | 190.0 | 144.0 |
| Station 20 | 2282.000 | 47.770 | 290000.0 | 0.482900 | -0.482900 | 0.05579 | -0.05579 | 0.69010 | -0.69010 | 0.636600 | -17.6700 | 17.6700 | 159.0 | 177.0 | 105.0 | 184.0 | 190.0 | 146.0 |
| Station 21 | 3487.000 | 59.050 | 346600.0 | 0.329100 | -0.329100 | 0.21040 | -0.21040 | 0.64740 | -0.64740 | 0.571400 | -15.9200 | 15.9200 | 156.0 | 180.0 | 110.0 | 187.0 | 192.0 | 145.0 |
| Station 22 | 798.200 | 28.250 | 156500.0 | -0.931100 | 0.931100 | -1.47800 | 1.47800 | -0.01263 | 0.01263 | 0.170600 | 10.7300 | 10.7300 | 184.0 | 195.0 | 140.0 | 174.0 | 187.0 | 122.0 |
| Station 23 | 11150.000 | 105.600 | 468600.0 | -0.763800 | 0.763800 | -1.82200 | 1.82200 | 0.08817 | -0.08817 | -0.084050 | -8.7560 | 8.7560 | 178.0 | 0.0 | 49.4 | 173.0 | 193.0 | 119.0 |
| Station 24 | 1876.000 | 43.320 | 423300.0 | -1.619000 | 1.619000 | -7.55300 | 7.55300 | 0.03350 | -0.03350 | 0.009723 | -36.1700 | 36.1700 | 179.0 | 184.0 | 144.0 | 214.0 | 205.0 | 199.0 |
| Station 25 | 1287.000 | 35.870 | 163000.0 | 0.186000 | -0.186000 | -0.83130 | 0.83130 | 0.43390 | -0.43390 | 0.208900 | -13.4700 | 13.4700 | 184.0 | 0.0 | NaN | 176.0 | 189.0 | 136.0 |
| Station 26 | 13730.000 | 117.200 | 874300.0 | 0.396100 | -0.396100 | -0.99350 | 0.99350 | 0.60640 | -0.60640 | 0.414800 | -14.1300 | 14.1300 | 174.0 | 183.0 | 108.0 | 184.0 | 190.0 | 120.0 |
| Station 27 | 54.800 | 7.403 | 27240.0 | -0.881000 | 0.881000 | -0.51630 | 0.51630 | 0.23640 | -0.23640 | -0.066640 | -23.3200 | 23.3200 | 119.0 | 0.0 | 48.6 | 149.0 | 152.0 | 108.0 |
| Station 28 | 8.375 | 2.894 | 8091.0 | -0.016910 | 0.016910 | -0.06095 | 0.06095 | 0.50080 | -0.50080 | 0.511100 | 18.7200 | 18.7200 | 115.0 | 0.0 | 60.1 | 148.0 | 147.0 | 107.0 |
| Station 29 | 41.190 | 6.418 | 14870.0 | -1.577000 | 1.577000 | 0.03787 | -0.03787 | 0.07385 | -0.07385 | 0.012960 | -4.6580 | 4.6580 | 121.0 | 0.0 | 37.2 | 155.0 | 161.0 | 105.0 |
| Station 30 | 17410.000 | 131.900 | 943500.0 | 0.332200 | -0.332200 | -0.38420 | 0.38420 | 0.62840 | -0.62840 | 0.452700 | -14.9400 | 14.9400 | 172.0 | 0.0 | 104.0 | 186.0 | 189.0 | 116.0 |
| Station 31 | 19.850 | 4.456 | 19570.0 | 0.365600 | -0.365600 | -2.06700 | 2.06700 | 0.20520 | -0.20520 | 0.269300 | -56.1900 | 56.1900 | 128.0 | 0.0 | 97.8 | 141.0 | 155.0 | 112.0 |
| Station 32 | 89.690 | 9.471 | 36810.0 | -0.009723 | 0.009723 | -0.07810 | 0.07810 | 0.21400 | -0.21400 | -0.085330 | -53.9500 | 53.9500 | 123.0 | 0.0 | 44.1 | 143.0 | 160.0 | 108.0 |
| Station 33 | 166.600 | 12.910 | 15320.0 | 0.215400 | -0.215400 | 0.12600 | -0.12600 | 0.23620 | -0.23620 | 0.001935 | -57.1200 | 57.1200 | 134.0 | 0.0 | 38.1 | 154.0 | 167.0 | 113.0 |
| Station 34 | 170.600 | 13.060 | 63130.0 | -0.204100 | 0.204100 | 0.40760 | -0.40760 | 0.42820 | -0.42820 | 0.242400 | -23.1600 | 23.1600 | 123.0 | 157.0 | 88.7 | 171.0 | 169.0 | 107.0 |
| Station 35 | 20190.000 | 142.100 | 994400.0 | 0.369400 | -0.369400 | 0.19540 | -0.19540 | 0.64150 | -0.64150 | 0.525000 | -10.0600 | 10.0600 | 158.0 | 181.0 | 97.5 | 177.0 | 187.0 | 115.0 |
| Station 36 | 36.270 | 6.023 | 20120.0 | -0.252500 | 0.252500 | -9.34200 | 9.34200 | -0.16920 | 0.16920 | -0.185300 | -60.6800 | 60.6800 | 111.0 | 0.0 | 85.3 | 170.0 | 171.0 | 126.0 |
| Station 37 | 21630.000 | 147.100 | 994500.0 | 0.191100 | -0.191100 | 0.36230 | -0.36230 | 0.61540 | -0.61540 | 0.610100 | -2.5050 | 2.5050 | 150.0 | 0.0 | 223.0 | 172.0 | 190.0 | 205.0 |
| Station 38 | 68600.000 | 261.900 | 2110000.0 | 0.162100 | -0.162100 | 0.22310 | -0.22310 | 0.60540 | -0.60540 | 0.615200 | 1.3850 | 1.3850 | 152.0 | 173.0 | 108.0 | 178.0 | 187.0 | 135.0 |
| Station 39 | 2450.000 | 49.500 | 194800.0 | -5.021000 | 5.021000 | -0.67950 | 0.67950 | -0.81910 | 0.81910 | -0.080510 | 56.7800 | 56.7800 | 161.0 | 0.0 | 95.5 | 147.0 | 156.0 | 103.0 |
| Station 40 | 139600.000 | 373.600 | 2793000.0 | -0.110300 | 0.110300 | 0.26580 | -0.26580 | 0.46120 | -0.46120 | 0.393800 | -5.4300 | 5.4300 | 139.0 | 0.0 | 99.3 | 155.0 | 183.0 | 110.0 |
[ ]: