pyinaturalist

Python client for iNaturalist

https://github.com/pyinat/pyinaturalist

Science Score: 26.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Committers with academic emails
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (13.9%) to scientific vocabulary

Keywords

api api-client biodiversity biodiversity-data biodiversity-informatics citizen-science inaturalist python

Keywords from Contributors

interactive projection photovoltaic sustainability carbon-emissions distribution transformers integral sequences generic
Last synced: 6 months ago · JSON representation

Repository

Python client for iNaturalist

Basic Info
Statistics
  • Stars: 148
  • Watchers: 10
  • Forks: 17
  • Open Issues: 23
  • Releases: 12
Topics
api api-client biodiversity biodiversity-data biodiversity-informatics citizen-science inaturalist python
Created over 7 years ago · Last pushed 6 months ago
Metadata Files
Readme Changelog Contributing License Code of conduct

README.md

pyinaturalist

Build Codecov Documentation

PyPI Conda PyPI - Python Versions

Run with Binder Open in VSCode


Introduction

iNaturalist is a community science platform that helps people get involved in the natural world by observing and identifying the living things around them. Collectively, the community produces a rich source of global biodiversity data that can be valuable to anyone from hobbyists to scientists.

pyinaturalist is a client for the iNaturalist API that makes these data easily accessible in the python programming language.

Features

  • ➡️ Easier requests: Simplified request formats, easy pagination, and complete request parameter type annotations for better IDE integration
  • ⬅️ Convenient responses: Type conversions to the things you would expect in python, and an optional object-oriented interface for response data
  • 🔒 Security: Keyring integration for secure credential storage
  • 📗 Docs: Example requests, responses, scripts, and Jupyter notebooks to help get you started
  • 💚 Responsible use: Follows the API Recommended Practices by default, so you can be nice to the iNaturalist servers and not worry about rate-limiting errors
  • 🧪 Testing: A dry-run testing mode to preview your requests before potentially modifying data

Supported Endpoints

Many of the most relevant API endpoints are supported, including: * 📝 Annotations and observation fields * 🆔 Identifications * 💬 Messages * 👀 Observations (multiple formats) * 📷 Observation photos + sounds * 📊 Observation histograms, observers, identifiers, life lists, and species counts * 📍 Places * 👥 Projects * 🐦 Species * 👤 Users

Quickstart

Here are usage examples for some of the most commonly used features.

First, install with pip: bash pip install pyinaturalist

Then, import the main API functions: python from pyinaturalist import *

Search observations

Let's start by searching for all your own observations. There are numerous fields you can search on, but we'll just use user_id for now: ```python

observations = getobservations(userid='my_username') ```

The full response will be in JSON format, but we can use pyinaturalist.pprint() to print out a summary: ```python

for obs in observations['results']: pprint(obs) ID Taxon Observed on User Location ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 117585709 Genus: Hyoscyamus (henbanes) May 18, 2022 niconoe Calvi, France 117464920 Genus: Omophlus May 17, 2022 niconoe Galéria, France 117464393 Genus: Briza (Rattlesnake Grasses) May 17, 2022 niconoe Galéria, France ... ```

You can also get observation counts by species. On iNaturalist.org, this information can be found on the 'Species' tab of search results. For example, to get species counts of all your own research-grade observations: ```python

counts = getobservationspeciescounts(userid='myusername', qualitygrade='research') pprint(counts) ID Rank Scientific name Common name Count ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 47934 species 🐛 Libellula luctuosa Widow Skimmer 7 48627 species 🌻 Echinacea purpurea Purple Coneflower 6 504060 species 🍄 Pleurotus citrinopileatus Golden Oyster Mushroom 6 ... ```

Another useful format is the observation histogram, which shows the number of observations over a given interval. The default is month_of_year: ```python

histogram = getobservationhistogram(userid='myusername') print(histogram) { 1: 8, # January 2: 1, # February 3: 19, # March ..., # etc. } ```

Create and update observations

To create or modify observations, you will first need to log in. This requires creating an iNaturalist app, which will be used to get an access token. python token = get_access_token( username='my_username', password='my_password', app_id='my_app_id', app_secret='my_app_secret', ) See Authentication for more options including environment variables, keyrings, and password managers.

Now we can create a new observation: ```python from datetime import datetime

response = createobservation( taxonid=54327, # Vespa Crabro observedonstring=datetime.now(), timezone='Brussels', description='This is a free text comment for the observation', taglist='wasp, Belgium', latitude=50.647143, longitude=4.360216, positionalaccuracy=50, # GPS accuracy in meters accesstoken=token, photos=['~/observations/wasp1.jpg', '~/observations/wasp2.jpg'], sounds=['~/observations/recording.mp3'], )

Save the new observation ID

newobservationid = response[0]['id'] ```

We can then update the observation information, photos, or sounds: python update_observation( new_observation_id, access_token=token, description='updated description !', photos='~/observations/wasp_nest.jpg', sounds='~/observations/wasp_nest.mp3', )

Search species

Let's say you partially remember either a genus or family name that started with 'vespi'-something. The taxa endpoint can be used to search by name, rank, and several other criteria ```python

response = get_taxa(q='vespi', rank=['genus', 'family']) ```

As with observations, there is a lot of information in the response, but we'll print just a few basic details: ```python

pprint(response) [52747] Family: Vespidae (Hornets, Paper Wasps, Potter Wasps, and Allies) [92786] Genus: Vespicula [84737] Genus: Vespina ... ```

Next Steps

For more information, see:

  • User Guide: introduction and general features that apply to most endpoints
  • Endpoint Summary: a complete list of endpoints wrapped by pyinaturalist
  • Examples: data visualizations and other examples of things to do with iNaturalist data
  • Reference: Detailed API documentation
  • Contributing Guide: development details for anyone interested in contributing to pyinaturalist
  • History: details on past and current releases
  • Issues: planned & proposed features

Feedback

If you have any problems, suggestions, or questions about pyinaturalist, you are welcome to create an issue or discussion. Also, PRs are welcome!

Note: pyinaturalist is developed by members of the iNaturalist community, and is not endorsed by iNaturalist.org or the California Academy of Sciences. If you have non-python-specific questions about the iNaturalist API or iNaturalist in general, the iNaturalist Community Forum is the best place to start.

Related Projects

Other python projects related to iNaturalist:

  • naturtag: A desktop application for tagging image files with iNaturalist taxonomy & observation metadata
  • pyinaturalist-convert: Tools to convert observation data to and from a variety of useful formats
  • pyinaturalist-notebook: Jupyter notebook Docker image for pyinaturalist
  • dronefly: A Discord bot with iNaturalist integration, used by the iNaturalist Discord server.

Owner

  • Name: pyinat
  • Login: pyinat
  • Kind: organization
  • Location: United States of America

Python tools for interacting with iNaturalist

GitHub Events

Total
  • Create event: 16
  • Release event: 1
  • Issues event: 13
  • Watch event: 11
  • Delete event: 17
  • Issue comment event: 28
  • Push event: 47
  • Pull request event: 35
  • Fork event: 2
Last Year
  • Create event: 16
  • Release event: 1
  • Issues event: 13
  • Watch event: 11
  • Delete event: 17
  • Issue comment event: 28
  • Push event: 47
  • Pull request event: 35
  • Fork event: 2

Committers

Last synced: 6 months ago

All Time
  • Total Commits: 915
  • Total Committers: 12
  • Avg Commits per committer: 76.25
  • Development Distribution Score (DDS): 0.101
Past Year
  • Commits: 28
  • Committers: 3
  • Avg Commits per committer: 9.333
  • Development Distribution Score (DDS): 0.143
Top Committers
Name Email Commits
Jordan Cook j****k@p****m 823
Nicolas Noé n****s@n****u 52
dependabot[bot] 4****] 18
Nicolas Noé n****e@i****e 6
Will Kuhn k****l@g****m 4
Darren Kirby b****r@g****m 4
Peter Desmet p****k@g****m 3
Richard Littauer r****r@g****m 1
Eduardo Ramírez e****0@g****m 1
Ben Armstrong s****g@d****g 1
Stijn Van Hoey s****y@i****e 1
Eduardo e****z@a****m 1
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 218
  • Total pull requests: 437
  • Average time to close issues: 3 months
  • Average time to close pull requests: 7 days
  • Total issue authors: 29
  • Total pull request authors: 8
  • Average comments per issue: 2.01
  • Average comments per pull request: 0.77
  • Merged pull requests: 319
  • Bot issues: 1
  • Bot pull requests: 187
Past Year
  • Issues: 7
  • Pull requests: 32
  • Average time to close issues: 2 days
  • Average time to close pull requests: 13 days
  • Issue authors: 5
  • Pull request authors: 3
  • Average comments per issue: 1.29
  • Average comments per pull request: 0.59
  • Merged pull requests: 9
  • Bot issues: 0
  • Bot pull requests: 24
Top Authors
Issue Authors
  • JWCook (156)
  • synrg (11)
  • arky (10)
  • niconoe (9)
  • nigelcharman (4)
  • abubelinha (3)
  • svshepherd (2)
  • AugustT (2)
  • aubreymoore (1)
  • peterdesmet (1)
  • FelipeSBarros (1)
  • nleguillarme (1)
  • jhuus (1)
  • jwidness (1)
  • dependabot[bot] (1)
Pull Request Authors
  • JWCook (236)
  • dependabot[bot] (187)
  • DarrenKirby (6)
  • eduramirezh (2)
  • LucaCappelletti94 (2)
  • willkuhn (2)
  • RichardLitt (1)
  • synrg (1)
Top Labels
Issue Labels
enhancement (87) new endpoint (42) bug (34) docs (26) logistics (23) question (12) examples (11) refactoring (2) good first issue (2) wontfix (2) tests (1) dependencies (1) github_actions (1)
Pull Request Labels
enhancement (112) dependencies (100) python (83) docs (42) new endpoint (32) bug (30) logistics (26) github_actions (17) examples (7) refactoring (6) tests (3)

Packages

  • Total packages: 3
  • Total downloads:
    • pypi 3,019 last-month
  • Total dependent packages: 5
    (may contain duplicates)
  • Total dependent repositories: 16
    (may contain duplicates)
  • Total versions: 101
  • Total maintainers: 2
proxy.golang.org: github.com/pyinat/pyinaturalist
  • Versions: 26
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Dependent packages count: 5.4%
Average: 5.6%
Dependent repos count: 5.8%
Last synced: 6 months ago
pypi.org: pyinaturalist

iNaturalist API client for python

  • Versions: 69
  • Dependent Packages: 4
  • Dependent Repositories: 15
  • Downloads: 3,019 Last month
Rankings
Dependent packages count: 1.6%
Dependent repos count: 3.8%
Stargazers count: 6.9%
Average: 7.3%
Forks count: 10.6%
Downloads: 13.5%
Maintainers (2)
Last synced: 6 months ago
conda-forge.org: pyinaturalist
  • Versions: 6
  • Dependent Packages: 1
  • Dependent Repositories: 1
Rankings
Dependent repos count: 24.3%
Dependent packages count: 29.0%
Average: 33.4%
Stargazers count: 35.2%
Forks count: 44.9%
Last synced: 6 months ago

Dependencies

poetry.lock pypi
  • 130 dependencies
pyproject.toml pypi
  • coverage >=6.3 develop
  • nox ^2022.1.7 develop
  • nox-poetry ^1.0.0 develop
  • pre-commit ^2.19 develop
  • pretty-errors ^1.2.23 develop
  • pytest ^7.0 develop
  • pytest-asyncio ^0.18.1 develop
  • pytest-cov >=3.0 develop
  • pytest-xdist >=2.2 develop
  • requests-mock ^1.8 develop
  • sphinx-autobuild >=2021.3.14 develop
  • attrs >=21.2
  • furo ^2022.2.14.1
  • ipython ^7.25.0
  • keyring >=22.3
  • linkify-it-py ^1.0.1
  • myst-parser ^0.17.0
  • nbsphinx ^0.8.5
  • platformdirs >=2.5
  • python ^3.7
  • python-dateutil >=2.0
  • python-forge >=18.6
  • requests >=2.22
  • requests-cache >=1.0.0a1
  • requests-ratelimiter >=0.3.2
  • rich >=10.9
  • sphinx ^4.2.0
  • sphinx-autodoc-typehints ^1.17
  • sphinx-automodapi ^0.14
  • sphinx-copybutton >=0.5
  • sphinx-inline-tabs ^2022.1.2b11
  • sphinx-panels ^0.6.0
  • sphinxcontrib-apidoc ^0.3
.github/workflows/build.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-python v4 composite
  • codecov/codecov-action v3 composite
  • pre-commit/action v3.0.0 composite
  • snok/install-poetry v1.3 composite
.github/workflows/deploy.yml actions
  • actions/checkout v3 composite
  • actions/setup-python v4 composite
  • snok/install-poetry v1.3 composite
Dockerfile docker
  • jxcook/pyinaturalist-notebook 0.14 build
docker-compose.yml docker
  • jxcook/pyinaturalist-notebook latest