From 8b7b7c7c094259c9fd93cc68a95be3d9dcf1db0e Mon Sep 17 00:00:00 2001 From: Chris Mungall Date: Wed, 20 Jul 2022 19:22:17 -0700 Subject: [PATCH] Added generalization using panderas (#84) See https://github.com/linkml/linkml/issues/671 Added ability to parse a table on the web Adding more documentation --- docs/packages/generalizers.rst | 271 ++++++++++++++++++ docs/packages/importers.rst | 25 ++ poetry.lock | 68 ++++- pyproject.toml | 1 + schema_automator/cli.py | 59 +++- .../generalizers/csv_data_generalizer.py | 21 +- schema_automator/generalizers/generalizer.py | 5 + .../generalizers/pandas_generalizer.py | 73 +++++ schema_automator/utils/schemautils.py | 2 +- .../NWT_wildfires_biophysical_2016.tsv | 146 ++++++++++ .../test_bioportal_schema_annotator.py | 6 +- .../test_pandas_data_generalizer.py | 40 +++ 12 files changed, 702 insertions(+), 15 deletions(-) create mode 100644 schema_automator/generalizers/pandas_generalizer.py create mode 100644 tests/resources/NWT_wildfires_biophysical_2016.tsv create mode 100644 tests/test_generalizers/test_pandas_data_generalizer.py diff --git a/docs/packages/generalizers.rst b/docs/packages/generalizers.rst index c61a723..9ce15d8 100644 --- a/docs/packages/generalizers.rst +++ b/docs/packages/generalizers.rst @@ -10,6 +10,277 @@ Generalizers take example data and *generalizes* to a schema Generalization is inherently a heuristic process, this should be viewed as a bootstrapping process that *semi*-automates the creation of a new schema for you. +Generalizing from a single TSV +----------------- + +.. code-block:: + + schemauto generalize-csv tests/resources/NWT_wildfires_biophysical_2016.tsv -o wildfire.yaml + +The schema will have a slot for every column, e,g: + +.. code-block:: yaml + + classes: + Observation: + slots: + - site + - plot + - plot_size + - date + - observer + +Ranges will be auto-inferred, e.g.: + +.. code-block:: yaml + + slots: + site: + examples: + - value: ZF20-105 + range: string + plot: + examples: + - value: '6' + range: integer + plot_size: + examples: + - value: 10X10 + range: plot_size_enum + date: + examples: + - value: '2016-07-09' + range: datetime + +Enums will be automatically inferred: + +.. code-block:: yaml + + enums: + plot_size_enum: + permissible_values: + 10X10: + description: 10X10 + 5x5: + description: 5x5 + 2.5X2.5: + description: 2.5X2.5 + 5X5: + description: 5X5 + 3x3: + description: 3x3 + ecosystem_enum: + permissible_values: + Open Fen: + description: Open Fen + Treed Fen: + description: Treed Fen + Black Spruce: + description: Black Spruce + Poor Fen: + description: Poor Fen + Fen: + description: Fen + Lowland: + description: Lowland + Upland: + description: Upland + Bog: + description: Bog + Lowland Black Spruce: + description: Lowland Black Spruce + +Chaining an annotator +----------------- + +If you provide an ``--annotator`` option you can auto-annotate enums: + +.. code-block:: + + schemauto generalize-csv \ + --annotator bioportal:envo \ + tests/resources/NWT_wildfires_biophysical_2016.tsv \ + -o wildfire.yaml + +.. code-block:: yaml + + ecosystem_enum: + from_schema: https://w3id.org/MySchema + permissible_values: + Open Fen: + description: Open Fen + meaning: ENVO:00000232 + exact_mappings: + - ENVO:00000232 + Treed Fen: + description: Treed Fen + meaning: ENVO:00000232 + exact_mappings: + - ENVO:00000232 + Black Spruce: + description: Black Spruce + Poor Fen: + description: Poor Fen + meaning: ENVO:00000232 + exact_mappings: + - ENVO:00000232 + Fen: + description: Fen + meaning: ENVO:00000232 + Lowland: + description: Lowland + Upland: + description: Upland + meaning: ENVO:00000182 + Bog: + description: Bog + meaning: ENVO:01000534 + exact_mappings: + - ENVO:01000535 + - ENVO:00000044 + - ENVO:01001209 + - ENVO:01000527 + Lowland Black Spruce: + description: Lowland Black Spruce + +The annotation can also be run as a separate step + +See :ref:`annotators` + +Generalizing from multiple TSVs +------------ + +You can use the ``generalize-tsvs`` command to generalize from *multiple* TSVs, with +foreign key linkages auto-inferred. + +For example, given a file ``envo.tsv``: + +.. csv-table:: environments + :header: envo term id, envo term label + + ENVO_01000752,area of barren land + ENVO_01001570,terrestrial ecoregion + ENVO_01001581,sea surface layer + ENVO_01001582,forest floor + +And a file file ``samples.tsv``: + +.. csv-table:: samples + :header: BIOSAMPLE_ID,BIOSAMPLE_NAME,ENVO_BIOME_ID,ENVO_FEATURE_ID,ENVO_MATERIAL_ID + + 156554,"Enriched cells from forest soil in Barre Woods Harvard Forest LTER site, Petersham, Massachusetts, United States - Alteio_BWOrgControl_Nextera2",ENVO_01000174,ENVO_01000159,ENVO_00002261 + 156649,"Enriched cells from forest soil in Barre Woods Harvard Forest LTER site, Petersham, Massachusetts, United States - Alteio_BWOrgHeat_Nextera5",ENVO_01000174,ENVO_01000159,ENVO_00005781 + 156728,"Enriched cells from forest soil in Barre Woods Harvard Forest LTER site, Petersham, Massachusetts, United States - Alteio_BWOrgHeat_Nextera84",ENVO_01000174,ENVO_01000159,ENVO_00005781 + 156738,"Enriched cells from forest soil in Barre Woods Harvard Forest LTER site, Petersham, Massachusetts, United States - Alteio_BWMinControl_Nextera2",ENVO_01000174,ENVO_01001275,ENVO_00002261 + +We can create a multi-class schema, with foreign keys inferred: + +.. code-block:: + + schemauto generalize-tsvs --infer-foreign-keys sample.tsv envo.tsv + +This will generate a schema with two classes, where the join between the sample table and the term table +is inferred: + +.. code-block:: yaml + +classes: + sample: + slots: + - BIOSAMPLE_ID + - BIOSAMPLE_NAME + - ENVO_BIOME_ID + - ENVO_FEATURE_ID + - ENVO_MATERIAL_ID + envo: + slots: + - ENVO_ID + - ENVO_LABEL + +slots: + BIOSAMPLE_ID: + range: integer + BIOSAMPLE_NAME: + range: string + ENVO_BIOME_ID: + examples: + - value: ENVO_01000022 + range: envo + ENVO_FEATURE_ID: + range: envo + ENVO_MATERIAL_ID: + range: envo + ENVO_ID: + identifier: true + range: string + ENVO_LABEL: + range: string + +Generalizing from tables on the web +----------------- + +You can use ``generalize-htmltable`` + +.. code-block:: + + schemauto generalize-htmltable https://www.nature.com/articles/s41467-022-31626-4/tables/1 + +Will generate: + +.. code-block:: yaml + + name: example + description: example + id: https://w3id.org/example + imports: + - linkml:types + prefixes: + linkml: https://w3id.org/linkml/ + example: https://w3id.org/example + default_prefix: example + slots: + GWAS trait: + examples: + - value: "\xC2" + range: string + Peak GWAS SNP: + examples: + - value: rs2974298 + range: string + Gene: + examples: + - value: SMIM19 + range: string + NK cell cis eSNP: + examples: + - value: rs2974348 + range: string + TWAS Z score: + examples: + - value: '3.809' + range: string + TWAS P value: + examples: + - value: '0.0001' + range: string + classes: + example: + slots: + - GWAS trait + - Peak GWAS SNP + - Gene + - NK cell cis eSNP + - TWAS Z score + - TWAS P value + +Generalizing from JSON +----------- + + + +Packages +-------- + .. currentmodule:: schema_automator.generalizers .. autoclass:: CsvDataGeneralizer diff --git a/docs/packages/importers.rst b/docs/packages/importers.rst index ac04a82..be42c7a 100644 --- a/docs/packages/importers.rst +++ b/docs/packages/importers.rst @@ -14,6 +14,31 @@ Importers are the opposite of `Generalizers `_, no ``is_a`` slots will be created. +Importing from JSON-Schema +--------- + +The ``import-json-schema`` command can be used: + +.. code-block:: + + schemauto import-json-schema tests/resources/model_card.schema.json + +Importing from OWL +--------- + +You can import from a schema-style OWL ontology. This must be in functional syntax + +Use robot to convert ahead of time: + +.. code-block:: + + robot convert -i schemaorg.ttl -o schemaorg.ofn + schemauto import-owl schemaorg.ofn + + +Packages +------- + .. currentmodule:: schema_automator.importers .. autoclass:: JsonSchemaImportEngine diff --git a/poetry.lock b/poetry.lock index 0a324a5..9cd4818 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1170,6 +1170,14 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "myst-parser" version = "0.17.2" @@ -1427,6 +1435,37 @@ numpy = "*" pandas = "*" sqlalchemy = "*" +[[package]] +name = "pandera" +version = "0.11.0" +description = "A light-weight and flexible data validation and testing tool for dataframes." +category = "main" +optional = false +python-versions = ">=3.8" + +[package.dependencies] +numpy = ">=1.19.0" +packaging = ">=20.0" +pandas = ">=1.2.0" +pyarrow = "*" +pydantic = "*" +typing-inspect = ">=0.6.0" +wrapt = "*" + +[package.extras] +all = ["black", "dask", "geopandas", "shapely", "pyspark", "frictionless", "pyyaml (>=5.1)", "fastapi", "hypothesis (>=5.41.1)", "ray (<=1.7.0)", "modin", "scipy", "pandas-stubs"] +dask = ["dask"] +fastapi = ["fastapi"] +geopandas = ["geopandas", "shapely"] +hypotheses = ["scipy"] +io = ["pyyaml (>=5.1)", "black", "frictionless"] +modin = ["modin", "ray (<=1.7.0)", "dask"] +modin-dask = ["modin", "dask"] +modin-ray = ["modin", "ray (<=1.7.0)"] +mypy = ["pandas-stubs"] +pyspark = ["pyspark"] +strategies = ["hypothesis (>=5.41.1)"] + [[package]] name = "pandocfilters" version = "1.5.0" @@ -1598,6 +1637,17 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "pyarrow" +version = "8.0.0" +description = "Python library for Apache Arrow" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16.6" + [[package]] name = "pycparser" version = "2.21" @@ -2515,6 +2565,18 @@ category = "main" optional = false python-versions = ">=3.7" +[[package]] +name = "typing-inspect" +version = "0.7.1" +description = "Runtime inspection utilities for typing module." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +mypy-extensions = ">=0.3.0" +typing-extensions = ">=3.7.4" + [[package]] name = "urllib3" version = "1.26.9" @@ -2618,7 +2680,7 @@ docs = [] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "fbb0ad9afc15920b0808d7226bff361b09c3dbfdab5147e2e9ae7e74a8f54bdd" +content-hash = "a340b5b95621ed322ef492926166a9749ee2bcc3a092b92b1ae6fd80ee487ba5" [metadata.files] aiohttp = [] @@ -2713,6 +2775,7 @@ mistune = [] mkdocs = [] more-click = [] multidict = [] +mypy-extensions = [] myst-parser = [] nbclient = [] nbconvert = [] @@ -2728,6 +2791,7 @@ openpyxl = [] packaging = [] pandas = [] pandasql = [] +pandera = [] pandocfilters = [] parse = [] parso = [] @@ -2745,6 +2809,7 @@ psycopg2-binary = [] ptyprocess = [] pure-eval = [] py = [] +pyarrow = [] pycparser = [] pydantic = [] pygments = [] @@ -2815,6 +2880,7 @@ tqdm = [] traitlets = [] twine = [] typing-extensions = [] +typing-inspect = [] urllib3 = [] validators = [] watchdog = [] diff --git a/pyproject.toml b/pyproject.toml index d7e0496..2fd5fe5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ PyYAML = "^5.3.1" pypandoc = "^1.7.5" twine = "^4.0.0" oaklib = "^0.1.17" +pandera = "^0.11.0" [tool.poetry.dev-dependencies] diff --git a/schema_automator/cli.py b/schema_automator/cli.py index f69184d..84d796c 100644 --- a/schema_automator/cli.py +++ b/schema_automator/cli.py @@ -7,6 +7,8 @@ import os import click +import pandas as pd + import yaml from linkml_runtime.linkml_model import SchemaDefinition from oaklib.selector import get_resource_from_shorthand, get_implementation_from_shorthand @@ -14,6 +16,8 @@ from schema_automator import JsonLdAnnotator from schema_automator.annotators.schema_annotator import SchemaAnnotator from schema_automator.generalizers.csv_data_generalizer import CsvDataGeneralizer +from schema_automator.generalizers.generalizer import DEFAULT_CLASS_NAME, DEFAULT_SCHEMA_NAME +from schema_automator.generalizers.pandas_generalizer import PandasDataGeneralizer from schema_automator.importers.dosdp_import_engine import DOSDPImportEngine from schema_automator.generalizers.json_instance_generalizer import JsonDataGeneralizer from schema_automator.importers.jsonschema_import_engine import JsonSchemaImportEngine @@ -34,9 +38,13 @@ schema_name_option = click.option( '--schema-name', '-n', - default='example', + default=DEFAULT_SCHEMA_NAME, show_default=True, help='Schema name') +annotator_option = click.option( + '--annotator', + '-A', + help='name of annotator to use for auto-annotating results. Must be an OAK selector') @click.group() @@ -71,12 +79,14 @@ def main(verbose: int, quiet: bool): @click.argument('tsvfile') # input TSV (must have column headers @output_option @schema_name_option -@click.option('--class-name', '-c', default='example', help='Core class name in schema') +@annotator_option +@click.option('--class-name', '-c', default=DEFAULT_CLASS_NAME, help='Core class name in schema') @click.option('--column-separator', '-s', default='\t', help='separator') @click.option('--downcase-header/--no-downcase-header', default=False, help='if true make headers lowercase') @click.option('--enum-columns', '-E', multiple=True, help='column that is forced to be an enum') @click.option('--robot/--no-robot', default=False, help='set if the TSV is a ROBOT template') -def generalize_tsv(tsvfile, output, class_name, schema_name, **kwargs): +@click.option('--pandera/--no-pandera', default=False, help='set to use panderas as inference engine') +def generalize_tsv(tsvfile, output, class_name, schema_name, pandera: bool, annotator, **kwargs): """ Generalizes from a single TSV file to a single-class schema @@ -86,8 +96,15 @@ def generalize_tsv(tsvfile, output, class_name, schema_name, **kwargs): schemauto generalize-tsv --class-name Person --schema-name PersonInfo my/data/persons.tsv """ - ie = CsvDataGeneralizer(**kwargs) + if pandera: + ie = PandasDataGeneralizer(**kwargs) + else: + ie = CsvDataGeneralizer(**kwargs) schema = ie.convert(tsvfile, class_name=class_name, schema_name=schema_name) + if annotator: + impl = get_implementation_from_shorthand(annotator) + sa = SchemaAnnotator(impl) + schema = sa.annotate_schema(schema) write_schema(schema, output) @@ -120,6 +137,40 @@ def generalize_tsvs(tsvfiles, output, schema_name, **kwargs): write_schema(schema, output) +@main.command() +@click.argument('url') # input TSV (must have column headers +@output_option +@schema_name_option +@click.option('--class-name', '-c', default=DEFAULT_CLASS_NAME, help='Core class name in schema') +@click.option('--pandera/--no-pandera', default=False, help='set to use panderas as inference engine') +@click.option('--data-output', help='Path to file of downloaded data') +@click.option('--table-number', + type=int, + default=0, + show_default=True, + help='If URL has multiple tables, use this one (zero-based)') +def generalize_htmltable(url, output, class_name, schema_name, pandera: bool, + table_number: int, data_output, + **kwargs): + """ + Generalizes from a table parsed from a URL + + Uses pandas/beautiful soup + """ + dfs = pd.read_html(url) + logging.info(f"{url} has {len(dfs)} tables") + df = dfs[table_number] + if data_output: + df.to_csv(data_output, sep="\t") + if pandera: + ie = PandasDataGeneralizer(**kwargs) + schema = ie.convert(df, class_name=class_name, schema_name=schema_name) + else: + ie = CsvDataGeneralizer(**kwargs) + schema = ie.convert_dicts(df.to_dict('records')) + write_schema(schema, output) + + @main.command() @click.argument('dpfiles', nargs=-1) ## input DOSDPs @output_option diff --git a/schema_automator/generalizers/csv_data_generalizer.py b/schema_automator/generalizers/csv_data_generalizer.py index a99b815..795cbf2 100644 --- a/schema_automator/generalizers/csv_data_generalizer.py +++ b/schema_automator/generalizers/csv_data_generalizer.py @@ -11,13 +11,13 @@ import time from dateutil.parser import parse +from deprecation import deprecated from linkml_runtime import SchemaView from linkml_runtime.linkml_model import SchemaDefinition, ClassDefinition, TypeDefinition, SlotDefinition from quantulum3 import parser as q_parser from dataclasses import dataclass, field -from schema_automator.generalizers.generalizer import Generalizer -from schema_automator.importers.import_engine import ImportEngine +from schema_automator.generalizers.generalizer import Generalizer, DEFAULT_CLASS_NAME from schema_automator.utils.schemautils import merge_schemas, write_schema ID_SUFFIX = '_id' @@ -172,7 +172,10 @@ def infer_linkages(self, files: List[str], **kwargs) -> List[ForeignKey]: logging.info(f'FILTERED: {fks}') return fks - def inject_foreign_keys(self, sv: SchemaView, fks: List[ForeignKey]) -> None: + def inject_foreign_keys(self, + sv: SchemaView, + fks: List[ForeignKey], + direct_slot = True) -> None: schema = sv.schema for fk in fks: # TODO: deal with cases where the same slot is used in different classes @@ -181,13 +184,15 @@ def inject_foreign_keys(self, sv: SchemaView, fks: List[ForeignKey]) -> None: src_cls.slot_usage[fk.source_column] = \ SlotDefinition(name=fk.source_column, range=fk.target_table) - #src_slot['range'] = fk.target_table + if direct_slot: + src_slot['range'] = fk.target_table tgt_cls = schema.classes[fk.target_table] tgt_slot = schema.slots[fk.target_column] tgt_cls.slot_usage[fk.target_column] = \ SlotDefinition(name=fk.target_column, identifier=True) - #tgt_slot['identifier'] = True + if direct_slot: + tgt_slot['identifier'] = True def convert_multiple(self, files: List[str], **kwargs) -> SchemaDefinition: """ @@ -199,6 +204,7 @@ def convert_multiple(self, files: List[str], **kwargs) -> SchemaDefinition: """ if self.infer_foreign_keys: fks = self.infer_linkages(files) + logging.info(f"Inferred {len(fks)} foreign keys: {fks}") else: fks = () schemas = [] @@ -238,7 +244,7 @@ def read_slot_tsv(self, file: str, **kwargs) -> Dict: def convert_to_edge_slots(self, all_tsv_rows: List, - name: str = 'example', + name: str = DEFAULT_CLASS_NAME, **kwargs) -> Optional[Dict]: """ @@ -290,7 +296,7 @@ def convert_to_edge_slots(self, def convert_dicts(self, rr: List[Dict], schema_name: str = 'example', - class_name: str = 'example', + class_name: str = DEFAULT_CLASS_NAME, **kwargs) -> SchemaDefinition: slots = {} slot_values = {} @@ -629,6 +635,7 @@ def convert_range(k: str, dt: str) -> str: return t +@deprecated def infer_enum_meanings(schema: dict, zooma_confidence: str = 'MEDIUM', cache={}) -> None: diff --git a/schema_automator/generalizers/generalizer.py b/schema_automator/generalizers/generalizer.py index e7d5f31..5a1a21b 100644 --- a/schema_automator/generalizers/generalizer.py +++ b/schema_automator/generalizers/generalizer.py @@ -1,8 +1,13 @@ from abc import ABC +from dataclasses import dataclass from linkml_runtime.linkml_model import SchemaDefinition, Prefix +DEFAULT_CLASS_NAME = 'Observation' +DEFAULT_SCHEMA_NAME = 'MySchema' + +@dataclass class Generalizer(ABC): """ Abstract Base Class for all Generalization Engines. diff --git a/schema_automator/generalizers/pandas_generalizer.py b/schema_automator/generalizers/pandas_generalizer.py new file mode 100644 index 0000000..ddb40bb --- /dev/null +++ b/schema_automator/generalizers/pandas_generalizer.py @@ -0,0 +1,73 @@ +import click +from typing import Union, Dict, List, Any, Type + +import pandas as pd +import pandera as pa +from dataclasses import dataclass + +from linkml.utils.schema_builder import SchemaBuilder +from linkml.utils.schema_fixer import SchemaFixer +from linkml_runtime.linkml_model import SchemaDefinition, ClassDefinition, SlotDefinition +from pandera import Column + +from schema_automator import CsvDataGeneralizer +from schema_automator.generalizers.generalizer import DEFAULT_CLASS_NAME + +DATA_TYPE_MAP = { + pa.Int: 'integer', + pa.Float: 'float', + pa.String: 'string', + pa.DateTime: 'datetime', +} + +def map_dtype(t: Type) -> str: + for type_cls, rng in DATA_TYPE_MAP.items(): + if isinstance(t, type_cls): + return rng + return 'string' + + +@dataclass +class PandasDataGeneralizer(CsvDataGeneralizer): + """ + A generalizer that abstracts from Pandas data frames + """ + + def convert(self, input: Union[pd.DataFrame, str], format: str = 'tsv', + container_class_name='Container', + class_name=DEFAULT_CLASS_NAME, + **kwargs) -> SchemaDefinition: + if isinstance(input, str): + df = pd.read_csv(input, sep=self.column_separator) + elif isinstance(input, pd.DataFrame): + df = input + else: + raise ValueError(f"{input} must be DataFrame or path to TSV") + c = self.from_dataframe(df, class_name=class_name) + sb = SchemaBuilder(self.schema_name) + sb.add_defaults() + schema = sb.schema + schema.classes[c.name] = c + sf = SchemaFixer() + sf.add_container(schema, class_name=container_class_name) + return schema + + def from_dataframe(self, df: pd.DataFrame, class_name=DEFAULT_CLASS_NAME) -> ClassDefinition: + ps = pa.infer_schema(df) + return self.from_dataframe_schema(ps, class_name=class_name) + + def from_dataframe_schema(self, ps: pa.DataFrameSchema, class_name=DEFAULT_CLASS_NAME) -> ClassDefinition: + if ps.name: + name = ps.name + else: + name = class_name + c = ClassDefinition(name) + for col_name, col in ps.columns.items(): + slot = self.from_column(col_name, col) + c.attributes[slot.name] = slot + return c + + def from_column(self, col_name: str, col: Column) -> SlotDefinition: + return SlotDefinition(col_name, + range=map_dtype(col.dtype)) + diff --git a/schema_automator/utils/schemautils.py b/schema_automator/utils/schemautils.py index e7a501d..12d018d 100644 --- a/schema_automator/utils/schemautils.py +++ b/schema_automator/utils/schemautils.py @@ -10,7 +10,7 @@ from linkml_runtime.utils.schema_as_dict import schema_as_dict -def write_schema(schema: Union[dict, SchemaDefinition], output: Optional[str]): +def write_schema(schema: Union[dict, SchemaDefinition], output: Optional[str] = None): """ Convenience method for writing a schema to stdout or to a file diff --git a/tests/resources/NWT_wildfires_biophysical_2016.tsv b/tests/resources/NWT_wildfires_biophysical_2016.tsv new file mode 100644 index 0000000..948f6f3 --- /dev/null +++ b/tests/resources/NWT_wildfires_biophysical_2016.tsv @@ -0,0 +1,146 @@ +site plot plot_size date observer latitude longitude time live_canopy_cover dominant_cover ecosystem medium_shrub_cover ground_wetness soil_top_moss_condition soil_live_moss_thickness soil_dead_moss_layer_thickness soil_upper_duff_layer_thickness soil_lower_duff_layer_thickness total_peat_depth low_shrubs_coverage low_shrubs_distribution woody_debris_coverage woody_debris_distribution sphag_coverage sphag_distribution reindeer_lichen_coverage reindeer_lichen_distribution grasses_coverage grasses_distribution herbaceous_coverage herbaceous_distribution feather_moss_coverage feather_moss_coverage_distribution other_lichen_coverage other_lichen_coverage_distribution othertype_groundcover1 othertype_groundcover1_coverage othertype_groundcover1_distribution othertype_groundcover2 othertype_groundcove2_coverage othertype_groundcover2_distribution othertype_groundcover3 othertype_groundcover3_coverage othertype_groundcover3_distribution othertype_groundcover4 othertype_groundcover4_coverage othertype_groundcover4_distribution +SS3-64 1 2.5X2.5 2016-07-15 EE/SE 60.921279 -117.025517 13:30 40 Forest Treed Fen 40 Soggy live_moss 0.5 0 0 39.5 40 30 Even 5 Even 5 Even 0 not_provided 30 Even 10 Even 0 not_provided 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-64 2 2.5X2.5 2016-07-15 EE/SE 60.921119 -117.025204 13:45 60 Forest Fen 60 Moist dead_sedge 1 0 0 39 40 20 Patchy 2 Patchy 0 not_provided 0 not_provided 20 Even 5 Even 0 not_provided 0 not_provided Fire Moss 20 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-64 3 2.5X2.5 2016-07-15 EE/SE 60.920979 -117.024896 14:15 60 Forest Treed Fen 60 Moist charred_moss 0.5 0 0 39.5 40 15 Even 2 Patchy 0 not_provided 0 not_provided 30 Even 8 Even 0 not_provided 0 not_provided Other Moss 20 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-64 4 2.5X2.5 2016-07-15 EE/SE 60.920827 -117.026147 15:30 50 Forest Fen 50 Moist dead_sedge 4 0 0 36 40 15 Patchy 8 Patchy 0 not_provided 0 not_provided 60 Even 5 Patchy 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-64 5 2.5X2.5 2016-07-15 EE/SE 60.920691 -117.025781 15:25 30 Forest Treed Fen 30 Moist dead_sedge 0 2 3 35 40 15 Even 2 Patchy 0 not_provided 0 not_provided 35 Even 8 Even 0 not_provided 0 not_provided Other Moss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-64 6 2.5X2.5 2016-07-15 EE/SE 60.92056 -117.025427 14:30 60 Forest Fen 60 Moist live_moss 0 4 3 37 44 20 Patchy 1 Patchy 0 not_provided 0 not_provided 3 Even 5 Even 0 not_provided 0 not_provided Other Moss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 1 10X10 2016-07-15 EE/SE 60.923518 -117.022745 17:45 40 Herbaceous Open Fen 40 Soggy dead_sedge 4 0 0 36 40 15 Even 2 Patchy 0 not_provided 0 not_provided 30 Even 5 not_provided 0 not_provided 5 Patchy Other Moss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 2 10X10 2016-07-15 EE/SE 60.923477 -117.023155 17:30 20 Herb/Shrub Fen 20 Soggy dead_sedge 5 0 0 35 40 15 Even 5 Even 0 not_provided 0 not_provided 35 Even 5 Even 0 not_provided 2 Patchy Other Moss 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 3 10X10 2016-07-15 EE/SE 60.923425 -117.023659 17:15 20 Herb/Shrub Fen 20 Standing Water charred_moss 0 2 2 36 40 20 Even 3 Patchy 0 not_provided 0 not_provided 30 Even 8 Patchy 0 not_provided 0 not_provided Other 5 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 4 5X5 2016-07-15 EE/SE 60.923043 -117.022474 16:15 10 Herb/Shrub Fen 10 Standing Water live_moss 1 0 0 39 40 30 Even 10 Patchy 0 not_provided 0 not_provided 60 Even 5 Even 0 not_provided 0 not_provided Other Moss 35 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 5 5X5 2016-07-15 EE/SE 60.923477 -117.023155 16:30 30 Herb/Shrub Fen 30 Standing Water dead_sedge 0.5 0 0 39.5 40 25 Even 5 Patchy 0 not_provided 0 not_provided 20 Even 10 Even 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-65 6 10X10 2016-07-15 EE/SE 60.922917 -117.023358 16:45 20 Herb/Shrub Fen 20 Standing Water live_moss 0.5 0 0 39.5 40 15 Even 5 Even 0 not_provided 0 not_provided 30 Even 5 Even 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-104 1 10X10 2016-07-16 EE/SE 60.93871 -117.404 8:30 10 Forest Bog 10 Moist live_moss 5 0 12 23 40 50 Even 5 Patchy 60 Even 10 Patchy 15 Even 10 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-104 2 10X10 2016-07-16 EE/SE 60.93853 -117.40404 9:00 5 Forest Bog 5 Moist charred_moss 2 0 11 27 40 15 Patchy 5 Patchy 10 Patchy 6 Patchy 0 not_provided 15 Patchy 0 not_provided 0 not_provided Fire Moss 4 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-104 3 10X10 2016-07-16 EE/SE 60.93836 -117.40407 9:30 0 Forest Bog 0 Dry charred_moss 3 0 10 27 40 35 Even 5 Even 8 Patchy 8 Patchy 0 not_provided 2 Even 0 not_provided 4 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-104 5 10X10 2016-07-16 EE/SE 60.93859 -117.40496 10:00 5 Forest Bog 5 Dry charred_moss 1 3 36 0 40 35 Even 5 Even 5 Patchy 5 Patchy 0 not_provided 5 Even 0 not_provided 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-104 6 10X10 2016-07-16 EE/SE 60.93839 -117.40495 9:40 0 Forest Bog 0 Dry charred_moss 1 2 37 0 40 30 Patchy 5 Patchy 5 Patchy 7 Patchy 1 Patchy 2 Patchy 0 Patchy 0 not_provided Fire Moss 8 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 1 10X10 2016-07-17 EE/SE 60.90604 -117.40221 9:30 0 Forest Bog 0 Dry live_moss 0 13 17 10 40 30 Patchy 8 Patchy 5 Patchy 5 Patchy 0 not_provided 5 Patchy 0 not_provided 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 2 10X10 2016-07-17 EE/SE 60.90599 -117.4018 10:00 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 30 Even 5 Even 5 Patchy 5 Patchy 0 not_provided 3 Patchy 0 not_provided 3 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 3 10X10 2016-07-17 EE/SE 60.90595 -117.40143 10:25 0 not_provided Bog 0 Dry charred_moss 0 9 26 5 40 20 Even 5 Patchy 0 not_provided 0 not_provided 0 not_provided 7 Patchy 0 -999 0 not_provided Other Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 4 10X10 2016-07-17 EE/SE 60.90557 -117.40246 11:50 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 30 Even 0 not_provided 15 Patchy 5 Patchy 0 not_provided 10 Even 0 not_provided 0 not_provided Fire Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 5 10X10 2016-07-17 EE/SE 60.90554 -117.40212 11:30 0 Forest Bog 0 Dry charred_moss 1.5 0 38.5 0 40 80 Even 5 Patchy 75 Patchy 5 Patchy 0 not_provided 10 Even 0 not_provided 0 not_provided Fire Moss 3 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS3-109 6 10X10 2016-07-17 EE/SE 60.90554 -117.40171 11:15 0 Forest Bog 0 Dry live_moss 7 9 24 0 40 50 Patchy 3 Even 40 Patchy 5 Patchy 0 not_provided 5 Even 0 not_provided 0 not_provided Fire Moss 8 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 1 5X5 2016-07-13 EE/SE 60.8242 -114.33427 9:45 30 Shrub Fen 30 Standing Water dead_sedge 2 0 0 58 60 5 Even 5 Patchy 0 not_provided 0 not_provided 40 Even 20 Even 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 2 2.5X2.5 2016-07-13 EE/SE 60.82421 -114.33433 10:30 50 Shrub Fen 50 Soggy charred_moss 3 0 0 50 53 10 Even 2 Patchy 0 not_provided 0 not_provided 40 Even 20 Even 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 3 2.5X2.5 2016-07-13 EE/SE 60.82415 -114.33492 11:00 45 Shrub Fen 45 Standing Water live_moss 2 4 5 29 40 0 not_provided 2 Patchy 0 not_provided 0 not_provided 35 Even 20 Even 0 not_provided 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 4 2.5X2.5 2016-07-13 EE/SE 60.82461 -114.33431 12:15 40 Shrub Fen 40 Standing Water charred_moss 3 0 0 37 40 15 Even 5 Patchy 0 not_provided 0 not_provided 25 Even 20 Even 5 Even 0 not_provided Other Moss 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 5 2.5X2.5 2016-07-13 EE/SE 60.8246 -114.33477 11:30 40 Shrub Fen 40 Standing Water live_moss 8 0 0 32 40 5 Even 5 Patchy 0 not_provided 0 not_provided 30 Even 20 Even 10 Patchy 0 not_provided Other Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS28-2 6 2.5X2.5 2016-07-13 EE/SE 60.82457 -114.33516 11:15 30 Shrub Fen 30 Standing Water live_moss 2 0 0 38 40 10 Patchy 5 Patchy 0 not_provided 0 not_provided 40 Even 10 Even 0 not_provided 0 not_provided Fire Moss 20 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-3 1 10X10 2016-07-15 EE/SE 60.97414 -117.2008 9:30 10 Forest Bog 10 Dry charred_moss 1 0 9 30 40 0 not_provided 5 Patchy 0 not_provided 5 Even 20 Even 15 Even 0 not_provided 5 Patchy Equisetum 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-3 2 10X10 2016-07-15 EE/SE 60.97431 -117.20084 9:45 20 Forest Lowland 20 Dry charred_moss 1 0 4 12 15 20 Patchy 2 Patchy 0 not_provided 2 Patchy 5 Even 10 Even 0 not_provided 0 not_provided Equisetum 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-3 3 5X5 2016-07-15 EE/SE 60.97437 -117.2 10:30 2 Forest Lowland 2 Dry charred_moss 2 0 0 6 8 10 Even 5 Even 0 not_provided 0 not_provided 2 Even 0 not_provided 0 not_provided 0 not_provided Equisetum 5 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-3 4 5X5 2016-07-15 EE/SE 60.97417 -117.19997 10:45 0 Forest Lowland 0 Dry charred_moss 2 0 3 18 23 10 Patchy 5 Patchy 0 not_provided 0 not_provided 10 Patchy 10 Patchy 0 not_provided 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-3 5 5X5 2016-07-15 EE/SE 60.97401 -117.19995 11:00 20 Forest Lowland 20 Dry live_moss 1 0 5 5 11 15 Even 5 Even 5 Even 0 not_provided 25 Even 10 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 1 5X5 2016-07-16 EE/SE 60.95345 -117.15379 13:40 20 Forest Fen 20 Standing Water dead_sedge 1 1 0 38 40 10 Even 5 Even 0 not_provided 0 not_provided 30 Even 5 Even 0 not_provided 0 not_provided Other Moss 20 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 2 5X5 2016-07-16 EE/SE 60.95362 -117.15384 14:00 -9999 Shrub Fen 10 Standing Water charred_moss 5 0 0 35 40 15 Even 5 Even 0 not_provided 0 not_provided 20 Even 10 Even 0 not_provided 0 not_provided Other Moss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 3 2.5X2.5 2016-07-16 EE/SE 60.95381 -117.1539 14:15 10 Shrub Fen 10 Standing Water charred_moss 1 4 0 35 40 20 Even 5 Even 0 not_provided 0 not_provided 20 Even 10 Even 0 not_provided 0 not_provided Equisetum 5 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 4 2.5X2.5 2016-07-16 EE/SE 60.95349 -117.1529 15:20 20 Shrub Fen 20 Soggy charred_moss 1.5 3 0 35 39.5 5 Even 5 Patchy 0 not_provided 0 not_provided 5 Even 30 Even 30 Patchy 0 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 5 2.5X2.5 2016-07-16 EE/SE 60.95367 -117.15295 15:00 15 Shrub Fen 15 Standing Water live_moss 0 5 0 35 40 5 Even 5 Patchy 0 not_provided 0 not_provided 15 Even 10 Even 0 not_provided 0 not_provided Other Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-7 6 2.5X2.5 2016-07-16 EE/SE 60.95386 -117.15298 14:45 30 Shrub Fen 30 Standing Water live_moss 0 4 0 36 40 10 Even 5 Patchy 0 not_provided 0 not_provided 20 Even 5 Even 0 not_provided 0 not_provided Other 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-120 1 5X5 2016-07-17 EE/SE 60.96872 -117.18848 14:10 0 Forest Bog 0 Dry charred_moss 2 0 0 0 2 6 Even 5 Even 0 not_provided 0 not_provided 1 Even 15 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-120 2 5X5 2016-07-17 EE/SE 60.96883 -117.18819 14:30 0 Forest Upland 0 Dry charred_moss 0 0.5 0 0 0.5 8 Even 5 Patchy 0 not_provided 0 not_provided 7 Even 10 Even 0 not_provided 0 not_provided 0 -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-120 3 5X5 2016-07-17 EE/SE 60.96898 -117.18794 14:45 2 Forest Upland 2 Dry charred_moss 1 0 6 6 13 5 Even 5 Even 0 not_provided 0 not_provided 4 Even 20 Even 0 not_provided 0 not_provided Liverwart 20 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-120 5 10X10 2016-07-17 EE/SE 60.96851 -117.18762 16:30 0 Forest Upland 0 Dry charred_moss 0.5 0 0 0 0.5 10 Patchy 10 Patchy 0 not_provided 0 not_provided 35 Patchy 5 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS50-120 6 5X5 2016-07-17 EE/SE 60.96864 -117.18737 16:00 0 Forest Upland 0 Dry charred_moss 0.75 0 0 0 0.75 8 Even 20 Peripheral 0 not_provided 0 not_provided 2 Patchy 5 Even 0 not_provided 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-2 1 10X10 2016-07-13 EE/SE 60.74876 -114.79489 14:30 0 Forest Bog 0 Dry charred_moss 1 0 16 23 40 20 Even 3 Even 5 Patchy 10 Even 5 Patchy 2 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-2 2 10X10 2016-07-13 EE/SE 60.74863 -114.79476 16:10 0 Forest Bog 0 Dry charred_moss 1 0 21 18 40 30 Even 2 Patchy 10 Patchy 20 Patchy 10 Even 5 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-2 3 10X10 2016-07-13 EE/SE 60.74844 -114.79461 16:30 0 Forest Bog 0 Dry charred_moss 2 6 32 0 40 30 Even 5 Patchy 10 Patchy 15 Even 10 Even 5 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-2 4 10X10 2016-07-13 EE/SE 60.74829 -114.79545 16:00 0 Forest Bog 0 Dry charred_moss 0 10 30 0 40 25 Even 5 Patchy 5 Patchy 20 Even 2 Patchy 2 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-2 5 10X10 2016-07-13 EE/SE 60.74811 -114.2953 16:15 0 Forest Bog 0 Dry charred_moss 1 13 14 12 40 30 Even 3 Even 5 Patchy 20 Even 8 Even 3 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 1 10X10 2016-07-12 EE/SE 60.78909 -114.64964 16:15 0 Forest Bog 0 Dry charred_moss 1 4 10 25 40 30 Patchy 5 Patchy 10 Patchy 0 not_provided 5 Patchy 2 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 2 10X10 2016-07-12 EE/SE 60.78897 -114.64933 15:45 0 Forest Bog 0 Dry charred_moss 1 6 12 21 40 35 Peripheral 3 Patchy 30 Peripheral 5 Patchy 8 Even 5 Peripheral 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 3 10X10 2016-07-12 EE/SE 60.78886 -114.64912 16:00 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 30 Patchy 5 Patchy 20 Patchy 9 Patchy 0 not_provided 5 Patchy 0 not_provided 8 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 4 10X10 2016-07-12 EE/SE 60.7887 -114.65012 17:20 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 20 Even 5 Even 8 Patchy 5 Even 0 not_provided 5 Patchy 0 not_provided 0 not_provided 0 -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 5 10X10 2016-07-12 EE/SE 60.78862 -114.67984 16:45 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 20 Even 5 Patchy 5 Patchy 9 Patchy 0 not_provided 5 Patchy 0 not_provided 0 not_provided Fire Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +SS81-7 6 10X10 2016-07-12 EE/SE 60.78853 -114.64953 16:20 0 Forest Bog 0 Dry charred_moss 1 0 39 0 40 30 Even 8 Patchy 10 Patchy 8 Patchy 0 not_provided 5 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 1 10X10 2016-07-11 EE/SE 62.29814 -116.41893 10:15 30 Forest Upland 30 Dry charred_moss 1 0 4 8 13 20 Even 5 Patchy 0 not_provided 0 not_provided 30 Even 15 Even 0 not_provided 0 not_provided Other Moss 2 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 2 10X10 2016-07-11 EE/SE 62.29831 -116.41863 10:40 40 Forest Upland 40 Dry charred_moss 1 0 7 11 19 35 Even 5 Patchy 0 not_provided 0 not_provided 30 Even 15 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 3 10X10 2016-07-11 EE/SE 62.29837 -116.41836 11:15 20 Forest Upland 20 Dry charred_moss 1 0 9 10 20 35 Even 2 Patchy 0 not_provided 0 not_provided 30 Even 10 Even 0 not_provided 0 not_provided Other Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 4 10X10 2016-07-11 EE/SE 62.29775 -116.4183 12:20 15 Forest Upland 15 Dry charred_moss 1 0 0 4 5 20 Even 5 Patchy 0 not_provided 0 not_provided 15 Even 10 Patchy 0 not_provided 0 not_provided Other Moss 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 5 10X10 2016-07-11 EE/SE 62.29789 -116.41801 12:00 15 Forest Upland 15 Dry charred_moss 0 1 3 12 16 15 Patchy 5 Patchy 0 not_provided 0 not_provided 8 Patchy 10 Patchy 0 not_provided 0 not_provided Other Moss 3 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-2 6 10X10 2016-07-11 EE/SE 62.29803 -116.41774 11:45 30 Forest Upland 30 Dry Burned_moss 0.5 0 0 1.5 2 20 Even 5 Patchy 0 not_provided 0 not_provided 15 Even 8 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 1 10X10 2016-07-11 EE/SE 62.20004 -116.31116 13:40 0 Forest Poor Fen 0 Dry Burned_moss 2 0 36 30 68 20 Even 5 Patchy 10 Patchy 0 not_provided 6 Patchy 5 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 2 10X10 2016-07-11 EE/SE 62.2001 -116.31082 14:15 -9999 Forest Bog -9999 Moist charred_moss 7 9 48 0 64 60 Even 5 Patchy 50 Patchy 15 Patchy 15 Patchy 5 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 3 10X10 2016-07-11 EE/SE 62.20017 -116.31049 14:30 0 Forest Bog 0 Moist live_moss 5 6 49 0 60 35 Even 3 Patchy 30 Patchy 20 Patchy 0 not_provided 5 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 4 10X10 2016-07-11 EE/SE 62.19968 -116.31078 15:45 -9999 Forest Bog -9999 Moist/Dry charred_moss 2 6 35 0 43 30 Patchy 5 Patchy 15 Patchy 7 Patchy 8 Patchy 4 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 5 10X10 2016-07-11 EE/SE 62.19974 -116.31039 15:30 0 Forest Bog 0 Moist charred_moss 0.5 0.5 2 75 78 30 Patchy 5 Even 30 Patchy 8 Even 5 Patchy 2 Even 0 not_provided 3 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF2-12 6 10X10 2016-07-11 EE/SE 62.19982 -116.31006 15:00 0 Forest Bog 0 Moist/Dry charred_moss 1.5 0 55.5 0 57 40 Patchy 6 Patchy 40 Patchy 10 Patchy 5 Patchy 5 Patchy 0 not_provided 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-2 1 10X10 2016-08-08 SE/LBC/EE 62.49755 -113.41964 10:00 15 Forest Treed Fen 15 Soggy charred_moss 0.5 2 9.25 28.25 40 15 Even 1 Even 0 not_provided 0 not_provided 15 Even 5 Even 0 not_provided 0 not_provided Lichen/Liverwart 2 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-2 2 10X10 2016-08-08 SE/LBC/EE 62.49737 -113.4197 13:30 15 Forest Treed Fen 15 Soggy charred_moss 0.75 2 5 32.25 40 15 Even 5 Even 0 Patchy 0 Even 8 Even 10 Even 2 Even 0 Even Fireweed 5 Patchy Liverwart 1 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-2 3 5X5 2016-08-08 SE/LBC/EE 62.49722 -113.41982 11:00 15 Forest Treed Fen 15 Soggy charred_moss 1.5 0 10 28.5 40 10 Even 5 Patchy 0 not_provided 0 not_provided 8 Even 6 Even 0 not_provided 0 not_provided Liverwart 3 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-2 4 5X5 2016-08-08 SE/LBC/EE 62.497 -113.41976 11:20 8 Forest Treed Fen 8 Soggy Liverwart 0.5 0 9 0 9.5 10 Even 3 Even 0 not_provided 0 not_provided 10 Even 6 Even 0 not_provided 0 not_provided Liverwart 15 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-2 5 10X10 2016-08-08 SE/LBC/EE 62.49682 -113.41983 11:45 3 Forest Treed Fen 3 Standing Water Liverwart/Burned_moss 0.5 0 7 22.5 30 10 Even 5 Even 0 not_provided 0 not_provided 8 Even 8 Even 0 not_provided 0 not_provided Fireweed 5 Even Redmoss 10 Patchy Liverwart 60 Patchy not_provided -9999 not_provided +ZF14-3 1 10X10 2016-08-08 SE/LBC/EE 62.50097 -113.4143 13:00 0 Forest Treed Fen 0 Soggy charred_moss 0.5 0 2 37.5 40 5 Even 5 Even 0 not_provided 0 not_provided 2 Patchy 1 Even 1 Patchy 0 not_provided Fireweed 6 Even Redmoss 4 Patchy Liverwart 15 Patchy not_provided -9999 not_provided +ZF14-3 2 5X5 2016-08-08 SE/LBC/EE 62.50082 -113.41413 13:20 1 Forest Treed Fen 1 not_provided Singed_moss 1 3.5 8.5 27 40 8 Even 6 Patchy 0 not_provided 0 not_provided 2 Even 2 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-3 3 5X5 2016-08-08 SE/LBC/EE 62.50067 -113.41396 13:45 10 Forest Treed Fen 10 Moist charred_moss 1.5 2 5 30.5 40 10 Even 5 Even 0 not_provided 0 not_provided 15 Patchy 5 Even 0 not_provided 0 not_provided Fireweed 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-3 4 10X10 2016-08-08 SE/LBC/EE 62.5007 -113.4135 14:30 0 Forest Treed Fen 0 Moist/Dry Liverwart 0 4.5 11 17.5 33 5 Even 5 Even 0 not_provided 0 not_provided 4 Even 5 Even 0 not_provided 0 not_provided Liverwart 15 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-3 5 5X5 2016-08-08 SE/LBC/EE 62.50085 -113.41373 14:50 10 Forest Treed Fen 10 Moist/Dry Singed_moss 0.5 5 7.5 28 41 6 Even 6 Even 0 not_provided 0 not_provided 3 Even 3 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 1 10X10 2016-08-05 SE/LBC/EE 62.44361 -113.15682 10:40 -9999 Forest Black Spruce 7 Standing Water/Soggy charred_moss 0.1 0 5 0 5.1 3 not_provided 10 not_provided 0 not_provided 0 not_provided 5 not_provided 0 not_provided 0 not_provided 0 not_provided Liverwart 35 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 2 10X10 2016-08-05 SE/LBC/EE 62.44368 -113.15646 11:00 -9999 Forest Upland 0 Standing Water/Soggy Liverwart 0.5 0 0 4.5 5 1 not_provided 30 not_provided 0 not_provided 0 not_provided 1 Even 30 not_provided 0 not_provided 0 not_provided Liverwart 50 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 3 10X10 2016-08-05 SE/LBC/EE 62.44374 -113.15606 11:30 0 Forest Upland 0 Standing Water/Soggy Charred_liverwort 1 0 0 5 6 0.5 not_provided 30 not_provided 0 not_provided 0 not_provided 1 not_provided 20 not_provided 0 not_provided 0 not_provided Liverwart 15 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 4 10X10 2016-08-05 SE/LBC/EE 62.44418 -113.15646 12:30 0 Forest Lowland Black Spruce 0 Standing Water Charred_Moss 1 2 11 4 18 5 Patchy 15 Patchy 0 not_provided 0 not_provided 2 Patchy 2 Patchy 0 not_provided 0 not_provided Fireweed 40 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 5 10X10 2016-08-05 SE/LBC/EE 62.44423 -113.15614 12:50 1 Forest Lowland Black Spruce 1 Standing Water Charred_Moss 0.5 0 5 2 7.5 5 Patchy 10 Even 0 not_provided 0 not_provided 7 Patchy 4 Even 0 not_provided 0 not_provided Fireweed 35 Patchy Liverwart 40 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-10 6 10X10 2016-08-05 SE/LBC/EE 62.44429 -113.15576 13:15 0 Forest Lowland Black Spruce 0 Soggy Charred_Moss 0.5 0 3.5 3.5 10.5 3 Even 2 Even 0 not_provided 0 not_provided 1 Even 5 Even 4 Patchy 0 not_provided Fireweed 30 Patchy Liverwart 20 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-17 1 5X5 2016-08-03 SE/LBC/EE 62.33949 -113.2045 15:30 20 Forest Upland 20 Dry Charred_Moss 1 0 0 0 1 8 Even 5 Even 0 not_provided 0 not_provided 6 Even 0 not_provided 0 not_provided 0 not_provided Liverwart 10 Patchy Equisetum 9 Patchy Fireweed 4 Patchy not_provided -9999 not_provided +ZF14-17 2 5X5 2016-08-03 SE/LBC/EE 62.33935 -113.20422 16:10 -9999 Forest Upland 0 Dry Singed_moss/Charred_moss 1 0 0 0 1 0 not_provided 0 not_provided 0 not_provided 0 not_provided 1 not_provided 0 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-17 3 5X5 2016-08-03 SE/LBC/EE 62.33923 -113.20399 17:10 -9999 Forest Upland 1 Dry Charred_liverwort -9999 -9999 -9999 -9999 1.5 0 not_provided 4 Patchy 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided Fireweed 1 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-17 4 5X5 2016-08-03 SE/LBC/EE 62.33911 -113.20379 17:30 -9999 Forest Upland 5 Dry charred_moss 2 0 0 0 2 2 not_provided 1 not_provided 0 not_provided 0 not_provided 2 not_provided 1 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 1 10X10 2016-08-03 SE/LBC/EE 62.330789 -113.24792 10:00 0 Forest Bog 0 Moist charred_moss 0.5 38 1.5 0 40 20 Even 5 Even 0 not_provided 0 not_provided 1 Patchy 10 Even 0 not_provided 0 not_provided Equisetum 1 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 2 10X10 2016-08-03 SE/LBC/EE 62.33077 -113.24821 11:00 0 Forest Bog 0 Moist charred_moss 2 38 0 0 40 25 Even 5 Even 2 Patchy 0 not_provided 1 Patchy 0 not_provided 0 not_provided 0 not_provided Cloudberry 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 3 10X10 2016-08-03 SE/LBC/EE 62.33064 -113.24844 -9999 -9999 Forest Bog 0 Moist charred_moss 1 39 0 0 40 15 not_provided9 3 not_provided 18 not_provided 0 not_provided 2 not_provided 0 not_provided 0 not_provided 0 not_provided Fireweed 15 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 4 10X10 2016-08-03 LBC 62.33097 -113.24914 12:30 0 Forest Bog 0 Moist Charred_moss 1 19 2 0 22 15 Even 5 Even 2 Patchy 0 not_provided 0 not_provided 1 Even 0 not_provided 0 not_provided Cloudberry 10 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 5 10X10 2016-08-03 SE/LBC/EE 62.33109 -113.24889 13:00 0 Forest Bog 0 Moist charred_moss 1 0 9 32 42 15 Even 3 Even 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided Cloudberry 6 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-19 6 10X10 2016-08-03 SE/LBC/EE 62.3314 -113.24849 13:30 0 Forest Bog 0 Moist charred_moss 1 0 7 32 40 15 Even 3 Even 0 not_provided 0 not_provided 0 not_provided 1 Even 0 not_provided 0 not_provided Cloudberry 8 Even not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-40 1 5x5 2016-08-05 SE/LBC/EE 62.44481 -113.15439 14:15 3 Forest Lowland Black Spruce 3 Soggy charred_moss 2 0 4 2 8 20 Patchy 5 Even 0 not_provided 0 not_provided 3 Even 7 Even 0 not_provided 0 not_provided Equisetum 10 Even Liverwart 15 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-40 2 5X5 2016-08-05 SE/LBC/EE 62.44465 -113.15433 14:50 15 Forest Lowland Black Spruce 15 Soggy charred_moss 0.25 0 4.25 0 4.5 8 Even 5 Even 0 not_provided 0 not_provided 20 Even 5 Even 0 not_provided 0 not_provided Liverwart 2 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-40 3 5x5 2016-08-05 SE/LBC/EE 62.44447 -113.15422 15:30 2 Forest Lowland Black Spruce 2 Soggy charred_moss 1 0 8 0 9 3 w 4 Even 0 not_provided 0 not_provided 3 Even 2 not_provided 0 not_provided 0 not_provided Fireweed 6 Patchy Liverwart 20 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-41 1 5X5 2016-08-05 SE/LBC/EE 62.44421 -113.15327 16:15 4 Forest Lowland Black Spruce 4 Soggy Liverwort 1 0 0 0 1 10 Even 5 Even 0 not_provided 0 not_provided 7 Even 8 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-41 2 5X5 2016-08-05 SE/LBC/EE 62.44434 -113.15337 17:20 0 Forest Lowland Black Spruce 8 Standing Water/Soggy Charred_moss 1 10 10 6 27 3 Patchy 15 Patchy 0 not_provided 0 not_provided 5 Clumps 5 not_provided 0 not_provided 0 not_provided Liverwart 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF14-41 3 3x3 2016-08-05 SE/LBC/EE 62.4456 -113.15356 17:00 -9999 Forest Lowland Black Spruce 20 Standing Water/Soggy Charred_moss 1 3 8 12 24 10 not_provided 10 not_provided 0 not_provided 0 not_provided 4 not_provided 11 not_provided 0 not_provided 0 not_provided Liverwart 20 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 1 10X10 2016-08-04 LBC/SE 62.3646 -113.0743 18:15 -9999 Forest Bog 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 40 not_provided 1 not_provided 8 not_provided 0 not_provided 0 not_provided 20 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 2 10X10 2016-08-04 LBC 62.36484 -113.07434 19:00 -9999 Forest Bog 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 40 not_provided 3 not_provided 7 not_provided 0 not_provided 0 not_provided 25 not_provided 0 not_provided 2 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 3 10X10 2016-08-04 LBC/SE 62.36507 -113.07425 19:30 -9999 Forest Bog 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 44 not_provided 1 not_provided 5 not_provided 0 not_provided 1 not_provided 15 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 4 10X10 2016-08-04 LBC/SE 62.36533 -113.07423 19:45 -9999 Forest Bog 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 40 not_provided 2 not_provided 3 not_provided 0 not_provided 0 not_provided 15 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 5 10X10 2016-08-04 LBC/SE 62.36534 -113.07382 20:07 -9999 Forest Bog 20 Moist not_provided -9999 -9999 -9999 -9999 -9999 30 not_provided 1 not_provided 2 not_provided 0 not_provided 5 not_provided 5 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-6 6 10X10 2016-08-04 LBC 62.36536 -113.07344 20:15 -9999 Forest Bog 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 40 not_provided 1 not_provided 2 not_provided 0 not_provided 15 not_provided 10 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 1 10X10 2016-08-06 SE/LBC/EE 62.35011 -113.08336 16:45 -9999 Forest Fen 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 40 Even 3 Patchy 5 Patchy 0 not_provided 3 Patchy 3 not_provided 0 not_provided 0 not_provided Equisetum 3 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 2 10X10 2016-08-06 LBC 62.35032 -113.08303 16:35 -9999 Forest Fen 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 30 Even 3 Patchy 0 not_provided 0 not_provided 5 Even 4 Patchy 0 not_provided 0 not_provided Equisetum 6 Even Redmoss 4 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 3 10X10 2016-08-06 SE/LBC/EE 62.35046 -113.08272 16:10 -9999 Forest Fen 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 32 not_provided 5 not_provided 5 not_provided 0 not_provided 10 not_provided 2 not_provided 0 not_provided 0 not_provided Equisetum 2 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 4 10X10 2016-08-06 SE/LBC/EE 62.35072 -113.0831 16:00 -9999 Forest Fen 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 25 Even 1 Patchy 23 Patchy 0 not_provided 20 Even 3 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 5 10X10 2016-08-06 SE/LBC/EE 62.35057 -113.08345 15:07 -9999 Forest Fen 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 35 Even 1 Patchy 30 Patchy 0 not_provided 15 Patchy 5 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-7 6 10X10 2016-08-06 SE/LBC/EE 62.35037 -113.08373 15:20 -9999 Forest Black Spruce 1 Moist not_provided -9999 -9999 -9999 -9999 -9999 36 Even 2 Patchy 0 not_provided 0 not_provided 18 Even 4 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-9 1 10X10 2016-08-06 SE/LBC/EE 62.35486 -113.09441 11:23 -9999 Forest Bog 0 Soggy not_provided -9999 -9999 -9999 -9999 -9999 55 Even 1 Patchy 0 not_provided 4 Patchy 0 not_provided 10 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-9 2 10X10 2016-08-06 SE/LBC/EE 62.35464 -113.0943 11:45 -9999 Forest Bog 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 50 Even 3 Patchy 0 not_provided 0 not_provided 0 not_provided 10 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-9 3 10X10 2016-08-06 SE/LBC/EE 62.35442 -113.09419 12:00 -9999 Forest Bog 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 55 Even 2 not_provided 0 not_provided 1 Patchy 0 not_provided 5 Patchy 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-9 4 10X10 2016-08-06 SE/LBC/EE 62.35428 -113.09392 12:15 -9999 Forest Bog 0 Moist not_provided -9999 -9999 -9999 -9999 -9999 45 not_provided 2 not_provided 0 not_provided 0 not_provided 1 not_provided 5 not_provided 0 not_provided 0 not_provided Firemoss 1 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-100 1 10X10 2016-08-04 SE/LBC/EE 62.43362 -113.01637 10:00 10 Forest Lowland Black Spruce 10 Moist charred_moss 2 0 12 11 25 15 Even 3 Even 0 not_provided 0 not_provided 30 Even 5 Even 0 not_provided 0 not_provided Other Moss 8 Patchy Equisetum 20 Even Liverwart 6 Patchy not_provided -9999 not_provided +ZF17-100 2 10X10 2016-08-04 SE/LBC/EE 62.43379 -113.0163 10:30 12 Forest Lowland Black Spruce 12 Moist charred_moss 2 0 0 11 13 30 Even 2 Even 0 not_provided 0 not_provided 10 Even 7 Even 0 not_provided 0 not_provided Other Moss 3 Patchy Equisetum 20 Even not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-100 3 10X10 2016-08-04 SE/LBC/EE 62.43398 -113.01625 11:00 -9999 Forest Lowland 5 Moist charred_moss 1 0 19 0 20 20 not_provided 5 not_provided 0 not_provided 0 not_provided 10 not_provided 15 not_provided 0 not_provided 0 not_provided Equisetum 30 not_provided Other Moss 25 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-100 4 10X10 2016-08-04 LBC/SE 62.43397 -113.01717 11:30 -9999 Forest Lowland Black Spruce 5 Moist charred_moss 1 0 0 39 40 35 not_provided 10 not_provided 0 not_provided 0 not_provided 20 Even 15 not_provided 0 not_provided 0 not_provided Equisetum 35 not_provided Firemoss 8 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-100 5 10X10 2016-08-04 SE/LBC/EE 62.43383 -113.01681 12:30 4 Forest Lowland Black Spruce 4 Moist charred_moss 1 0 0 17 18 10 Even 5 Even 0 not_provided 0 not_provided 20 Even 7 Even 0 not_provided 0 not_provided Equisetum 5 Patchy Redmoss 35 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-101 1 10X10 2016-08-04 SE/LBC/EE 62.37524 -113.04508 14:10 0 Forest Bog 0 Soggy live_moss 0.5 0 0 39.5 40 10 Patchy 5 Patchy 0 not_provided 0 not_provided 0 not_provided 5 Patchy 0 not_provided 0 not_provided Fireweed 8 Patchy Other Moss 25 Patchy Liverwart 15 Patchy Equisetum 20 Patchy +ZF17-101 2 10X10 2016-08-04 SE/LBC/EE 62.37513 -113.04539 14:45 -9999 Forest Fen 0 Standing Water/Soggy charred_moss 1 0 7 32 40 15 Patchy 10 Patchy 0 not_provided 2 Patchy 6 Patchy 12 Patchy 0 not_provided 0 not_provided Other Moss 18 Patchy Equisetum 30 Even Fireweed 10 not_provided not_provided -9999 not_provided +ZF17-101 3 10X10 2016-08-04 SE/LBC/EE 62.375 -113.04572 15:30 0 Forest Treed Fen 0 Soggy live_moss 1 0 4.5 34.5 40 35 Even 10 Even 0 not_provided 2 Patchy 10 Even 20 Even 20 Even 0 not_provided Bearberry 15 Even Plursoium 25 Even Liverwart 3 Patchy not_provided -9999 not_provided +ZF17-101 4 5X5 2016-08-04 SE/LBC/EE 62.37532 -113.04613 16:10 0 Forest Treed Fen 0 Soggy live_moss 1 2.5 4 33.5 41 20 Even 2 Even 1 Patchy 1 Patchy 15 Even 8 Patchy 5 Patchy 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-101 5 10X10 2016-08-04 SE/LBC/EE 62.37545 -113.04585 16:40 0 Forest Fen 3 Soggy charred_moss 1 12 36 17 66 25 not_provided 2 not_provided 15 not_provided 0 not_provided 10 not_provided 20 not_provided 0 not_provided 0 not_provided Equisetum 10 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-101 6 10X10 2016-08-04 SE/LBC/EE 62.37556 -113.04552 18:00 -9999 Forest Fen 1 Dry live_moss 2 11 27 0 40 20 not_provided 10 not_provided 0 not_provided 0 not_provided 5 not_provided 10 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 1 5X5 2016-08-06 SE/LBC/EE 62.36904 -113.10545 11:30 -9999 Forest Lowland Black Spruce 0 Moist charred_moss 1 0 7.5 15 23.5 35 Even 3 Patchy 0 not_provided 0 not_provided 2 not_provided 6 not_provided 0 not_provided 0 not_provided Redmoss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 2 10X10 2016-08-06 SE/LBC/EE 62.36886 -113.10552 12:30 -9999 Forest Lowland Black Spruce 1 Moist charred_moss 0.5 5 7 5 17.5 39 not_provided 5 not_provided 0 not_provided 0 not_provided 5 not_provided 12 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 3 5X5 2016-08-06 SE/LBC/EE 62.36863 -113.10562 12:30 -9999 Forest Lowland Black Spruce 1 Moist Singed_moss 1 0 5 20.5 25.5 40 not_provided 2 not_provided 0 not_provided 0 not_provided 2 not_provided 8 not_provided 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 4 10X10 2016-08-06 SE/LBC/EE 62.36869 -113.10638 13:30 1 Forest Lowland Black Spruce 1 Moist Singed_moss 0.5 4 4 30.5 39 40 Even 5 Even 0 not_provided 0 not_provided 25 Even 10 Even 0 not_provided 0 not_provided Equisetum 10 Patchy Liverwart 5 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 5 10X10 2016-08-06 SE/LBC/EE 62.36883 -113.10627 14:00 1 Forest Treed Fen 1 Moist charred_moss 1 3 6 30 40 40 Even 5 Even 0 not_provided 0 not_provided 15 Even 10 Even 0 not_provided 0 not_provided Liverwart 2 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF17-130 6 5X5 2016-08-06 SE/LBC/EE 62.36902 -113.10609 14:30 3 Forest Lowland Black Spruce 3 Moist Singed_moss 2 3 4 11 20 15 Even 5 Even 0 not_provided 0 not_provided 8 Even 3 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 1 10X10 2016-07-10 EE/SE 61.715069 -116.890722 9:20 15 Forest Bog 15 Moist live_moss 0.5 0 9.5 4 15 35 Even 10 Even 0 not_provided 0 not_provided 15 Patchy 5 Patchy 0 not_provided 0 not_provided Other Moss 40 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 2 10X10 2016-07-11 EE/SE 61.715212 -116.891106 10:15 10 Forest Bog 10 Moist not_provided -9999 0.5 6 7.5 14 40 Even 8 Patchy 0 not_provided 0 not_provided 15 Patchy 3 Patchy 0 not_provided 0 not_provided Other Moss 25 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 3 10X10 2016-07-12 EE/SE 61.715351 -116.891451 10:45 5 Forest Bog 5 Moist Burned_moss 1.5 0 4 7 12.5 10 Even 3 Patchy 0 not_provided 2 Center 40 Patchy 3 Patchy 0 not_provided 0 not_provided Other Moss 14 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 4 10X10 2016-07-13 EE/SE 61.715494 -116.890002 11:30 30 Forest Bog 30 Moist Burned_moss 1 0 8 23 32 20 Patchy 5 Patchy 0 not_provided 0 not_provided 80 Even 2 Patchy 0 not_provided 0 not_provided Other Moss 50 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 5 10X10 2016-07-14 EE/SE 61.715647 -116.890393 11:00 25 Forest Bog 25 Moist live_moss 0.5 0 4 13 17.5 10 Patchy 2 Patchy 0 not_provided 0 not_provided 50 Even 10 Patchy 0 not_provided 0 not_provided Other Moss 45 Patchy not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-10 6 10X10 2016-07-15 EE/SE 61.715772 -116.890741 11:00 0 Forest Bog 0 Moist live_moss 0.5 0 5.5 13 19 20 Patchy 5 Patchy 0 not_provided 0 not_provided 40 Patchy 5 Patchy 0 not_provided 0 not_provided Other 35 Peripheral not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 1 10X10 2016-07-09 EES/EK/EE/SE 61.69424 -116.92611 14:58 20 Shrub Fen 20 Moist Charred_moss 1 0 4 20 25 10 Even 5 Even 80 Even 0 not_provided 60 Even 2 Even 0 not_provided 0 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 2 10X10 2016-07-09 EE/SE 61.69436 -116.92633 15:46 25 Shrub Fen 30 Moist Charred_moss 0 0 6 20 26 40 Even 5 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided 0 not_provided Other Moss 20 Patchy Sedges 80 Even not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 3 10X10 2016-07-09 EE/SE 61.69452 -116.92653 16:15 35 Shrub Fen 40 Moist Burned_moss 0.5 0 5 34.5 40 40 Even 0 not_provided 0 not_provided 0 not_provided 0 not_provided 5 not_provided 0 not_provided 0 not_provided Other Moss 20 Patchy Sedges 60 Even not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 4 10X10 2016-07-09 EE/SE 61.69397 -116.92666 17:45 45 Shrub Fen 50 Moist Singed_moss 1 0 10 20 31 50 Even 5 Patchy 0 not_provided 0 not_provided 0 not_provided 5 Patchy 0 not_provided 0 not_provided Other Moss 10 Patchy Sedges 70 Even not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 5 10X10 2016-07-09 EE/SE 61.69407 -116.92696 17:04 40 Shrub Fen 45 Moist Burned_moss 0.5 0 6 33.5 40 0 not_provided 5 Even 0 not_provided 0 not_provided 0 -999 10 Even 0 not_provided 0 not_provided Sedge 40 Even Other Moss 10 Patchy not_provided -9999 not_provided not_provided -9999 not_provided +ZF20-105 6 10X10 2016-07-09 EE/SE 61.69422 -116.92722 16:40 40 Shrub Fen 50 Moist Live_moss 0.5 0 6 26.5 33 0 not_provided 5 Patchy 0 not_provided 0 not_provided 0 not_provided 20 Even 0 not_provided 0 not_provided Sedge 80 Even Moss 30 Even not_provided -9999 not_provided not_provided -9999 not_provided diff --git a/tests/test_annotators/test_bioportal_schema_annotator.py b/tests/test_annotators/test_bioportal_schema_annotator.py index 053c3fe..61b7673 100644 --- a/tests/test_annotators/test_bioportal_schema_annotator.py +++ b/tests/test_annotators/test_bioportal_schema_annotator.py @@ -12,6 +12,8 @@ from schema_automator.annotators.schema_annotator import SchemaAnnotator from linkml.generators.yamlgen import YAMLGenerator + +from schema_automator.generalizers.generalizer import DEFAULT_SCHEMA_NAME from tests import INPUT_DIR, OUTPUT_DIR @@ -33,8 +35,8 @@ def setUp(self) -> None: self.annotator = SchemaAnnotator(impl) def test_ann(self): - s = SchemaDefinition(id='test', name='test') - sb = SchemaBuilder(s) + sb = SchemaBuilder(DEFAULT_SCHEMA_NAME) + s = sb.schema sb.add_class('Gene').add_slot('symbol') # TODO: use add_enum e = EnumDefinition('GeneType') diff --git a/tests/test_generalizers/test_pandas_data_generalizer.py b/tests/test_generalizers/test_pandas_data_generalizer.py new file mode 100644 index 0000000..d210f23 --- /dev/null +++ b/tests/test_generalizers/test_pandas_data_generalizer.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- + +"""Test the module can be imported.""" + +import unittest + +from schema_automator.generalizers.generalizer import DEFAULT_CLASS_NAME +from schema_automator.generalizers.pandas_generalizer import PandasDataGeneralizer +import pandas as pd + +from schema_automator.utils import write_schema + + +class TestPandasDataGeneralizer(unittest.TestCase): + """Tests generalization from RDF triples """ + + def test_from_pandas(self): + ie = PandasDataGeneralizer() + expected = [ + ([5, 10, 20], 'integer'), + (["a", "b", "c"], 'string'), + (pd.to_datetime(["2010", "2011", "2012"]), 'datetime'), + ([5.5, 10, 20], 'float') + ] + n = 1 + items = {} + expected_types = {} + for vals, expected_type in expected: + col_name = f"column{n}" + items[col_name] = vals + expected_types[col_name] = expected_type + n += 1 + df = pd.DataFrame(items) + schema = ie.convert(df, schema_name='my_schema') + #write_schema(schema) + c = schema.classes[DEFAULT_CLASS_NAME] + for col_name, expected_type in expected_types.items(): + self.assertEqual(expected_type, c.attributes[col_name].range) + +