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
[ ]: