Background

We are using WRF-Hydro to predict streamflow for multiple basins in the Upper Rio Grande for 2004-2014. We ran WRF-Hydro in LSM-only mode (no routing) with NoahMP as the LSM for the 10-year period with daily output. We want to evaluate model performance at various gage stations in the domain.

Setup

Load the rwrfhydro package.

library("rwrfhydro")
## To check rwrfhydro updates (to master branch) run: CheckForUpdates()

Set the data paths for the Upper Rio Grande.

# Where streamflow obs files live
obsPath <- '~/wrfHydroTestCases/Upper_RioGrande/OBS/STRFLOW'
# Where model output files live
outPath <- '~/wrfHydroTestCases/Upper_RioGrande/OUTPUT_WY2014'
# Where basin mask files live
mskPath <- '~/wrfHydroTestCases/Upper_RioGrande/DOMAIN/MASKS'
# Where to put plot files
plotPath <- '~/wrfHydroTestCases/Upper_RioGrande/ANALYSIS'

If you want to use R’s multi-core capability (make sure doMC is installed) specify the number of cores.

library(doMC)
## Warning: package 'doMC' was built under R version 3.1.2
## Loading required package: foreach
## Warning: package 'foreach' was built under R version 3.1.2
## 
## Attaching package: 'foreach'
## 
## The following object is masked from 'package:chron':
## 
##     times
## 
## Loading required package: iterators
## Warning: package 'iterators' was built under R version 3.1.2
## Loading required package: parallel
registerDoMC(8)

Create a lookup list to match basin mask ID to gage ID.

idList <- list("alamosa_1k"="ALATERCO", 
               "conejos_1k"="CONMOGCO", 
               "s_frk_1k"="RIOSFKCO", 
               "rio_wagw_1k"="RIOWAGCO", 
               "saguache_1k"="SAGSAGCO", 
               "trinchera_1k"="TRITURCO")

Import observed datasets

Import all gage data from data files we downloaded from the CO DWR website. First, we build a file list.

obsList <- list.files(obsPath, pattern=glob2rx("*.txt"))

Then, we loop through the files and built a single dataframe with all the gage data. We use the ReadCoDwrGage tool to import the individual gage files.

obsStr <- data.frame()
for (i in 1:length(obsList)) {
  tmp <- ReadCoDwrGage(paste0(obsPath, "/", obsList[i]))
  obsStr <- plyr::rbind.fill(obsStr,tmp)
}

To view the first few lines of our observed dataframe:

head(obsStr)
Station datetime AIRTEMP DISCHRG GAGE_HT q_cms q_cfs ht_m ht_ft POSIXct wy PRECIP WATTEMP
ALATERCO 2004-01-01 00:00 14.1 0 0.04 0 0 0.012192 0.04 2004-01-01 00:00:00 2004 NA NA
ALATERCO 2004-01-01 00:15 13.3 0 0.04 0 0 0.012192 0.04 2004-01-01 00:15:00 2004 NA NA
ALATERCO 2004-01-01 00:30 12.3 0 0.04 0 0 0.012192 0.04 2004-01-01 00:30:00 2004 NA NA
ALATERCO 2004-01-01 00:45 12.0 0 0.04 0 0 0.012192 0.04 2004-01-01 00:45:00 2004 NA NA
ALATERCO 2004-01-01 01:00 11.2 0 0.04 0 0 0.012192 0.04 2004-01-01 01:00:00 2004 NA NA
ALATERCO 2004-01-01 01:15 11.2 0 0.04 0 0 0.012192 0.04 2004-01-01 01:15:00 2004 NA NA

Until we can automate this from the data download side, we will have to manually set the gage drainage areas. We will set it up as an attribute to the observation dataframe.

attr(obsStr, "area_sqmi") <- c(ALATERCO=107, CONMOGCO=282, RIOSFKCO=216, 
                               RIOWAGCO=780, SAGSAGCO=595, TRITURCO=45)
attr(obsStr, "gage_name") <- c(ALATERCO="ALAMOSA RIVER ABOVE TERRACE RESERVOIR",
                               CONMOGCO="CONEJOS RIVER NEAR MOGOTE",
                               RIOSFKCO="SOUTH FORK RIO GRANDE RIVER AT SOUTH FORK",
                               RIOWAGCO="RIO GRANDE RIVER AT WAGON WHEEL GAP",
                               SAGSAGCO="SAGUACHE CREEK NEAR SAGUACHE",
                               TRITURCO="TRINCHERA CREEK ABOVE TURNER'S RANCH")

To access this attribute:

attributes(obsStr)$area_sqmi
## ALATERCO CONMOGCO RIOSFKCO RIOWAGCO SAGSAGCO TRITURCO 
##      107      282      216      780      595       45

We can double-check to make sure we have all of the gages we expect.

unique(obsStr$Station)
## [1] "ALATERCO" "CONMOGCO" "RIOSFKCO" "RIOWAGCO" "SAGSAGCO" "TRITURCO"

And we can plot hydrographs for the gages for WY 2014.

library(ggplot2)
ggplot(subset(obsStr, obsStr$wy==2014), aes(x=POSIXct, y=q_cms, color=Station)) + geom_line() + ylim(0,100)

Import model results

We loop through the predefined basin masks and use ReadLdasoutWb to calculate the basin-averaged water budget components. Since we have already resampled the high-res basins to the low-res geogrid and set each mask value to 1, we set basid to 1 and aggfact to 1 (no aggregation). We will also grab the basin area for each mask (as a cell count) and track it as an attribute to the output dataframe.

mskList <- list.files(mskPath, pattern=glob2rx("*.nc"))
modLdasout <- data.frame()
tmparea<-data.frame(matrix(nrow=1,ncol=0))
for (i in 1:length(mskList)) {
  tmp <- ReadLdasoutWb(outPath, paste0(mskPath, "/", mskList[i]), 
                       mskvar="basn_msk", basid=1, aggfact=1, ncores=8)
  tmp$Station <- idList[[unlist(strsplit(mskList[i], "[.]"))[1]]]
  modLdasout <- rbind(modLdasout, tmp)
  tmparea[,idList[[unlist(strsplit(mskList[i], "[.]"))[1]]]] <- attributes(tmp)$area_cellcnt
  rm(tmp)
}
attr(modLdasout, "area_cellcnt") <- tmparea
rm(tmparea)

To view the first few lines of our model output dataframe:

head(modLdasout)
POSIXct stat ACCECAN ACCEDIR ACCETRAN ACCPRCP CANICE CANLIQ SFCRNOFF SNEQV UGDRNOFF SOIL_M1 SOIL_M2 SOIL_M3 SOIL_M4 wy DEL_ACCPRCP DEL_ACCECAN DEL_ACCETRAN DEL_ACCEDIR DEL_UGDRNOFF DEL_SFCRNOFF Station
2013-10-01 basin_avg 372.4899 2116.062 825.7927 8021.332 3e-07 0 921.0609 0.2622312 3711.065 0.2868747 0.2921334 0.2920949 0.2869370 2014 NA NA NA NA NA NA ALATERCO
2013-10-02 basin_avg 372.4899 2116.803 826.0614 8021.332 4e-07 0 921.0869 0.0000000 3712.331 0.2822108 0.2881350 0.2908228 0.2873262 2014 0 -0.0000480 0.2686473 0.7414562 1.266545 0.0260495 ALATERCO
2013-10-03 basin_avg 372.4898 2117.656 826.2880 8021.332 6e-07 0 921.0869 0.0000000 3713.607 0.2776304 0.2845793 0.2892009 0.2874697 2014 0 -0.0001115 0.2266649 0.8525837 1.275594 0.0000000 ALATERCO
2013-10-04 basin_avg 372.4895 2118.470 826.4867 8021.332 6e-07 0 921.0869 0.0000000 3714.873 0.2745260 0.2817819 0.2874777 0.2873737 2014 0 -0.0002385 0.1986668 0.8146601 1.266644 0.0000000 ALATERCO
2013-10-05 basin_avg 372.4895 2119.245 826.5613 8021.332 0e+00 0 921.0869 0.0000000 3716.115 0.2727172 0.2794113 0.2859211 0.2871096 2014 0 -0.0000002 0.0746508 0.7745129 1.241436 0.0000000 ALATERCO
2013-10-06 basin_avg 372.4895 2119.473 826.6407 8021.332 0e+00 0 921.0869 0.0000000 3717.322 0.2739248 0.2780929 0.2845067 0.2867192 2014 0 0.0000000 0.0794051 0.2277344 1.207140 0.0000000 ALATERCO

And to view the basin area attribute:

attributes(modLdasout)$area_cellcnt
ALATERCO CONMOGCO RIOWAGCO RIOSFKCO SAGSAGCO TRITURCO
279 729 1973 540 1330 136

This model output gives us accumulated mm and mm per time step. We need to calcuate flowrates in cms. The ReadLdasoutWb returns the basin area as a (geogrid) cell count, and since we know the cellsize to be 1km, we can calculate flowrate as a volume.

basList <- unique(modLdasout$Station)
modLdasout$q_cms <- NA
for (i in 1:length(basList)) {
  basarea <- attributes(modLdasout)$area_cellcnt[[basList[i]]]
  timestep <- as.integer(difftime(modLdasout$POSIXct[2], modLdasout$POSIXct[1], units="secs"))
  # Conversion: 1000 = mm * km^2 to m^3
  modLdasout$q_cms[modLdasout$Station==basList[i]] <- 
                                with(subset(modLdasout, modLdasout$Station==basList[i]), 
                                (DEL_SFCRNOFF+DEL_UGDRNOFF) * basarea / timestep * 1000)           
  rm(basarea, timestep)
}

Conversion to daily volume in acre-ft.

modLdasout$qvol_acft <- modLdasout$q_cms * 86400 * 0.3048^3 / 43560

Calculate cumulative volume for each water year.

wyList <- unique(modLdasout$wy)
basList <- unique(modLdasout$Station)
modLdasout$cumqvol_acft <- 0
for (i in 1:length(basList)) {
  tmpgage <- subset(modLdasout, modLdasout$Station==basList[i])
  for (j in 1:length(wyList)) {
    tmpgagewy <- subset(tmpgage, tmpgage$wy==wyList[j])
    modLdasout$cumqvol_acft[modLdasout$Station==basList[i] & 
                              modLdasout$wy==wyList[j]] <- CumsumNa(tmpgagewy$qvol_acft)
    rm(tmpgagewy)
  }
  rm(tmpgage)
}

Plot hydrographs

Compare hydrographs for a single basin.

stnid <- "ALATERCO"
PlotFluxCompare(subset(obsStr, obsStr$Station==stnid), "q_cms", 
                subset(modLdasout, modLdasout$Station==stnid), "q_cms", 
                labelObs=paste0("Observed at ", stnid), labelMod1="Model", 
                title=paste0("Streamflow: ", attributes(obsStr)$gage_name[[stnid]]))

Or create a loop to output PNGs for each basin.

for (i in 1:length(basList)) {
  png(paste0(plotPath, "/hydro_wy2014_", basList[i], ".png"), width = 700, height = 350)
  PlotFluxCompare(subset(obsStr, obsStr$Station==basList[i]), "q_cms", 
                  subset(modLdasout, modLdasout$Station==basList[i]), "q_cms", 
                  labelObs=paste0("Observed at ", basList[i]), labelMod1="Model", 
                  title=paste0("Streamflow: ", attributes(obsStr)$gage_name[[basList[i]]]))
  dev.off()
}

Calculate daily and cumulative daily observation fluxes

We can aggregate the observed data to a daily timestep to match the model.

obsStr$date <- as.Date(trunc(as.POSIXct(format(obsStr$POSIXct, tz="UTC"), tz="UTC"), "days"))
obsStr.dy <- plyr::ddply(obsStr, plyr::.(Station, date), 
                         plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE), 
                         .parallel=TRUE)
# Unit conversion: m^3/s -> m^3/dy -> ft^3/dy -> ac-ft/dy
obsStr.dy$qvol_acft <- obsStr.dy$mean_qcms * 86400 * 0.3048^3 / 43560

Let’s add a POSIXct column for ease of calculations and plotting. We’ll associate daily values with the NEXT day’s 00:00 to match the model output.

obsStr.dy$POSIXct <- as.POSIXct(paste0(obsStr.dy$date+1," 00:00", 
                                       format="%Y-%m-%d %H:%M", tz="UTC"))

And we can calculate a cumulative volume for each water year

obsStr.dy$wy <- CalcWaterYear(obsStr.dy$POSIXct)
wyList <- unique(obsStr.dy$wy)
gageList <- unique(obsStr.dy$Station)
obsStr.dy$cumqvol_acft <- 0
for (i in 1:length(gageList)) {
  tmpgage <- subset(obsStr.dy, obsStr.dy$Station==gageList[i])
  for (j in 1:length(wyList)) {
    tmpgagewy <- subset(tmpgage, tmpgage$wy==wyList[j])
    obsStr.dy$cumqvol_acft[obsStr.dy$Station==gageList[i] & 
                             obsStr.dy$wy==wyList[j]] <- CumsumNa(tmpgagewy$qvol_acft)
    rm(tmpgagewy)
  }
  rm(tmpgage)
}

Plot cumulative flow volumes by year in acre-ft

Plot all observed cumulative flows for the 2014 water year

n<-2014
ggplot(subset(obsStr.dy, obsStr.dy$wy==n), aes(x=POSIXct, y=cumqvol_acft, color=Station)) + geom_line()

And plot modelled.

ggplot(subset(modLdasout, modLdasout$wy==n), aes(x=POSIXct, y=cumqvol_acft, color=Station)) + geom_line()

Compare cumulative flow plots for all water years for a specific station

stnid <- "CONMOGCO"
ggplot(NULL, aes(x=POSIXct, y=cumqvol_acft)) + 
  geom_line(data=subset(modLdasout, modLdasout$Station==stnid), aes(color='Model')) + 
  geom_line(data=subset(obsStr.dy, obsStr.dy$Station==stnid & obsStr.dy$wy %in% unique(modLdasout$wy)), 
            aes(color='Observed')) + 
  scale_colour_discrete("")

Let’s create a function to plot by station and water year.

PlotCumFlow <- function(stnid, wyid) {
  gg <- ggplot(NULL, aes(x=POSIXct, y=cumqvol_acft)) +
    geom_line(data=subset(modLdasout, modLdasout$Station==stnid & modLdasout$wy==wyid), aes(color='Model')) +
    geom_line(data=subset(obsStr.dy, obsStr.dy$Station==stnid & obsStr.dy$wy==wyid), aes(color='Observed')) +
    scale_colour_discrete("") +
    labs(x="Date", y="Cumulative Flow Volume (acre-ft)") +
    ggtitle(paste0("Cumulative Flow Volume: ", stnid, "\nWY ", wyid)) +
    theme(plot.title = element_text(face="bold", vjust=1))
  return(gg)
}

Output PNGs for every station and water year

basList <- unique(modLdasout$Station)
wyList <- unique(modLdasout$wy)
for (i in 1:length(basList)) {
  for (j in 1:length(wyList)) {
    gg <- PlotCumFlow(basList[i], wyList[j])
    ggsave(filename=paste0(plotPath, "/cumvol_wy", wyList[j],"_", basList[i], ".png"), plot=gg,
           units="in", width=6, height=4, dpi=200)
    }
  }

Run monthly aggregations

We can aggregate the observed data to a monthly timestep in acre-ft.

obsStr$mo <- as.integer(format(obsStr$POSIXct, "%m", tz="UTC"))
obsStr$yr <- as.integer(format(obsStr$POSIXct, "%Y", tz="UTC"))
obsStr.mo <- plyr::ddply(obsStr, plyr::.(Station, yr, mo), 
                         plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE), 
                         .parallel=TRUE)
# Unit conversion: m^3/s -> m^3/mo -> ft^3/mo -> ac-ft/mo
obsStr.mo$qvol_acft <- obsStr.mo$mean_qcms * 86400 *
  CalcMonthDays(obsStr.mo$mo, obsStr.mo$yr) /
  0.3048^3 / 43560

Which yields a new dataframe of monthly values:

head(obsStr.mo)
Station yr mo mean_qcms qvol_acft
ALATERCO 2004 1 0.0000000 0.000
ALATERCO 2004 2 0.0000000 0.000
ALATERCO 2004 3 0.7099602 1541.618
ALATERCO 2004 4 2.5315292 5319.676
ALATERCO 2004 5 12.5035053 27150.289
ALATERCO 2004 6 8.5606842 17989.153

Let’s add a POSIXct column and a water year column for ease of plotting. We’ll associate monthly vaues with the 1st day of each month for plotting.

obsStr.mo$POSIXct <- as.POSIXct(paste0(obsStr.mo$yr,"-",obsStr.mo$mo,"-01", 
                                       format="%Y-%m-%d", tz="UTC"))
obsStr.mo$wy <- CalcWaterYear(obsStr.mo$POSIXct)

Also aggregate the model output to a monthly timestep in acre-ft.

modLdasout$mo <- as.integer(format(modLdasout$POSIXct, "%m"))
modLdasout$yr <- as.integer(format(modLdasout$POSIXct, "%Y"))
modLdasout.mo <- plyr::ddply(modLdasout, plyr::.(Station, yr, mo), 
                             plyr::summarise, mean_qcms=mean(q_cms, na.rm=TRUE),
                             .parallel=TRUE)
# Unit conversion: m^3/s -> m^3/mo -> ft^3/mo -> ac-ft/mo
modLdasout.mo$qvol_acft <- modLdasout.mo$mean_qcms * 86400 * 
  CalcMonthDays(modLdasout.mo$mo, modLdasout.mo$yr) / 
  0.3048^3 / 43560

Which yields a new dataframe of monthly values:

head(modLdasout.mo)
Station yr mo mean_qcms qvol_acft
ALATERCO 2013 10 3.534417 7674.682
ALATERCO 2013 11 2.819171 5924.117
ALATERCO 2013 12 1.946540 4226.745
ALATERCO 2014 1 1.315127 2855.686
ALATERCO 2014 2 1.256151 2463.661
ALATERCO 2014 3 3.547275 7702.603

Again, add POSIXct and water year columns column for ease of plotting, associating monthly vaues with the 1st day of each month.

modLdasout.mo$POSIXct <- as.POSIXct(paste0(modLdasout.mo$yr,"-",modLdasout.mo$mo,"-01", 
                                           format="%Y-%m-%d", tz="UTC"))
modLdasout.mo$wy <- CalcWaterYear(modLdasout.mo$POSIXct)

Plot monthly flow volumes

Now we can plot comparisons. We’ll create a simple function to automate this for a specified station.

PlotMoVolBasin <- function(stnid) {
  gg <- ggplot(NULL, aes(x=POSIXct, y=qvol_acft)) + 
            geom_line(data=subset(modLdasout.mo, modLdasout.mo$Station==stnid), aes(color='Model')) + 
            geom_line(data=subset(obsStr.mo, obsStr.mo$Station==stnid & 
                                    obsStr.mo$POSIXct>=min(modLdasout.mo$POSIXct) & 
                                    obsStr.mo$POSIXct<=max(modLdasout.mo$POSIXct)), 
                      aes(color='Observed')) + 
            scale_colour_discrete("") + 
            labs(x="Date", y="Monthly Flow Volume (acre-ft)") +
            ggtitle(paste0("Monthly Flow Volume: ", stnid)) +
            theme(plot.title = element_text(face="bold", vjust=1))
  return(gg)
}

Then we can plot to graphic:

PlotMoVolBasin("ALATERCO")

Or plot to PNG file in batch:

for (i in 1:length(basList)) {
  gg <- PlotMoVolBasin(basList[i])
  ggsave(filename=paste0(plotPath, "/qvol_wy2014_", basList[i], ".png"), plot=gg,
           units="in", width=6, height=4, dpi=200)
}

Or plot by water year for all basins in one image:

PlotMoVolWY <- function(wyid) {
  gg <- ggplot(NULL, aes(x=POSIXct, y=qvol_acft)) +
           geom_line(data=subset(modLdasout.mo, modLdasout.mo$wy==wyid), aes(color='Model')) +
           geom_line(data=subset(obsStr.mo, obsStr.mo$wy==wyid), aes(color='Observed')) +
           facet_wrap(~Station) +
           scale_colour_discrete("") + 
           labs(x="Date", y="Monthly Flow Volume (acre-ft)") +
           ggtitle(paste0("Monthly Flow Volume: WY ", wyid)) +
           theme(plot.title = element_text(face="bold", vjust=1))
  return(gg)
  }
PlotMoVolWY(2014)

Generate summary statistics

We use the CalModPerfMulti tool to generate statistics for each gage, then we stack the gage stat rows into a dataframe.

perfStats <- data.frame()
for (i in 1:length(basList)) {
    out <- CalcModPerfMulti( subset(modLdasout, modLdasout$Station==basList[i]), 
                            subset(obsStr, obsStr$Station==basList[i]) )
    out$Station <- basList[i]
  perfStats <- rbind(perfStats, out)
  }
## Warning in cor(flxDf.mod.min10$qcomp.mod, flxDf.mod.min10$qcomp.obs, use = "na.or.complete"): the standard deviation is zero
## Warning in cor(flxDf.mod.min10$qcomp.mod, flxDf.mod.min10$qcomp.obs, use = "na.or.complete"): the standard deviation is zero
perfStats
## Warning: package 'pander' was built under R version 3.1.2
(continued below)
t_n t_nse t_nselog t_cor t_rmse t_rmsenorm
364 0.34 -0.31 0.69 2.93 15.11
363 0.01 -0.43 0.37 8.21 14.98
364 0.13 -0.31 0.81 18.48 21.03
364 -0.2 -0.47 0.78 8.3 20.08
364 -15.77 -3.03 0.04 7.06 91.36
364 -42.57 -3.28 0.71 2.73 126.1
Table continues below
t_bias t_mae t_errfdc dy_n dy_nse dy_nselog
54.9 2.27 1.32 364 0.34 -0.31
-2.8 5.66 0.23 363 0.01 -0.43
80.6 14.05 11.3 364 0.13 -0.31
97.2 5.96 4.13 364 -0.2 -0.47
142.5 4.51 3.14 364 -15.77 -3.03
477.2 1.78 1.34 364 -42.57 -3.28
Table continues below
dy_cor dy_rmse dy_rmsenorm dy_bias dy_mae
0.69 2.93 15.11 54.9 2.27
0.37 8.21 14.98 -2.8 5.66
0.81 18.48 21.03 80.6 14.05
0.78 8.3 20.08 97.2 5.96
0.04 7.06 91.36 142.5 4.51
0.71 2.73 126.1 477.2 1.78
Table continues below
dy_errcom dy_errmaxt dy_errfdc mo_n mo_nse
0 0 1.32 12 0.27
0 0 0.23 12 -0.06
0 0 11.3 12 0.11
0 0 4.13 12 -0.34
0 0 3.14 12 -18.63
0 0 1.34 12 -44.56
Table continues below
mo_nselog mo_cor mo_rmse mo_rmsenorm mo_bias
-0.19 0.7 2.54 29.85 55.3
-0.24 0.38 6.92 34.49 -2.2
-0.23 0.83 16.73 29.49 80.9
-0.32 0.83 7.22 37.77 97.2
-3.65 0.02 6.31 149.3 142.7
-3.82 0.7 2.4 192.3 475.2
Table continues below
mo_mae mo_errcom mo_errmaxt yr_n yr_bias yr_mae
1.93 -0.42 3.58 1 54.9 1.23
5.23 0 7.67 1 -2.8 0.2
13.34 -0.58 5.17 1 80.6 12.49
5.81 -0.22 8.42 1 97.2 4.84
4.22 0.83 1.67 1 142.5 3.9
1.77 -0.42 0.42 1 477.2 1.78
Table continues below
yr_errcom yr_errmaxt max10_n max10_nse max10_nselog
-38 -34 36 -0.66 -1.73
-44 -34 37 -3.91 -12.36
-32 -35 37 0.16 0.14
-26 -34 37 -4.35 -3.73
3 112 37 -9.96 -14.09
-8 -6 37 -184.4 -15.85
Table continues below
max10_cor max10_rmse max10_rmsenorm max10_bias
0.44 4.46 37.19 -25.8
-0.06 18.41 49.13 -53.4
0.69 12.11 28.88 5.3
-0.07 15.27 59.83 27.1
0.33 3.13 115 3
0.35 6.34 442.4 332
Table continues below
max10_mae min10_n min10_nse min10_nselog min10_cor
3.97 112 -Inf -Inf NA
16.65 37 -708.2 -76.74 0.18
8.17 115 -26719173 -89523 -0.61
13.06 120 -Inf -Inf NA
2.69 37 -4398 -121.9 -0.08
4.73 40 -3500 -139.8 -0.07
min10_rmse min10_rmsenorm min10_bias min10_mae Station
1.76 Inf 4807 1.67 ALATERCO
5.38 523.5 328.8 4.9 CONMOGCO
13.89 213209 6886 13.26 RIOWAGCO
5.25 Inf Inf 4.87 RIOSFKCO
8.99 1175 812.4 7.64 SAGSAGCO
0.57 1788 1311 0.56 TRITURCO