Mis fotos del año 2012

Python
pyinaturalist
Español
South Africa
Author

José R. Ferrer-Paris

Published

July 26, 2025

Modified

August 30, 2025

En el año 2012 estaba viviendo en Sudáfrica con mi familia. No estaba activo en iNaturalist, y mantenía la mayoría de mis fotos de fauna y flora en una computadora a la cuál ya no tengo acceso. En el proceso de organizar mi colección digital de fotos, he encontrado algunas pocas fotos de esa época entre respaldos viejos y duplicados.

Para poner estas observaciones de 2012 en contexto temporal de mis contribuciones a iNat, pueden revisar este gráfico

Después de terminar de actualizar mis observaciones de 2010, he decidido repetir el proceso para el año 2012.Este documento me permite visualizar las fotos que ya están en iNaturalist y así evitar subir fotos por duplicado.

Cargar módulos en Python

Importamos los módulos necesarios:

import pandas as pd
from datetime import datetime
from pyinaturalist import get_observations
import ipyplot

Y declaramos una función útil para leer los datos temporales de la respuesta del API de iNat:

def as_date(x):
    if type(x) == str:
        y = datetime.strptime(x, "%Y-%m-%d").date()
    else:
        y = datetime.date(x)
    return(y)

Descargar observaciones de iNaturalist

Usamos get_observations con un intervalo de fechas que incluye todo el año 2010:

observations = get_observations(user_id='NeoMapas', 
                                d1="2012-01-01",
                                d2="2012-12-31",
                                per_page=1000)

Este número aumenta a medida que cargamos observaciones en iNat:

len(observations['results'])

11

Usamos este loop para guardar la información básica de cada observación:

records=list()
for obs in observations['results']:
    record = {
        'uri':obs['uri'],
        'location': obs['place_guess'],
        'species guess': obs['species_guess'],
        'Fecha_obs': as_date(obs['observed_on']),
        'Fecha_reg': as_date(obs['created_at'])
    }
    if len(obs['observation_photos'])>0:
        record['url'] = obs['observation_photos'][0]['photo']['url'].replace("square","medium")
        record['attribution'] = obs['observation_photos'][0]['photo']['attribution']
    records.append(record)

Y las transformamos en un marco de datos de pandas:

inat_obs=pd.DataFrame(records)

Resumen de las observaciones

Agrupamos las observaciones por la localidad y obtenemos una tabla resumen de las observaciones del año:

aggfuns = {
    'Fecha_obs': ["min", "max"],
    'Fecha_reg': ["min", "max"],
    'species guess': ['count',pd.Series.nunique],
           }
inat_obs.groupby('location').agg(aggfuns).sort_values(('Fecha_obs','min'))

Fecha_obs Fecha_reg species guess
min max min max count nunique
location
Hout Bay, Cape Town, South Africa 2012-07-25 2012-07-25 2025-03-18 2025-03-18 2 2
Government Ave, Pretoria, 0002, South Africa 2012-09-02 2012-09-02 2025-03-18 2025-03-18 1 1
uMgungundlovu District Municipality, South Africa 2012-09-09 2012-09-09 2024-11-07 2024-11-07 7 7
Ehlanzeni District Municipality, South Africa 2012-12-23 2012-12-23 2025-03-18 2025-03-18 1 1

Filtrar por fecha

Con estas líneas de código podemos filtrar por fecha de observación:

ss = inat_obs['Fecha_obs'].apply(str) == '2012-07-25'
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Pied Crow

https://inaturalist-open-data.s3.amazonaws.com/photos/477494989/medium.jpeg

Verreaux's Eagle

https://inaturalist-open-data.s3.amazonaws.com/photos/477494969/medium.jpeg

O si preferimos podemos filtrar por fecha en que la observación fue añadida (registrada) en iNat:

ss = inat_obs['Fecha_reg'].apply(str) == '2024-11-07'
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Plains Zebra

https://inaturalist-open-data.s3.amazonaws.com/photos/448569104/medium.jpeg

Large Pugnacious Ant

https://inaturalist-open-data.s3.amazonaws.com/photos/448568399/medium.jpeg

Common Pirate

https://inaturalist-open-data.s3.amazonaws.com/photos/448567528/medium.jpeg

Southern Gaudy Commodore

https://inaturalist-open-data.s3.amazonaws.com/photos/448567081/medium.jpeg

Burchell's Zebra

https://inaturalist-open-data.s3.amazonaws.com/photos/448566558/medium.jpeg

Koppie Foam Grasshopper

https://inaturalist-open-data.s3.amazonaws.com/photos/448482276/medium.jpeg

Poison Squills

https://inaturalist-open-data.s3.amazonaws.com/photos/448481442/medium.jpeg

Filtrar por localidad

Si queremos filtrar por localidad, simplemente tenemos que cambiar la primera línea:

ss = inat_obs['location'] == 'Ehlanzeni District Municipality, South Africa'
images = inat_obs.loc[ss,'url']
labels = inat_obs.loc[ss,'species guess']
ipyplot.plot_images(list(images), list(labels), max_images=60,)


Narrow Green-banded Swallowtail

https://inaturalist-open-data.s3.amazonaws.com/photos/477497345/medium.jpeg

Progreso

Muchos años después todavía estoy en el proceso de registrar todas las fotos de mis viajes del año 2012:

aggfuns = {
    'Fecha_obs': ["min", "max"],
    'location': ['count',pd.Series.nunique],
    'species guess': [pd.Series.nunique],
           }
inat_obs.groupby('Fecha_reg').agg(aggfuns)

Fecha_obs location species guess
min max count nunique nunique
Fecha_reg
2024-11-07 2012-09-09 2012-09-09 7 1 7
2025-03-18 2012-07-25 2012-12-23 4 3 4

Todas las observaciones

Y cierro aquí con todas las imágenes de las observaciones de este año:

images = inat_obs.sort_values('Fecha_obs')['url']
labels = inat_obs.sort_values('Fecha_obs')['species guess']
ipyplot.plot_images(list(images), list(labels), max_images=200,)


Pied Crow

https://inaturalist-open-data.s3.amazonaws.com/photos/477494989/medium.jpeg

Verreaux's Eagle

https://inaturalist-open-data.s3.amazonaws.com/photos/477494969/medium.jpeg

African Hoopoe

https://inaturalist-open-data.s3.amazonaws.com/photos/477502045/medium.jpeg

Plains Zebra

https://inaturalist-open-data.s3.amazonaws.com/photos/448569104/medium.jpeg

Large Pugnacious Ant

https://inaturalist-open-data.s3.amazonaws.com/photos/448568399/medium.jpeg

Common Pirate

https://inaturalist-open-data.s3.amazonaws.com/photos/448567528/medium.jpeg

Southern Gaudy Commodore

https://inaturalist-open-data.s3.amazonaws.com/photos/448567081/medium.jpeg

Burchell's Zebra

https://inaturalist-open-data.s3.amazonaws.com/photos/448566558/medium.jpeg

Koppie Foam Grasshopper

https://inaturalist-open-data.s3.amazonaws.com/photos/448482276/medium.jpeg

Poison Squills

https://inaturalist-open-data.s3.amazonaws.com/photos/448481442/medium.jpeg

Narrow Green-banded Swallowtail

https://inaturalist-open-data.s3.amazonaws.com/photos/477497345/medium.jpeg