import pandas as pd
from datetime import datetime
from pyinaturalist import get_observations
import ipyplotMis fotos del año 2012
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:
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,)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,)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,)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,)