Regional observation stats

This example shows how to get some general statistics on all observations in a given region. See https://www.inaturalist.org/places to find place IDs.

[1]:
from time import sleep

import altair as alt
import pandas as pd
from IPython.display import Image
from pyinaturalist.node_api import (
    get_observations,
    get_observation_species_counts,
    get_observation_observers,
    get_observation_identifiers,
)
from pyinaturalist.request_params import ICONIC_TAXA


# Adjustable values
PLACE_ID = 6
PLACE_NAME = 'Alaska'

General stats

Total observations, unique taxa, identifiers, and observers

[2]:
total_observations = get_observations(
    place_id=PLACE_ID,
    verifiable=True,
    per_page=0,
)['total_results']
print(f'Total observations: {total_observations}')

total_taxa = get_observation_species_counts(
    place_id=PLACE_ID,
    verifiable=True,
    per_page=0,
)['total_results']
print(f'Total taxa observed: {total_taxa}')

total_identifiers = get_observation_identifiers(place_id=PLACE_ID, per_page=0)['total_results']
print(f'Total identifiers: {total_identifiers}')

total_observers = get_observation_observers(place_id=PLACE_ID, per_page=0)['total_results']
print(f'Total observers: {total_observers}')
Total observations: 160888
Total taxa observed: 5868
Total identifiers: 5003
Total observers: 5972

Stats by iconic taxon

Show a breakdown of observations and taxa observed for each of the iconic taxa (major species groups), using their corresponding icons on iNaturalist. Here are a couple helper functions to make this easier:

[3]:
THROTTLING_DELAY = 1.0  # Time to wait in between subsequent requests
TAXON_IMAGE_URL = 'https://raw.githubusercontent.com/inaturalist/inaturalist/main/app/assets/images/iconic_taxa/{taxon}-75px.png'
iconic_taxa = list(ICONIC_TAXA.values())
iconic_taxa.remove('Unknown')


# Run one search for each iconic taxon
def get_iconic_taxa_counts(function):
    iconic_taxa_counts = {}
    for taxon_name in iconic_taxa:
        total_taxon_observations = function(
            place_id=PLACE_ID,
            iconic_taxa=taxon_name,
            verifiable=True,
            per_page=0,
        )['total_results']

        iconic_taxa_counts[taxon_name] = total_taxon_observations
        print(f'Total results for {taxon_name}: {total_taxon_observations}')
        if taxon_name != iconic_taxa[-1]:
            sleep(THROTTLING_DELAY)
    return iconic_taxa_counts


def get_iconic_icon(taxon_name):
    return TAXON_IMAGE_URL.format(taxon=taxon_name.lower())

Observations

[4]:
total_observations_by_iconic_taxon = get_iconic_taxa_counts(get_observations)

# Create a chart, sorted by number of observations, using the appropriate iNaturalist icons
observations_df = pd.DataFrame([
    {'iconic taxon': k, 'observations': v, 'img': get_iconic_icon(k)}
    for k, v in total_observations_by_iconic_taxon.items()
])
alt.Chart(
    observations_df,
    title=f'Verifiable observations in {PLACE_NAME} by iconic taxon',
    width=750,
    height=500,
).mark_image().encode(
    x=alt.X('iconic taxon:N', sort='-y'),
    y='observations:Q',
    url='img'
)
Total results for Animalia: 9427
Total results for Aves: 28266
Total results for Amphibia: 380
Total results for Reptilia: 4
Total results for Mammalia: 9825
Total results for Actinopterygii: 2215
Total results for Mollusca: 5810
Total results for Arachnida: 1882
Total results for Insecta: 17786
Total results for Plantae: 63246
Total results for Fungi: 20499
Total results for Chromista: 951
Total results for Protozoa: 479
[4]:

Taxa

[5]:
total_taxa_by_iconic_taxon = get_iconic_taxa_counts(get_observation_species_counts)

# Create a chart, sorted by number of observations, using the appropriate iNaturalist icons
taxa_df = pd.DataFrame([
    {'iconic taxon': k, 'unique taxa': v, 'img': get_iconic_icon(k)}
    for k, v in total_taxa_by_iconic_taxon.items()
])
alt.Chart(
    taxa_df,
    title=f'Unique taxa observed in {PLACE_NAME} by iconic taxon',
    width=750,
    height=500,
).mark_image().encode(
    x=alt.X('iconic taxon:N', sort='-y'),
    y='unique taxa:Q',
    url='img'
)
Total results for Animalia: 550
Total results for Aves: 346
Total results for Amphibia: 7
Total results for Reptilia: 2
Total results for Mammalia: 80
Total results for Actinopterygii: 143
Total results for Mollusca: 295
Total results for Arachnida: 131
Total results for Insecta: 1196
Total results for Plantae: 1791
Total results for Fungi: 1195
Total results for Chromista: 96
Total results for Protozoa: 26
[5]:
[6]:
# Including the rendered image so the chart will display outside Jupyter, e.g. on GitHub's notebook viewer
Image('images/total_observations_by_iconic_taxon.png')
[6]:
../_images/examples_Data_Visualizations_-_Regional_Observation_Stats_10_0.png
[7]:
Image('images/total_taxa_by_iconic_taxon.png')
[7]:
../_images/examples_Data_Visualizations_-_Regional_Observation_Stats_11_0.png