"""
Univariate statistic function for space time datasets
Usage:
.. code-block:: python
import grass.temporal as tgis
tgis.print_gridded_dataset_univar_statistics(type, input, output, where, extended, no_header, fs, rast_region)
..
(C) 2012-2013 by the GRASS Development Team
This program is free software under the GNU General Public
License (>=v2). Read the file COPYING that comes with GRASS
for details.
:authors: Soeren Gebbert
"""
from __future__ import print_function
from .core import SQLDatabaseInterfaceConnection, get_current_mapset
from .factory import dataset_factory
from .open_stds import open_old_stds
import grass.script as gscript
###############################################################################
[docs]def print_gridded_dataset_univar_statistics(
type, input, output, where, extended, no_header=False, fs="|", rast_region=False
):
"""Print univariate statistics for a space time raster or raster3d dataset
:param type: Must be "strds" or "str3ds"
:param input: The name of the space time dataset
:param output: Name of the optional output file, if None stdout is used
:param where: A temporal database where statement
:param extended: If True compute extended statistics
:param no_header: Suppress the printing of column names
:param fs: Field separator
:param rast_region: If set True ignore the current region settings
and use the raster map regions for univar statistical calculation.
Only available for strds.
"""
# We need a database interface
dbif = SQLDatabaseInterfaceConnection()
dbif.connect()
sp = open_old_stds(input, type, dbif)
if output is not None:
out_file = open(output, "w")
rows = sp.get_registered_maps("id,start_time,end_time", where, "start_time", dbif)
if not rows:
dbif.close()
err = "Space time %(sp)s dataset <%(i)s> is empty"
if where:
err += " or where condition is wrong"
gscript.fatal(
_(err) % {"sp": sp.get_new_map_instance(None).get_type(), "i": sp.get_id()}
)
if no_header is False:
string = ""
string += "id" + fs + "start" + fs + "end" + fs + "mean" + fs
string += "min" + fs + "max" + fs
string += "mean_of_abs" + fs + "stddev" + fs + "variance" + fs
string += "coeff_var" + fs + "sum" + fs + "null_cells" + fs + "cells"
string += fs + "non_null_cells"
if extended is True:
string += fs + "first_quartile" + fs + "median" + fs
string += "third_quartile" + fs + "percentile_90"
if output is None:
print(string)
else:
out_file.write(string + "\n")
for row in rows:
string = ""
id = row["id"]
start = row["start_time"]
end = row["end_time"]
flag = "g"
if extended is True:
flag += "e"
if type == "strds" and rast_region is True:
flag += "r"
if type == "strds":
stats = gscript.parse_command("r.univar", map=id, flags=flag)
elif type == "str3ds":
stats = gscript.parse_command("r3.univar", map=id, flags=flag)
if not stats:
if type == "strds":
gscript.warning(
_("Unable to get statistics for raster map " "<%s>") % id
)
elif type == "str3ds":
gscript.warning(
_("Unable to get statistics for 3d raster map" " <%s>") % id
)
continue
string += str(id) + fs + str(start) + fs + str(end)
string += fs + str(stats["mean"]) + fs + str(stats["min"])
string += fs + str(stats["max"]) + fs + str(stats["mean_of_abs"])
string += fs + str(stats["stddev"]) + fs + str(stats["variance"])
string += fs + str(stats["coeff_var"]) + fs + str(stats["sum"])
string += fs + str(stats["null_cells"]) + fs + str(stats["cells"])
string += fs + str(int(stats["cells"]) - int(stats["null_cells"]))
if extended is True:
string += fs + str(stats["first_quartile"]) + fs + str(stats["median"])
string += (
fs + str(stats["third_quartile"]) + fs + str(stats["percentile_90"])
)
if output is None:
print(string)
else:
out_file.write(string + "\n")
dbif.close()
if output is not None:
out_file.close()
###############################################################################
[docs]def print_vector_dataset_univar_statistics(
input, output, twhere, layer, type, column, where, extended, no_header=False, fs="|"
):
"""Print univariate statistics for a space time vector dataset
:param input: The name of the space time dataset
:param output: Name of the optional output file, if None stdout is used
:param twhere: A temporal database where statement
:param layer: The layer number used in case no layer is present
in the temporal dataset
:param type: options: point,line,boundary,centroid,area
:param column: The name of the attribute column
:param where: A temporal database where statement
:param extended: If True compute extended statistics
:param no_header: Suppress the printing of column names
:param fs: Field separator
"""
# We need a database interface
dbif = SQLDatabaseInterfaceConnection()
dbif.connect()
if output is not None:
out_file = open(output, "w")
mapset = get_current_mapset()
if input.find("@") >= 0:
id = input
else:
id = input + "@" + mapset
sp = dataset_factory("stvds", id)
if sp.is_in_db(dbif) is False:
dbif.close()
gscript.fatal(
_("Space time %(sp)s dataset <%(i)s> not found")
% {"sp": sp.get_new_map_instance(None).get_type(), "i": id}
)
sp.select(dbif)
rows = sp.get_registered_maps(
"id,name,mapset,start_time,end_time,layer", twhere, "start_time", dbif
)
if not rows:
dbif.close()
gscript.fatal(
_("Space time %(sp)s dataset <%(i)s> is empty")
% {"sp": sp.get_new_map_instance(None).get_type(), "i": id}
)
string = ""
if no_header is False:
string += (
"id"
+ fs
+ "start"
+ fs
+ "end"
+ fs
+ "n"
+ fs
+ "nmissing"
+ fs
+ "nnull"
+ fs
)
string += "min" + fs + "max" + fs + "range"
if type == "point" or type == "centroid":
string += (
fs
+ "mean"
+ fs
+ "mean_abs"
+ fs
+ "population_stddev"
+ fs
+ "population_variance"
+ fs
)
string += (
"population_coeff_variation"
+ fs
+ "sample_stddev"
+ fs
+ "sample_variance"
+ fs
)
string += "kurtosis" + fs + "skewness"
if extended is True:
string += (
fs
+ "first_quartile"
+ fs
+ "median"
+ fs
+ "third_quartile"
+ fs
+ "percentile_90"
)
if output is None:
print(string)
else:
out_file.write(string + "\n")
for row in rows:
id = row["name"] + "@" + row["mapset"]
start = row["start_time"]
end = row["end_time"]
mylayer = row["layer"]
flags = "g"
if extended is True:
flags += "e"
if not mylayer:
mylayer = layer
stats = gscript.parse_command(
"v.univar",
map=id,
where=where,
column=column,
layer=mylayer,
type=type,
flags=flags,
)
string = ""
if not stats:
gscript.warning(_("Unable to get statistics for vector map <%s>") % id)
continue
string += str(id) + fs + str(start) + fs + str(end)
string += (
fs
+ str(stats["n"])
+ fs
+ str(stats["nmissing"])
+ fs
+ str(stats["nnull"])
)
if "min" in stats:
string += (
fs
+ str(stats["min"])
+ fs
+ str(stats["max"])
+ fs
+ str(stats["range"])
)
else:
string += fs + fs + fs
if type == "point" or type == "centroid":
if "mean" in stats:
string += (
fs
+ str(stats["mean"])
+ fs
+ str(stats["mean_abs"])
+ fs
+ str(stats["population_stddev"])
+ fs
+ str(stats["population_variance"])
)
string += (
fs
+ str(stats["population_coeff_variation"])
+ fs
+ str(stats["sample_stddev"])
+ fs
+ str(stats["sample_variance"])
)
string += fs + str(stats["kurtosis"]) + fs + str(stats["skewness"])
else:
string += fs + fs + fs + fs + fs + fs + fs + fs + fs
if extended is True:
if "first_quartile" in stats:
string += (
fs
+ str(stats["first_quartile"])
+ fs
+ str(stats["median"])
+ fs
+ str(stats["third_quartile"])
+ fs
+ str(stats["percentile_90"])
)
else:
string += fs + fs + fs + fs
if output is None:
print(string)
else:
out_file.write(string + "\n")
dbif.close()
if output is not None:
out_file.close()