Intro to pyinaturalist¶
This is a work in progress!
This will give a quick introduction to things you can do using data from your own iNaturalist observations.
[1]:
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
from IPython.display import Image
from typing import Any, BinaryIO, Dict, Iterable, List, Optional, Tuple
import altair as alt
import pandas as pd
import ipyplot
import requests_cache
from rich import print
from pyinaturalist import (
ICONIC_TAXA,
Observation,
get_observations,
get_observation_histogram,
get_observation_species_counts,
get_observation_observers,
get_observation_identifiers,
pprint,
)
# Use requests-cache to save data from the iNat API
requests_cache.install_cache()
Exploring observations¶
This section will cover how to work with observation data. Let’s start by searching for all of your own observations:
[2]:
# Replace with your own username
USERNAME = 'jkcook'
response = get_observations(user_id=USERNAME, page='all')
my_observations = Observation.from_json_list(response)
Take a look at one of the observations to see what information it contains:
[3]:
print(my_observations[0])
Observation( id=30688807, created_at=datetime.datetime(2019, 8, 12, 15, 22, 47, tzinfo=tzlocal()), captive=False, community_taxon_id=78444, description='Located in Green Meadows West Prairie\n\nSpecies IDs:\nhttps://sites.google.com/site/gmwprairie/gmw-prairie-flora', faves=[], geoprivacy=None, identifications_count=1, identifications_most_agree=True, identifications_most_disagree=False, identifications_some_agree=True, license_code='CC-BY-NC', location=(41.67206561, -93.72957587), mappable=True, num_identification_agreements=1, num_identification_disagreements=0, oauth_application_id=2, obscured=False, observed_on=datetime.datetime(2019, 8, 12, 10, 16, tzinfo=tzoffset('Etc/UTC', 0)), outlinks=[{'source': 'GBIF', 'url': 'http://www.gbif.org/occurrence/2429228652'}], out_of_range=None, owners_identification_from_vision=False, place_guess='Johnston, IA, USA', place_ids=[ 1, 24, 1582, 9853, 59613, 64422, 64423, 66741, 82256, 97394, 116535, 129109, 137509, 154492, 155074 ], positional_accuracy=12, preferences={'prefers_community_taxon': None}, project_ids=[48611], project_ids_with_curator_id=[], project_ids_without_curator_id=[48611], public_positional_accuracy=12, quality_grade='research', quality_metrics=[], reviewed_by=[1436999, 2115051], site_id=1, sounds=[], species_guess='Rocky Mountain bee plant', tags=[], updated_at=datetime.datetime(2019, 10, 16, 3, 43, 4, tzinfo=tzlocal()), uri='https://www.inaturalist.org/observations/30688807', uuid='aea799e1-4754-4eaf-adca-84720cdeaeb2', votes=[], annotations=[ Annotation( id=None, concatenated_attr_val='12|13', controlled_attribute_id=12, controlled_value_id=13, user_id=2115051, uuid='1c27e7ea-e763-4997-aad6-ac6b77ebd0b5', vote_score=0, votes=[], user=User( id=2115051, activity_count=1298, created_at=datetime.datetime(2019, 8, 10, 17, 52, 1, tzinfo=tzlocal()), icon='https://static.inaturalist.org/attachments/users/icons/2115051/thumb.jp eg?1591994381', icon_url='https://static.inaturalist.org/attachments/users/icons/2115051/medi um.jpeg?1591994381', identifications_count=550, journal_posts_count=0, login='jkcook', name='Jordan Cook', observations_count=748, orcid=None, roles=[], site_id=1, species_count=383 ) ) ], comments=[], identifications=[ Identification( id=66501609, body=None, category='improving', created_at=datetime.datetime(2019, 8, 12, 15, 22, 47, tzinfo=tzlocal()), current=True, current_taxon=None, disagreement=False, hidden=False, own_observation=True, previous_observation_taxon_id=78444, taxon_change=None, taxon_id=78444, uuid='f075447a-addd-4586-bcaa-2a2efafc4b2a', vision=False, taxon=Taxon( id=78444, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275, 71409, 72284], complete_rank=None, complete_species_count=None, created_at=datetime.datetime(2011, 5, 13, 21, 44, 8, tzinfo=tzlocal()), current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Peritoma serrulata', names=[], observations_count=1593, parent_id=72284, preferred_common_name='Rocky Mountain bee plant', preferred_establishment_means=None, rank_level=10, rank='species', taxon_changes_count=2, taxon_schemes_count=3, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Cleome_serrulata', ancestors=[ Taxon( id=47126, ancestor_ids=[48460, 47126], complete_rank='phylum', complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Plantae', names=[], observations_count=35230646, parent_id=48460, preferred_common_name='plants', preferred_establishment_means=None, rank_level=70, rank='kingdom', taxon_changes_count=3, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=73850536, attribution='(c) United Soybean Board, some rights reserved (CC BY)', license_code='CC-BY', original_dimensions=(0, 0), url='https://live.staticflickr.com/7296/9629679955_1f60222a31_s.j pg' ), establishment_means=None, taxon_photos=[] ), Taxon( id=211194, ancestor_ids=[48460, 47126, 211194], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Tracheophyta', names=[], observations_count=33966191, parent_id=47126, preferred_common_name='vascular plants', preferred_establishment_means=None, rank_level=60, rank='phylum', taxon_changes_count=2, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Vascular_plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=2676090, attribution='(c) John Rusk, some rights reserved (CC BY-NC-SA)', license_code='CC-BY-NC-SA', original_dimensions=(2048, 1638), url='https://inaturalist-open-data.s3.amazonaws.com/photos/267609 0/square.jpg?1545625783' ), establishment_means=None, taxon_photos=[] ), Taxon( id=47125, ancestor_ids=[48460, 47126, 211194, 47125], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Angiospermae', names=[], observations_count=31986033, parent_id=211194, preferred_common_name='flowering plants', preferred_establishment_means=None, rank_level=57, rank='subphylum', taxon_changes_count=4, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='https://en.wikipedia.org/wiki/Flowering_plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=76190817, attribution='(c) lauriesibley, some rights reserved (CC BY-NC)', license_code='CC-BY-NC', original_dimensions=(1536, 2048), url='https://inaturalist-open-data.s3.amazonaws.com/photos/761908 17/square.jpg?1590955037' ), establishment_means=None, taxon_photos=[] ), Taxon( id=47124, ancestor_ids=[48460, 47126, 211194, 47125, 47124], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Magnoliopsida', names=[], observations_count=26754855, parent_id=47125, preferred_common_name='dicots', preferred_establishment_means=None, rank_level=50, rank='class', taxon_changes_count=4, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Magnoliopsida', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=21222899, attribution='(с) Sweetbay_Magnolia_Magnolia_virginiana_Flower_Closeup_2242px.jpg, некоторые права защищены (CC BY-SA)', license_code='CC-BY-SA', original_dimensions=(1364, 2048), url='https://inaturalist-open-data.s3.amazonaws.com/photos/212228 99/square.jpg?1545843588' ), establishment_means=None, taxon_photos=[] ), Taxon( id=71275, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Brassicales', names=[], observations_count=766110, parent_id=47124, preferred_common_name='mustards, capers, and allies', preferred_establishment_means=None, rank_level=40, rank='order', taxon_changes_count=0, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Brassicales', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=11686, attribution='(c) birdgal5, some rights reserved (CC BY-NC-ND)', license_code='CC-BY-NC-ND', original_dimensions=(500, 335), url='https://inaturalist-open-data.s3.amazonaws.com/photos/11686/ square.jpg?1545356884' ), establishment_means=None, taxon_photos=[] ), Taxon( id=71409, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275, 71409], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Cleomaceae', names=[], observations_count=21260, parent_id=71275, preferred_common_name='spider flower family', preferred_establishment_means=None, rank_level=30, rank='family', taxon_changes_count=0, taxon_schemes_count=1, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Cleomaceae', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=4735709, attribution='(c) Steven Mlodinow, some rights reserved (CC BY-NC)', license_code='CC-BY-NC', original_dimensions=(2048, 1760), url='https://inaturalist-open-data.s3.amazonaws.com/photos/473570 9/square.jpg?1472744667' ), establishment_means=None, taxon_photos=[] ), Taxon( id=72284, ancestor_ids=[ 48460, 47126, 211194, 47125, 47124, 71275, 71409, 72284 ], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Peritoma', names=[], observations_count=7981, parent_id=71409, preferred_common_name='', preferred_establishment_means=None, rank_level=20, rank='genus', taxon_changes_count=0, taxon_schemes_count=1, wikipedia_summary=None, wikipedia_url=None, ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=161686, attribution='(c) J Brew, some rights reserved (CC BY-SA), uploaded by John Brew', license_code='CC-BY-SA', original_dimensions=(2048, 1536), url='https://inaturalist-open-data.s3.amazonaws.com/photos/161686 /square.jpg?1444555217' ), establishment_means=None, taxon_photos=[] ) ], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=736910, attribution='(c) J. N. Stuart, all rights reserved, uploaded by James N. Stuart', license_code=None, original_dimensions=(1463, 2048), url='https://static.inaturalist.org/photos/736910/square.jpg?1444499201' ), establishment_means=None, taxon_photos=[] ), user=User( id=2115051, activity_count=1298, created_at=datetime.datetime(2019, 8, 10, 17, 52, 1, tzinfo=tzlocal()), icon='https://static.inaturalist.org/attachments/users/icons/2115051/thumb.jp eg?1591994381', icon_url='https://static.inaturalist.org/attachments/users/icons/2115051/medi um.jpeg?1591994381', identifications_count=550, journal_posts_count=0, login='jkcook', name='Jordan Cook', observations_count=748, orcid=None, roles=[], site_id=1, species_count=383 ) ), Identification( id=74656703, body=None, category='supporting', created_at=datetime.datetime(2019, 10, 16, 3, 43, 4, tzinfo=tzlocal()), current=True, current_taxon=None, disagreement=False, hidden=False, own_observation=False, previous_observation_taxon_id=78444, taxon_change=None, taxon_id=78444, uuid='fc3caa4f-c774-4164-97b9-a94bed6a52d8', vision=False, taxon=Taxon( id=78444, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275, 71409, 72284], complete_rank=None, complete_species_count=None, created_at=datetime.datetime(2011, 5, 13, 21, 44, 8, tzinfo=tzlocal()), current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Peritoma serrulata', names=[], observations_count=1593, parent_id=72284, preferred_common_name='Rocky Mountain bee plant', preferred_establishment_means=None, rank_level=10, rank='species', taxon_changes_count=2, taxon_schemes_count=3, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Cleome_serrulata', ancestors=[ Taxon( id=47126, ancestor_ids=[48460, 47126], complete_rank='phylum', complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Plantae', names=[], observations_count=35230646, parent_id=48460, preferred_common_name='plants', preferred_establishment_means=None, rank_level=70, rank='kingdom', taxon_changes_count=3, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=73850536, attribution='(c) United Soybean Board, some rights reserved (CC BY)', license_code='CC-BY', original_dimensions=(0, 0), url='https://live.staticflickr.com/7296/9629679955_1f60222a31_s.j pg' ), establishment_means=None, taxon_photos=[] ), Taxon( id=211194, ancestor_ids=[48460, 47126, 211194], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Tracheophyta', names=[], observations_count=33966191, parent_id=47126, preferred_common_name='vascular plants', preferred_establishment_means=None, rank_level=60, rank='phylum', taxon_changes_count=2, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Vascular_plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=2676090, attribution='(c) John Rusk, some rights reserved (CC BY-NC-SA)', license_code='CC-BY-NC-SA', original_dimensions=(2048, 1638), url='https://inaturalist-open-data.s3.amazonaws.com/photos/267609 0/square.jpg?1545625783' ), establishment_means=None, taxon_photos=[] ), Taxon( id=47125, ancestor_ids=[48460, 47126, 211194, 47125], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Angiospermae', names=[], observations_count=31986033, parent_id=211194, preferred_common_name='flowering plants', preferred_establishment_means=None, rank_level=57, rank='subphylum', taxon_changes_count=4, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='https://en.wikipedia.org/wiki/Flowering_plant', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=76190817, attribution='(c) lauriesibley, some rights reserved (CC BY-NC)', license_code='CC-BY-NC', original_dimensions=(1536, 2048), url='https://inaturalist-open-data.s3.amazonaws.com/photos/761908 17/square.jpg?1590955037' ), establishment_means=None, taxon_photos=[] ), Taxon( id=47124, ancestor_ids=[48460, 47126, 211194, 47125, 47124], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Magnoliopsida', names=[], observations_count=26754855, parent_id=47125, preferred_common_name='dicots', preferred_establishment_means=None, rank_level=50, rank='class', taxon_changes_count=4, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Magnoliopsida', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=21222899, attribution='(с) Sweetbay_Magnolia_Magnolia_virginiana_Flower_Closeup_2242px.jpg, некоторые права защищены (CC BY-SA)', license_code='CC-BY-SA', original_dimensions=(1364, 2048), url='https://inaturalist-open-data.s3.amazonaws.com/photos/212228 99/square.jpg?1545843588' ), establishment_means=None, taxon_photos=[] ), Taxon( id=71275, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Brassicales', names=[], observations_count=766110, parent_id=47124, preferred_common_name='mustards, capers, and allies', preferred_establishment_means=None, rank_level=40, rank='order', taxon_changes_count=0, taxon_schemes_count=2, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Brassicales', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=11686, attribution='(c) birdgal5, some rights reserved (CC BY-NC-ND)', license_code='CC-BY-NC-ND', original_dimensions=(500, 335), url='https://inaturalist-open-data.s3.amazonaws.com/photos/11686/ square.jpg?1545356884' ), establishment_means=None, taxon_photos=[] ), Taxon( id=71409, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275, 71409], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Cleomaceae', names=[], observations_count=21260, parent_id=71275, preferred_common_name='spider flower family', preferred_establishment_means=None, rank_level=30, rank='family', taxon_changes_count=0, taxon_schemes_count=1, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Cleomaceae', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=4735709, attribution='(c) Steven Mlodinow, some rights reserved (CC BY-NC)', license_code='CC-BY-NC', original_dimensions=(2048, 1760), url='https://inaturalist-open-data.s3.amazonaws.com/photos/473570 9/square.jpg?1472744667' ), establishment_means=None, taxon_photos=[] ), Taxon( id=72284, ancestor_ids=[ 48460, 47126, 211194, 47125, 47124, 71275, 71409, 72284 ], complete_rank=None, complete_species_count=None, created_at=None, current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Peritoma', names=[], observations_count=7981, parent_id=71409, preferred_common_name='', preferred_establishment_means=None, rank_level=20, rank='genus', taxon_changes_count=0, taxon_schemes_count=1, wikipedia_summary=None, wikipedia_url=None, ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=161686, attribution='(c) J Brew, some rights reserved (CC BY-SA), uploaded by John Brew', license_code='CC-BY-SA', original_dimensions=(2048, 1536), url='https://inaturalist-open-data.s3.amazonaws.com/photos/161686 /square.jpg?1444555217' ), establishment_means=None, taxon_photos=[] ) ], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=736910, attribution='(c) J. N. Stuart, all rights reserved, uploaded by James N. Stuart', license_code=None, original_dimensions=(1463, 2048), url='https://static.inaturalist.org/photos/736910/square.jpg?1444499201' ), establishment_means=None, taxon_photos=[] ), user=User( id=1436999, activity_count=29800, created_at=datetime.datetime(2019, 1, 20, 16, 56, 1, tzinfo=tzlocal()), icon='https://static.inaturalist.org/attachments/users/icons/1436999/thumb.jp g?1548051751', icon_url='https://static.inaturalist.org/attachments/users/icons/1436999/medi um.jpg?1548051751', identifications_count=24017, journal_posts_count=0, login='colincroft', name='Colin Croft', observations_count=5783, orcid=None, roles=[], site_id=1, species_count=1515 ) ) ], ofvs=[], photos=[ Photo( id=47956314, attribution='(c) Jordan Cook, some rights reserved (CC BY-NC)', license_code='CC-BY-NC', original_dimensions=(1365, 2048), url='https://inaturalist-open-data.s3.amazonaws.com/photos/47956314/square.jpeg?1 565623377' ) ], project_observations=[ ProjectObservation( id=33209242, preferences={'allows_curator_coordinate_access': True}, project={'id': 48611}, user_id=2115051, uuid='0ae36f62-59e8-4b90-affd-eb1ddb437262', user=User( id=2115051, activity_count=1298, created_at=datetime.datetime(2019, 8, 10, 17, 52, 1, tzinfo=tzlocal()), icon='https://static.inaturalist.org/attachments/users/icons/2115051/thumb.jp eg?1591994381', icon_url='https://static.inaturalist.org/attachments/users/icons/2115051/medi um.jpeg?1591994381', identifications_count=550, journal_posts_count=0, login='jkcook', name='Jordan Cook', observations_count=748, orcid=None, roles=[], site_id=1, species_count=383 ) ) ], taxon=Taxon( id=78444, ancestor_ids=[48460, 47126, 211194, 47125, 47124, 71275, 71409, 72284, 78444], complete_rank=None, complete_species_count=None, created_at=datetime.datetime(2011, 5, 13, 21, 44, 8, tzinfo=tzlocal()), current_synonymous_taxon_ids=[], extinct=False, iconic_taxon_id=47126, iconic_taxon_name='Plantae', is_active=True, listed_taxa=[], listed_taxa_count=None, matched_term=None, name='Peritoma serrulata', names=[], observations_count=1593, parent_id=72284, preferred_common_name='Rocky Mountain bee plant', preferred_establishment_means=None, rank_level=10, rank='species', taxon_changes_count=2, taxon_schemes_count=3, wikipedia_summary=None, wikipedia_url='http://en.wikipedia.org/wiki/Cleome_serrulata', ancestors=[], children=[], conservation_status=None, conservation_statuses=[], default_photo=Photo( id=736910, attribution='(c) J. N. Stuart, all rights reserved, uploaded by James N. Stuart', license_code=None, original_dimensions=(1463, 2048), url='https://static.inaturalist.org/photos/736910/square.jpg?1444499201' ), establishment_means=None, taxon_photos=[] ), user=User( id=2115051, activity_count=1298, created_at=datetime.datetime(2019, 8, 10, 17, 52, 1, tzinfo=tzlocal()), icon='https://static.inaturalist.org/attachments/users/icons/2115051/thumb.jpeg?15919 94381', icon_url='https://static.inaturalist.org/attachments/users/icons/2115051/medium.jpeg? 1591994381', identifications_count=550, journal_posts_count=0, login='jkcook', name='Jordan Cook', observations_count=748, orcid=None, roles=[], site_id=1, species_count=383 ) )
Here is how some of those fields correspond to what you see on an observation page on iNaturalist.org:
You’ll notice that there are many more fields available; see the Observation docs for a complete list.
In many cases, you will want to quickly preview API results without looking through the full details for each result. pyinaturalist.pprint()
can be used to show a condensed table of almost all response types. Here’s an example with just the first 30 results:
[4]:
pprint(my_observations[:30])
ID Taxon ID Taxon Observed on User Location ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 30688807 78444 🌱 Species: Peritom… Aug 12, 2019 jkcook Johnston, IA, USA serrulata (Rocky Mountain bee plant) 30688955 47912 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Asclepias tuberosa (butterfly milkweed) 30689111 53317 🌱 Genus: Verbena Aug 12, 2019 jkcook Johnston, IA, USA (Vervain) 30689221 121968 🌽 Species: Aug 12, 2019 jkcook Johnston, IA, USA Andropogon gerardi (big bluestem) 30689306 121968 🌽 Species: Aug 12, 2019 jkcook Johnston, IA, USA Andropogon gerardi (big bluestem) 30689425 128701 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Desmanthus illinoensis (Illinois bundleflower) 30689463 121976 🌻 Species: Silphiu… Aug 12, 2019 jkcook Johnston, IA, USA laciniatum (compass plant) 30689506 136376 🌻 Species: Aug 12, 2019 jkcook Johnston, IA, USA Rudbeckia triloba (Brown-eyed Susan) 30689603 121976 🌻 Species: Silphiu… Aug 12, 2019 jkcook Johnston, IA, USA laciniatum (compass plant) 30689780 81594 🌾 Species: Elymus Aug 12, 2019 jkcook Johnston, IA, USA hystrix (bottlebrush grass) 30690105 127907 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Chamaecrista fasciculata (partridge pea) 30690175 141767 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Veronicastrum virginicum (Culver's root) 30690204 48678 🌼 Genus: Solidago Aug 12, 2019 jkcook Johnston, IA, USA (goldenrods) 30690327 128701 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Desmanthus illinoensis (Illinois bundleflower) 30726806 127186 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Securigera varia (purple crownvetch) 30727162 128695 🥕 Species: Eryngiu… Aug 12, 2019 jkcook Johnston, IA, USA yuccifolium (rattlesnake master) 30727377 136561 🌾 Form: Elymus Aug 12, 2019 jkcook Johnston, IA, USA canadensis glaucifolius 30727961 48662 🦋 Species: Danaus Aug 12, 2019 jkcook Green Meadows West plexippus (Monarch) Prairie 30728796 120215 🐝 Species: Bombus Aug 12, 2019 jkcook Green Meadows West griseocollis Prairie (Brown-belted Bumble Bee) 30728902 55556 🐛 Species: Aug 12, 2019 jkcook Green Meadows West Oncopeltus fasciatus Prairie (Large Milkweed Bug) 30729015 81599 🌻 Species: Silphiu… Aug 12, 2019 jkcook Green Meadows West perfoliatum (cup Prairie plant) 30729970 47911 🌱 Species: Aug 12, 2019 jkcook Johnston, IA, USA Asclepias syriaca (common milkweed) 30729981 130382 🌻 Species: Aug 12, 2019 jkcook Johnston, IA, USA Heliopsis helianthoides (false sunflower) 30730005 204330 🌱 Species: Iris Aug 12, 2019 jkcook Johnston, IA, USA domestica (Blackberry Lily) 30730009 128695 🥕 Species: Eryngiu… Aug 12, 2019 jkcook Johnston, IA, USA yuccifolium (rattlesnake master) 30730021 54781 🌳 Species: Quercus Aug 12, 2019 jkcook Johnston, IA, USA macrocarpa (bur oak) 30730033 127907 🌱 Species: Aug 12, 2019 jkcook Green Meadows West Chamaecrista Prairie fasciculata (partridge pea) 30730042 48627 🌻 Species: Aug 12, 2019 jkcook Johnston, IA, USA Echinacea purpurea (purple coneflower) 30730087 62741 🌻 Species: Aug 12, 2019 jkcook Johnston, IA, USA Rudbeckia hirta (black-eyed Susan) 30730133 53021 🌱 Species: Aug 12, 2019 jkcook Green Meadows West Convolvulus arvensis Prairie (field bindweed)
Observation Photos¶
We can also use ipyplot to preview observation images. Observation.photos
contains a list of Photo objects, and we can use those to get a thumnail URL for first photo from each observation. For image labels, just call str(observation)
to get a summary of the observation (who/what/when/where).
[5]:
images = [obs.photos[0].thumbnail_url for obs in my_observations[:15]]
labels = [str(obs) for obs in my_observations[:15]]
ipyplot.plot_images(images, labels)
We can even get a summary grouped by iconic taxon. Use ipyplot.plot_class_tabs
to group by label, and use Observation.taxon.iconic_taxon_name
as the image labels:
[6]:
images = [obs.photos[0].thumbnail_url for obs in my_observations]
labels = [obs.taxon.iconic_taxon_name for obs in my_observations]
ipyplot.plot_class_tabs(images, labels, max_imgs_per_tab=15)
Use Photo.show()
to see a larger photo from a single observation:
[9]:
my_observations[-4].photos[0].show()
Observation histogram¶
Next, let’s make a simple histogram to show your observations over time. We’ll do this with Pandas and Altair. Don’t worry if you’re not familiar with those tools, this is just to demonstrate the kinds of things you can do with your data.
[10]:
# Optionally limit it to just the last 3 years
start_date = datetime.now() - timedelta(365 * 3)
source = pd.DataFrame([
{'date': o.observed_on.isoformat(), 'iconic_taxon': o.taxon.iconic_taxon_name}
for o in my_observations
if o.observed_on.replace(tzinfo=None) >= start_date
])
alt.Chart(source).mark_bar().encode(
x='yearmonth(date):T',
y=alt.Y(
'count()',
scale=alt.Scale(type='log'),
axis=alt.Axis(title='Number of observations'),
),
)
[10]:
To get a bit more information, let’s break down the observations by category (iconic taxon):
[11]:
alt.Chart(source).mark_bar().encode(
x='yearmonth(date):T',
y=alt.Y(
'count()',
scale=alt.Scale(type='symlog'),
axis=alt.Axis(title='Number of observations'),
),
color='iconic_taxon',
)
[11]:
Observation map¶
Next, we can show the observations on a map.
Note: This example only shows observations in the US.
[12]:
from vega_datasets import data
source = pd.DataFrame([
{'latitude': o.location[0], 'longitude': o.location[1], 'iconic_taxon': o.taxon.iconic_taxon_name}
for o in my_observations
if o.location
])
# US states background
states = alt.topo_feature(data.us_10m.url, feature='states')
background = alt.Chart(states).mark_geoshape(
fill='lightgray',
stroke='white'
).properties(
width=850,
height=500
).project('albersUsa')
# Observation points
points = alt.Chart(source).mark_circle().encode(
longitude='longitude:Q',
latitude='latitude:Q',
)
# Show the combined background + points
background + points
[12]: