Título del Proyecto:

Distribución actual de la "águila arpía" (Harpia harpyja) en Panamá¶

Nombre: Larissa Beltrán

Descripción del proyecto y Justificación¶

Para el presente proyecto se hizo una recopilación de datos utilizando la base de datos de eBird para acceder a avistamientos de años recientes del "águila arpía" en Panamá. También se realizó un análisis espacial haciendo uso de herramientas de sistemas de información geográfica para visualizar y analizar la distribución de los avistamientos.

Conocer la distribución de esta especie de ave contribuye a su conservación, muchas especies están amenazadas por la pérdida de hábitat y el cambio climático. Al documentar dónde y cómo se distribuyen, se pueden implementar estrategias de conservación más efectivas, que incluyan la creación de reservas naturales y la restauración de hábitats.

Finalmente, este tipo de estudios fomenta una mayor sensibilización sobre la importancia de las aves en nuestros ecosistemas y promueve la educación ambiental, lo que puede llevar a una mayor participación comunitaria en la protección de la fauna local.

Antecedentes¶

Según Vargas et al. (2006), la situación y distribución poblacional del "águila arpía" es incierta, con poblaciones vulnerables a la persecución humana debido a su estrategia reproductiva y a la deforestación. Las poblaciones observadas son pequeñas y aisladas. En Centro América, probablemente sólo se pueden localizar poblaciones de "águila arpía" en Panamá, donde se reporta el número más alto de áreas de anidación y de ejemplares en estado silvestre.

El Águila Arpía es una especie que se encuentra en estado casi amenazado (IUCN, 2013). En Panamá, se considera en peligro de extinción (Panamá, 2008) y necesita medidas de conservación sostenidas para garantizar su supervivencia en hábitats naturales. Estas medidas deben basarse en información científica que respalde la implementación de acciones que generen resultados concretos.

Identificar las preferencias del hábitat del Águila Arpía (Harpia harpyja) es un desafío, similar a lo que ocurre con otras aves rapaces del bosque. Esto se debe a sus bajas densidades poblacionales, su comportamiento evasivo y críptico, así como a la escasa información sobre su distribución. Por lo tanto, es necesario realizar esfuerzos continuos y exhaustivos en el campo para recopilar datos relevantes sobre sus necesidades ecológicas en un ecosistema específico (Vargas González et al., 2014).

Descripción del problema y objetivo¶

El conocimiento preciso sobre el estado y la distribución del "águila arpía" ha sido una tarea difícil y compleja a través de los años, debido al déficit de información y a la falta de estudios poblacionales adecuados. No obstante, se han hecho aportes importantes en los últimos años y el uso de plataformas colaborativas como eBird ha revolucionado la forma en que monitoreamos las especies, permitiendo a los observadores de aves registrar avistamientos en tiempo real, lo que genera un flujo constante de datos sobre la distribución y abundancia del "águila arpía", proporcionando una base de datos accesible y actualizada.

El análisis de datos de avistamientos del "águila arpía" es fundamental para comprender mejor cual es la situación de esta especie en su rango de distribución. Permitiendo identificar patrones de comportamiento, reproducción y alimentación, así como evaluar los factores que influyen en su hábitat, como el clima, la disponibilidad de alimentos y la intervención humana. se pueden implementar estrategias más efectivas para la protección de su hábitat y la promoción de políticas de conservación basadas en evidencia.

El objetivo del proyecto es mapear la distribución geográfica en un mapa que muestre los avistamientos del "águila arpía" en diversas regiones de Panamá, y evaluar si hay cambios en la distribución a lo largo del tiempo y deducir las posibles causas detrás de estos cambios.

Descripción de los datos¶

Utilicé un archivo CSV de Ebird de los últimos 10 años, que se basa en registros multimedia como fotos, videos y grabaciones de sonidos de todo el territorio de Panamá. Se filtraron los datos para evitar repeticiones en los avistamientos, asegurando así una cifra más precisa de la cantidad observada. Se tomaron en cuenta fechas y horarios de registro, ubicaciones, características del ave y observaciones.

eBird. (2024). Avistamientos de águila harpía en Panamá: Datos de los últimos 10 años. https://www.ebird.org/

Análisis de los Datos¶

In [1]:
!pip install numpy
!pip install pandas
!pip install seaborn
!pip install scikit-learn
!pip install matplotlib
!pip install ydata-profiling
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (1.26.4)
Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.1.4)
Requirement already satisfied: numpy<2,>=1.22.4 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)
Requirement already satisfied: seaborn in /usr/local/lib/python3.10/dist-packages (0.13.1)
Requirement already satisfied: numpy!=1.24.0,>=1.20 in /usr/local/lib/python3.10/dist-packages (from seaborn) (1.26.4)
Requirement already satisfied: pandas>=1.2 in /usr/local/lib/python3.10/dist-packages (from seaborn) (2.1.4)
Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /usr/local/lib/python3.10/dist-packages (from seaborn) (3.7.1)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.53.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.7)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (24.1)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (10.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.1.4)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2->seaborn) (2024.2)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2->seaborn) (2024.1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.16.0)
Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (1.5.2)
Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.26.4)
Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.13.1)
Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (3.5.0)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (3.7.1)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.3.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (4.53.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.4.7)
Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.26.4)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (24.1)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (10.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (3.1.4)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)
Collecting ydata-profiling
  Downloading ydata_profiling-4.10.0-py2.py3-none-any.whl.metadata (20 kB)
Requirement already satisfied: scipy<1.14,>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.13.1)
Requirement already satisfied: pandas!=1.4.0,<3,>1.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.1.4)
Requirement already satisfied: matplotlib<3.10,>=3.5 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (3.7.1)
Requirement already satisfied: pydantic>=2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.9.2)
Requirement already satisfied: PyYAML<6.1,>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (6.0.2)
Requirement already satisfied: jinja2<3.2,>=2.11.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (3.1.4)
Collecting visions<0.7.7,>=0.7.5 (from visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling)
  Downloading visions-0.7.6-py3-none-any.whl.metadata (11 kB)
Requirement already satisfied: numpy<2.2,>=1.16.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.26.4)
Collecting htmlmin==0.1.12 (from ydata-profiling)
  Downloading htmlmin-0.1.12.tar.gz (19 kB)
  Preparing metadata (setup.py) ... done
Collecting phik<0.13,>=0.11.1 (from ydata-profiling)
  Downloading phik-0.12.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB)
Requirement already satisfied: requests<3,>=2.24.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.32.3)
Requirement already satisfied: tqdm<5,>=4.48.2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (4.66.5)
Requirement already satisfied: seaborn<0.14,>=0.10.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.13.1)
Collecting multimethod<2,>=1.4 (from ydata-profiling)
  Downloading multimethod-1.12-py3-none-any.whl.metadata (9.6 kB)
Requirement already satisfied: statsmodels<1,>=0.13.2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.14.3)
Requirement already satisfied: typeguard<5,>=3 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (4.3.0)
Collecting imagehash==4.3.1 (from ydata-profiling)
  Downloading ImageHash-4.3.1-py2.py3-none-any.whl.metadata (8.0 kB)
Requirement already satisfied: wordcloud>=1.9.3 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.9.3)
Collecting dacite>=1.8 (from ydata-profiling)
  Downloading dacite-1.8.1-py3-none-any.whl.metadata (15 kB)
Requirement already satisfied: numba<1,>=0.56.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.60.0)
Collecting PyWavelets (from imagehash==4.3.1->ydata-profiling)
  Downloading pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.0 kB)
Requirement already satisfied: pillow in /usr/local/lib/python3.10/dist-packages (from imagehash==4.3.1->ydata-profiling) (10.4.0)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2<3.2,>=2.11.1->ydata-profiling) (2.1.5)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (1.3.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (4.53.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (1.4.7)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (24.1)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (3.1.4)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (2.8.2)
Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba<1,>=0.56.0->ydata-profiling) (0.43.0)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=1.4.0,<3,>1.1->ydata-profiling) (2024.2)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=1.4.0,<3,>1.1->ydata-profiling) (2024.1)
Requirement already satisfied: joblib>=0.14.1 in /usr/local/lib/python3.10/dist-packages (from phik<0.13,>=0.11.1->ydata-profiling) (1.4.2)
Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (0.7.0)
Requirement already satisfied: pydantic-core==2.23.4 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (2.23.4)
Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (4.12.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (2024.8.30)
Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.10/dist-packages (from statsmodels<1,>=0.13.2->ydata-profiling) (0.5.6)
Requirement already satisfied: attrs>=19.3.0 in /usr/local/lib/python3.10/dist-packages (from visions<0.7.7,>=0.7.5->visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling) (24.2.0)
Requirement already satisfied: networkx>=2.4 in /usr/local/lib/python3.10/dist-packages (from visions<0.7.7,>=0.7.5->visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling) (3.3)
Requirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from patsy>=0.5.6->statsmodels<1,>=0.13.2->ydata-profiling) (1.16.0)
Downloading ydata_profiling-4.10.0-py2.py3-none-any.whl (356 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 356.2/356.2 kB 7.3 MB/s eta 0:00:00
Downloading ImageHash-4.3.1-py2.py3-none-any.whl (296 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 296.5/296.5 kB 17.6 MB/s eta 0:00:00
Downloading dacite-1.8.1-py3-none-any.whl (14 kB)
Downloading multimethod-1.12-py3-none-any.whl (10 kB)
Downloading phik-0.12.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (686 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 686.1/686.1 kB 26.6 MB/s eta 0:00:00
Downloading visions-0.7.6-py3-none-any.whl (104 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.8/104.8 kB 6.3 MB/s eta 0:00:00
Downloading pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.5/4.5 MB 46.3 MB/s eta 0:00:00
Building wheels for collected packages: htmlmin
  Building wheel for htmlmin (setup.py) ... done
  Created wheel for htmlmin: filename=htmlmin-0.1.12-py3-none-any.whl size=27081 sha256=5683ff1c4a4d7c46c34b7e3e213d9db2ba8b29b80fc686f8fa53507f2dcfa8af
  Stored in directory: /root/.cache/pip/wheels/dd/91/29/a79cecb328d01739e64017b6fb9a1ab9d8cb1853098ec5966d
Successfully built htmlmin
Installing collected packages: htmlmin, PyWavelets, multimethod, dacite, imagehash, visions, phik, ydata-profiling
Successfully installed PyWavelets-1.7.0 dacite-1.8.1 htmlmin-0.1.12 imagehash-4.3.1 multimethod-1.12 phik-0.12.4 visions-0.7.6 ydata-profiling-4.10.0
In [2]:
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets
from ydata_profiling import ProfileReport
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
%matplotlib inline
In [3]:
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [29]:
filepath = "/content/drive/MyDrive/ML__2024-09-24T19-53_hareag1_PA.csv"
df = pd.read_csv(filepath)
display(df)
ML Catalog Number Format Common Name Scientific Name Background Species Recordist Date Year Month Day ... Parent Species eBird Species Code Taxon Category Taxonomic Sort Recordist 2 Average Community Rating Number of Ratings Asset Tags Original Image Height Original Image Width
0 202361741 Photo Harpy Eagle Harpia harpyja NaN Bradley Hacker 🦜 2019-12-15 2019 12 15.0 ... Harpia harpyja hareag1 Species 7812 NaN 4.94 17 NaN 1819.0 2728.0
1 201506311 Video Harpy Eagle Harpia harpyja NaN Josep del Hoyo 2017-01-05 2017 1 5.0 ... Harpia harpyja hareag1 Species 7812 NaN 4.74 23 Nest NaN NaN
2 167714711 Photo Harpy Eagle Harpia harpyja NaN Guillermo Saborío Vega 2019-06-16 2019 6 16.0 ... Harpia harpyja hareag1 Species 7812 NaN 4.89 9 NaN 2014.0 3582.0
3 201527381 Video Harpy Eagle Harpia harpyja NaN Josep del Hoyo 2017-01-05 2017 1 5.0 ... Harpia harpyja hareag1 Species 7812 NaN 4.80 10 NaN NaN NaN
4 617007565 Photo Harpy Eagle Harpia harpyja NaN Noah Price 2024-04-06 2024 4 6.0 ... Harpia harpyja hareag1 Species 7812 NaN 5.00 8 NaN 2848.0 4272.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1038 372797701 Photo Harpy Eagle Harpia harpyja NaN Carlos Sanguinetti 2021-08-07 2021 8 7.0 ... Harpia harpyja hareag1 Species 7812 NaN 0.00 0 NaN 898.0 896.0
1039 372797691 Photo Harpy Eagle Harpia harpyja NaN Carlos Sanguinetti 2021-08-07 2021 8 7.0 ... Harpia harpyja hareag1 Species 7812 NaN 0.00 0 NaN 1020.0 691.0
1040 372797641 Photo Harpy Eagle Harpia harpyja NaN Carlos Sanguinetti 2021-08-07 2021 8 7.0 ... Harpia harpyja hareag1 Species 7812 NaN 0.00 0 NaN 1156.0 1075.0
1041 372797611 Photo Harpy Eagle Harpia harpyja NaN Carlos Sanguinetti 2021-08-07 2021 8 7.0 ... Harpia harpyja hareag1 Species 7812 NaN 0.00 0 NaN 818.0 693.0
1042 372797601 Photo Harpy Eagle Harpia harpyja NaN Carlos Sanguinetti 2021-08-07 2021 8 7.0 ... Harpia harpyja hareag1 Species 7812 NaN 0.00 0 NaN 767.0 615.0

1043 rows × 45 columns

In [30]:
# Filtrado de columnas específico
headers = [
    'Common Name','Scientific Name', 'Recordist', 'Year','Month', 'Time', 'Country', 'State','Locality',
       'Latitude','Longitude','Age/Sex','Behaviors','Observation Details'
]

df = df[headers]
df
Out[30]:
Common Name Scientific Name Recordist Year Month Time Country State Locality Latitude Longitude Age/Sex Behaviors Observation Details
0 Harpy Eagle Harpia harpyja Bradley Hacker 🦜 2019 12 628 Panama Darién Río Chucunaque 8.162475 -77.740569 NaN NaN NaN
1 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 0 Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN NaN
2 Harpy Eagle Harpia harpyja Guillermo Saborío Vega 2019 6 945 Panama Darién PN Darién--Pijibasal 8.040023 -77.753377 NaN NaN <iframe width="560" height="315" src="https://...
3 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 0 Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN NaN
4 Harpy Eagle Harpia harpyja Noah Price 2024 4 608 Panama Darién Alto Playón 8.536680 -77.880494 NaN NaN Older nestling in nest! We watched the nest fo...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1038 Harpy Eagle Harpia harpyja Carlos Sanguinetti 2021 8 700 Panama Darién Río Chucunaque -- Puerto Limón a Río Membrillo 8.543846 -77.894611 NaN NaN Male near an active nest.
1039 Harpy Eagle Harpia harpyja Carlos Sanguinetti 2021 8 700 Panama Darién Río Chucunaque -- Puerto Limón a Río Membrillo 8.543846 -77.894611 NaN NaN Male near an active nest.
1040 Harpy Eagle Harpia harpyja Carlos Sanguinetti 2021 8 700 Panama Darién Río Chucunaque -- Puerto Limón a Río Membrillo 8.543846 -77.894611 NaN NaN Male near an active nest.
1041 Harpy Eagle Harpia harpyja Carlos Sanguinetti 2021 8 700 Panama Darién Río Chucunaque -- Puerto Limón a Río Membrillo 8.543846 -77.894611 NaN NaN Male near an active nest.
1042 Harpy Eagle Harpia harpyja Carlos Sanguinetti 2021 8 700 Panama Darién Río Chucunaque -- Puerto Limón a Río Membrillo 8.543846 -77.894611 NaN NaN Male near an active nest.

1043 rows × 14 columns

In [31]:
df.shape
Out[31]:
(1043, 14)
In [32]:
# Imprimir valores nulos por columna
df.isna().sum()
Out[32]:
0
Common Name 0
Scientific Name 0
Recordist 0
Year 0
Month 0
Time 0
Country 0
State 0
Locality 0
Latitude 0
Longitude 0
Age/Sex 841
Behaviors 1014
Observation Details 616

In [33]:
# Eliminar duplicados, manteniendo la primera ocurrencia
df = df.drop_duplicates()

# Mostrar el DataFrame después de eliminar duplicados
print("\nDataFrame después de eliminar duplicados:")
df.shape
DataFrame después de eliminar duplicados:
Out[33]:
(369, 14)
In [34]:
# Función para extraer la información de edad
def extract_age(Age_sex):
    if pd.isna(Age_sex): # Check if Age_sex is NaN
       return None
    age_categories = []

    if 'Adult' in Age_sex:
        age_categories.append('Adult')
    if 'Juvenile' in Age_sex:
        age_categories.append('Juvenile')
    if 'Immature' in Age_sex:
        age_categories.append('Immature')

    return ' and '.join(age_categories) if age_categories else None

# Función para extraer la información de sexo
def extract_sex(Age_sex):
    if pd.isna(Age_sex): # Check if Age_sex is NaN
        return None
    if 'Male' in Age_sex and 'Female' in Age_sex:
        return 'Both'
    elif 'Male' in Age_sex:
        return 'Male'
    elif 'Female' in Age_sex:
        return 'Female'
    return None

# Aplicar las funciones al DataFrame para crear las nuevas columnas
df['Age'] = df['Age/Sex'].apply(extract_age)
df['Sex'] = df['Age/Sex'].apply(extract_sex)

df = df.drop(columns=['Age/Sex'])

# Mostrar el DataFrame con las nuevas columnas
df
<ipython-input-34-fdd1cc743ca1>:29: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df['Age'] = df['Age/Sex'].apply(extract_age)
<ipython-input-34-fdd1cc743ca1>:30: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df['Sex'] = df['Age/Sex'].apply(extract_sex)
Out[34]:
Common Name Scientific Name Recordist Year Month Time Country State Locality Latitude Longitude Behaviors Observation Details Age Sex
0 Harpy Eagle Harpia harpyja Bradley Hacker 🦜 2019 12 628 Panama Darién Río Chucunaque 8.162475 -77.740569 NaN NaN None None
1 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 0 Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN None None
2 Harpy Eagle Harpia harpyja Guillermo Saborío Vega 2019 6 945 Panama Darién PN Darién--Pijibasal 8.040023 -77.753377 NaN <iframe width="560" height="315" src="https://... None None
4 Harpy Eagle Harpia harpyja Noah Price 2024 4 608 Panama Darién Alto Playón 8.536680 -77.880494 NaN Older nestling in nest! We watched the nest fo... None None
5 Harpy Eagle Harpia harpyja Luis Mario Arce 2019 2 0 Panama Darién Pinogana (8.1767, -77.812) 8.176700 -77.812000 NaN NaN None None
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1009 Harpy Eagle Harpia harpyja Alex Molina 2021 10 850 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None
1012 Harpy Eagle Harpia harpyja Jose V. Padilla-Lopez, M.D. 2021 10 806 Panama Emberá Emberá-Wounaan, PA (8.551, -77.853) 8.550683 -77.853345 NaN Hembra None None
1018 Harpy Eagle Harpia harpyja Mel Cruz 2021 10 850 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None
1019 Harpy Eagle Harpia harpyja William Hull 2021 6 753 Panama Darién Provincia de Darién, PA (8.148, -77.726) 8.147680 -77.725982 NaN NaN None None
1026 Harpy Eagle Harpia harpyja María Henríquez 2021 9 1652 Panama Darién Chepigana, Provincia de Darién, PA (8.161, -78... 8.161125 -78.002729 NaN NaN None None

369 rows × 15 columns

In [35]:
def extract_age_from_details(row):
    # Verificar si la columna 'Age' está vacía
    if pd.isna(row['Age']):
        age_categories = []

        # Listas de palabras clave para identificar la edad
        adult_keywords = ['Older', 'Adult', 'huge', 'adulto', 'gran tamaño', 'adulta']
        juvenile_keywords = ['Juvenile', 'juvenil', 'juv', 'young', '~7 month old']
        immature_keywords = ['Polluelo', 'Chick', 'fledgling', 'immature', 'baby', 'Pichön']

        # Convertir a minúsculas para búsqueda insensible a mayúsculas
        observation = row['Observation Details'].lower() if isinstance(row['Observation Details'], str) else ''

        # Nueva condición: Si hay "female" y "chick", colocar "Adult and Immature"
        if 'female' in observation and 'chick' in observation:
            return 'Adult and Immature'

        # Nueva condición: Si hay "female" y "juvenile" o "juv", colocar "Adult and Juvenile"
        if 'female' in observation and ('juvenile' in observation or 'juv' in observation):
            return 'Adult and Juvenile'

        # Buscar las palabras clave en "Observation Details"
        if any(keyword.lower() in observation for keyword in adult_keywords):
            age_categories.append('Adult')
        if any(keyword.lower() in observation for keyword in juvenile_keywords):
            age_categories.append('Juvenile')
        if any(keyword.lower() in observation for keyword in immature_keywords):
            age_categories.append('Immature')

        return ' and '.join(age_categories) if age_categories else None
    else:
        return row['Age']  # Mantener el valor original si ya tiene información

# Función para extraer la información de sexo de "Observation Details" si las columnas Age y Sex están vacías
def extract_sex_from_details(row):
    # Verificar si la columna 'Sex' está vacía
    if pd.isna(row['Sex']):
        sex_categories = []

        # Listas de palabras clave para identificar el sexo
        female_keywords = ['hembra', 'female', 'adulta']
        male_keywords = ['macho', 'male']

        # Buscar las palabras clave en "Observation Details"
        observation = row['Observation Details'].lower() if isinstance(row['Observation Details'], str) else ''

        if any(keyword.lower() in observation for keyword in female_keywords):
            sex_categories.append('Female')
        if any(keyword.lower() in observation for keyword in male_keywords):
            sex_categories.append('Male')

        if len(sex_categories) > 1:
            return 'Both'
        elif len(sex_categories) == 1:
            return sex_categories[0]
        else:
            return None
    else:
        return row['Sex']  # Mantener el valor original si ya tiene información

# Supongamos que el DataFrame original ya tiene las columnas 'Age' y 'Sex' y ahora añadimos 'Observation Details'
# df = pd.DataFrame({'Age/Sex': ['Adult Male', 'Juvenile Female', ...], 'Observation Details': ['Older and huge', 'juv female', ...]})

# Aplicar las funciones solo a las filas donde 'Age' y 'Sex' estén vacías
df['Age'] = df.apply(extract_age_from_details, axis=1)
df['Sex'] = df.apply(extract_sex_from_details, axis=1)

# Mostrar el DataFrame con las columnas actualizadas
df
Out[35]:
Common Name Scientific Name Recordist Year Month Time Country State Locality Latitude Longitude Behaviors Observation Details Age Sex
0 Harpy Eagle Harpia harpyja Bradley Hacker 🦜 2019 12 628 Panama Darién Río Chucunaque 8.162475 -77.740569 NaN NaN None None
1 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 0 Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN None None
2 Harpy Eagle Harpia harpyja Guillermo Saborío Vega 2019 6 945 Panama Darién PN Darién--Pijibasal 8.040023 -77.753377 NaN <iframe width="560" height="315" src="https://... None None
4 Harpy Eagle Harpia harpyja Noah Price 2024 4 608 Panama Darién Alto Playón 8.536680 -77.880494 NaN Older nestling in nest! We watched the nest fo... Adult None
5 Harpy Eagle Harpia harpyja Luis Mario Arce 2019 2 0 Panama Darién Pinogana (8.1767, -77.812) 8.176700 -77.812000 NaN NaN None None
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1009 Harpy Eagle Harpia harpyja Alex Molina 2021 10 850 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None
1012 Harpy Eagle Harpia harpyja Jose V. Padilla-Lopez, M.D. 2021 10 806 Panama Emberá Emberá-Wounaan, PA (8.551, -77.853) 8.550683 -77.853345 NaN Hembra None Female
1018 Harpy Eagle Harpia harpyja Mel Cruz 2021 10 850 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None
1019 Harpy Eagle Harpia harpyja William Hull 2021 6 753 Panama Darién Provincia de Darién, PA (8.148, -77.726) 8.147680 -77.725982 NaN NaN None None
1026 Harpy Eagle Harpia harpyja María Henríquez 2021 9 1652 Panama Darién Chepigana, Provincia de Darién, PA (8.161, -78... 8.161125 -78.002729 NaN NaN None None

369 rows × 15 columns

In [36]:
profile = ProfileReport(df, title="Avistamientos de Águila Arpía en Panamá", explorative=True)
profile.to_notebook_iframe()
Summarize dataset:   0%|          | 0/5 [00:00<?, ?it/s]
Generate report structure:   0%|          | 0/1 [00:00<?, ?it/s]
Render HTML:   0%|          | 0/1 [00:00<?, ?it/s]
In [37]:
df.shape
Out[37]:
(369, 15)
In [38]:
# Imprimir los tipos de datos de cada columna
df.dtypes
Out[38]:
0
Common Name object
Scientific Name object
Recordist object
Year int64
Month int64
Time int64
Country object
State object
Locality object
Latitude float64
Longitude float64
Behaviors object
Observation Details object
Age object
Sex object

In [39]:
# Imprimir valores nulos por columna ) (se reducen los datos faltantes pero no se puede rellenar aleatoriamente ya que se debe al alcance visual del observador)
df.isna().sum()
Out[39]:
0
Common Name 0
Scientific Name 0
Recordist 0
Year 0
Month 0
Time 0
Country 0
State 0
Locality 0
Latitude 0
Longitude 0
Behaviors 347
Observation Details 220
Age 192
Sex 280

Gráficos¶

In [48]:
year_frequency_df = df['Year'].value_counts().reset_index()
year_frequency_df.columns = ['Year', 'Frequency']

year_frequency_df
Out[48]:
Year Frequency
0 2022 72
1 2019 58
2 2021 45
3 2023 45
4 2024 40
5 2017 32
6 2018 19
7 2020 19
8 2016 15
9 2014 15
10 2015 9
In [67]:
# Ordenar el DataFrame por la columna 'Year'
year_frequency_df = year_frequency_df.sort_values(by='Year')

# Crear el gráfico de líneas
plt.figure(figsize=(10, 6))
plt.plot(year_frequency_df['Year'], year_frequency_df['Frequency'], marker='o', color='r', linestyle='-')

# Configurar el título y las etiquetas
plt.title('Frecuencia por Año')
plt.xlabel('Año')
plt.ylabel('Frecuencia')
plt.xticks(year_frequency_df['Year'])  # Asegura que todos los años se muestren en el eje x

# Mostrar la cuadrícula
plt.grid()

# Mostrar el gráfico
plt.show()
No description has been provided for this image
In [66]:
# Convert 'Time' column to numeric, handling NaN values
df['Time'] = pd.to_numeric(df['Time'].astype(str).str.replace('(', '').str.replace(']', '').str.split(',').str[0], errors='coerce')

# Crear intervalos de 100
bins = list(range(0, 2500, 100))
df['Time_bins'] = pd.cut(df['Time'], bins)

# Contar la frecuencia de avistamientos por intervalo de hora
time_frequency = df['Time_bins'].value_counts().sort_index()

# Crear el gráfico de barras
plt.figure(figsize=(16, 6))
time_frequency.plot(kind='bar', color='skyblue')

# Configurar el título y las etiquetas
plt.title('Frecuencia de Avistamientos por Horarios')
plt.xlabel('Hora')
plt.ylabel('Número de Avistamientos')
plt.xticks(rotation=45)  # Rotar etiquetas del eje X para mejor legibilidad

# Mostrar la cuadrícula
plt.grid(axis='y')

# Mostrar el gráfico
plt.tight_layout()  # Ajusta el layout para que no se solapen los elementos
plt.show()
No description has been provided for this image
In [69]:
# Contar la frecuencia de cada avistamiento por edad
age_frequency = df['Age'].value_counts()

# Crear el gráfico de pastel
plt.figure(figsize=(8, 8))
plt.pie(age_frequency, labels=age_frequency.index, autopct='%1.1f%%', startangle=90, colors=plt.cm.Paired.colors)

# Configurar el título
plt.title('Frecuencia de Edades')

# Mostrar el gráfico
plt.axis('equal')  # Para que el gráfico sea un círculo
plt.show()
No description has been provided for this image
In [71]:
# Contar la frecuencia de cada sexo
sex_frequency = df['Sex'].value_counts()

# Crear el gráfico de pastel
plt.figure(figsize=(8, 8))
plt.pie(sex_frequency, labels=sex_frequency.index, autopct='%1.1f%%', startangle=90, colors=plt.cm.Paired.colors)

# Configurar el título
plt.title('Frecuencia de Sexo')

# Mostrar el gráfico
plt.axis('equal')  # Para que el gráfico sea un círculo
plt.show()
No description has been provided for this image
In [47]:
import geopandas as gpd

shapefile = '/content/drive/MyDrive/gadm41_PAN_1.json.zip'

gdf = gpd.read_file(shapefile)

gdf['NAME_1'] = gdf['NAME_1'].replace('KunaYala', 'Kuna Yala')
gdf['NAME_1'] = gdf['NAME_1'].replace('BocasdelToro', 'Bocas del Toro')
gdf['NAME_1'] = gdf['NAME_1'].replace('LosSantos', 'Los Santos')
gdf['NAME_1'] = gdf['NAME_1'].replace('NgöbeBuglé', 'Ngöbe Buglé')
gdf['NAME_1'] = gdf['NAME_1'].replace('PanamáOeste', 'Panamá Oeste')

frequency_df = df['State'].value_counts().reset_index()
frequency_df.columns = ['State', 'Frequency']

gdf = gdf.merge(frequency_df, left_on='NAME_1', right_on='State', how='left')

gdf['Frequency'].fillna(0, inplace=True)

gdf
Out[47]:
GID_1 GID_0 COUNTRY NAME_1 VARNAME_1 NL_NAME_1 TYPE_1 ENGTYPE_1 CC_1 HASC_1 ISO_1 geometry State Frequency
0 PAN.1_1 PAN Panama Bocas del Toro NA NA Provincia Province NA PA.BC PA-1 MULTIPOLYGON (((-82.1326 8.9003, -82.1486 8.89... NaN 0.0
1 PAN.2_1 PAN Panama Chiriquí NA NA Provincia Province NA PA.CH NA MULTIPOLYGON (((-82.0246 7.9482, -82.0235 7.94... Chiriquí 2.0
2 PAN.3_1 PAN Panama Coclé NA NA Provincia Province NA PA.CC NA MULTIPOLYGON (((-80.4688 8.2232, -80.4701 8.22... NaN 0.0
3 PAN.4_1 PAN Panama Colón NA NA Provincia Province NA PA.CL NA MULTIPOLYGON (((-80.6545 8.7972, -80.6559 8.79... Colón 1.0
4 PAN.5_1 PAN Panama Darién NA NA Provincia Province NA PA.DR NA MULTIPOLYGON (((-77.8 7.4567, -77.8039 7.4395,... Darién 275.0
5 PAN.6_1 PAN Panama Emberá Emberá-Wounaan NA ComarcaIndígena IndigenousTerritory NA PA.EM NA MULTIPOLYGON (((-77.9523 7.6167, -77.9628 7.61... Emberá 74.0
6 PAN.7_1 PAN Panama Herrera NA NA Provincia Province NA PA.HE PA-6 MULTIPOLYGON (((-80.6157 7.6549, -80.6216 7.65... NaN 0.0
7 PAN.8_1 PAN Panama Kuna Yala NA NA ComarcaIndígena IndigenousTerritory NA PA.SB NA MULTIPOLYGON (((-77.362 8.6543, -77.3731 8.642... Kuna Yala 1.0
8 PAN.9_1 PAN Panama Los Santos NA NA Provincia Province NA PA.LS PA-7 MULTIPOLYGON (((-80.4412 7.2418, -80.4563 7.24... NaN 0.0
9 PAN.10_1 PAN Panama Ngöbe Buglé NA NA ComarcaIndígena IndigenousTerritory NA PA.NB NA MULTIPOLYGON (((-81.5746 8.1951, -81.5684 8.19... NaN 0.0
10 PAN.12_1 PAN Panama Panamá Panam NA Provincia Province NA PA.PN NA MULTIPOLYGON (((-78.9999 7.9999, -79.0001 7.99... Panamá 16.0
11 PAN.11_1 PAN Panama Panamá Oeste NA NA Provincia Province NA PA.PO NA MULTIPOLYGON (((-80.0931 8.5114, -80.0922 8.51... NaN 0.0
12 PAN.13_1 PAN Panama Veraguas NA NA Provincia Province NA PA.VR PA-9 MULTIPOLYGON (((-82.2412 7.4768, -82.2379 7.47... NaN 0.0
In [77]:
fig, ax = plt.subplots(figsize=(15, 20))

# Graficar el GeoDataFrame
gdf.plot(
    column="Frequency",
    cmap="OrRd",
    edgecolor="white",
    linewidth=0.5,
    categorical=True,
    legend=True,
    legend_kwds={"loc": "center right", "bbox_to_anchor": (.99, .82)},
    ax=ax
)

# Agregar etiquetas de los nombres de los estados
for x, y, label in zip(gdf.geometry.centroid.x, gdf.geometry.centroid.y, gdf['NAME_1']):
    # Crear un fondo rectangular
    ax.add_patch(plt.Rectangle((x - 0.1, y - 0.05), 0.2, 0.1, color='white', alpha=0.7, zorder=2))
    ax.text(x, y, label, fontsize=6, ha='center', va='center', color='black', zorder=3)

# Título del mapa
plt.title('Mayor Frecuencia de Avistamientos de Águila Arpía en Panamá', fontsize=16)

# Mostrar el mapa
plt.show()
<ipython-input-77-9edd0e7a2d1a>:16: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.

  for x, y, label in zip(gdf.geometry.centroid.x, gdf.geometry.centroid.y, gdf['NAME_1']):
No description has been provided for this image
In [83]:
# Unir las columnas 'Latitude' y 'Longitude' por comas
df['Location'] = '(' + df['Longitude'].astype(str) + ', ' + df['Latitude'].astype(str) + ')'
df
Out[83]:
Common Name Scientific Name Recordist Year Month Time Country State Locality Latitude Longitude Behaviors Observation Details Age Sex Time_bins Location
0 Harpy Eagle Harpia harpyja Bradley Hacker 🦜 2019 12 600.0 Panama Darién Río Chucunaque 8.162475 -77.740569 NaN NaN None None (500.0, 600.0] (-77.7405687, 8.1624754)
1 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 NaN Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN None None NaN (-77.7448, 8.4683)
2 Harpy Eagle Harpia harpyja Guillermo Saborío Vega 2019 6 900.0 Panama Darién PN Darién--Pijibasal 8.040023 -77.753377 NaN <iframe width="560" height="315" src="https://... None None (800.0, 900.0] (-77.753377, 8.040023)
4 Harpy Eagle Harpia harpyja Noah Price 2024 4 600.0 Panama Darién Alto Playón 8.536680 -77.880494 NaN Older nestling in nest! We watched the nest fo... Adult None (500.0, 600.0] (-77.8804936, 8.53668)
5 Harpy Eagle Harpia harpyja Luis Mario Arce 2019 2 NaN Panama Darién Pinogana (8.1767, -77.812) 8.176700 -77.812000 NaN NaN None None NaN (-77.812, 8.1767)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1009 Harpy Eagle Harpia harpyja Alex Molina 2021 10 800.0 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None (700.0, 800.0] (-77.8740406, 8.5382244)
1012 Harpy Eagle Harpia harpyja Jose V. Padilla-Lopez, M.D. 2021 10 800.0 Panama Emberá Emberá-Wounaan, PA (8.551, -77.853) 8.550683 -77.853345 NaN Hembra None Female (700.0, 800.0] (-77.853345, 8.5506833)
1018 Harpy Eagle Harpia harpyja Mel Cruz 2021 10 800.0 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None (700.0, 800.0] (-77.8740406, 8.5382244)
1019 Harpy Eagle Harpia harpyja William Hull 2021 6 700.0 Panama Darién Provincia de Darién, PA (8.148, -77.726) 8.147680 -77.725982 NaN NaN None None (600.0, 700.0] (-77.7259824, 8.1476803)
1026 Harpy Eagle Harpia harpyja María Henríquez 2021 9 1600.0 Panama Darién Chepigana, Provincia de Darién, PA (8.161, -78... 8.161125 -78.002729 NaN NaN None None (1500.0, 1600.0] (-78.0027289, 8.1611251)

369 rows × 17 columns

In [86]:
from shapely.geometry import Point
from geopy.geocoders import Nominatim

# Initialize Nominatim API
geolocator = Nominatim(user_agent="geoPandas")


df_puntos = gpd.GeoDataFrame(df)

# Split 'Location' into Longitude and Latitude and convert to float
df_puntos['Longitude'] = df_puntos['Location'].str.extract(r'\((.*?),').astype(float)
df_puntos['Latitude'] = df_puntos['Location'].str.extract(r', (.*?)\)').astype(float)

df_puntos["geometry"] = df_puntos.apply(lambda row: Point(row['Longitude'], row['Latitude']), axis=1)
df_puntos
<ipython-input-86-be0941418514>:14: FutureWarning: You are adding a column named 'geometry' to a GeoDataFrame constructed without an active geometry column. Currently, this automatically sets the active geometry column to 'geometry' but in the future that will no longer happen. Instead, either provide geometry to the GeoDataFrame constructor (GeoDataFrame(... geometry=GeoSeries()) or use `set_geometry('geometry')` to explicitly set the active geometry column.
  df_puntos["geometry"] = df_puntos.apply(lambda row: Point(row['Longitude'], row['Latitude']), axis=1)
Out[86]:
Common Name Scientific Name Recordist Year Month Time Country State Locality Latitude Longitude Behaviors Observation Details Age Sex Time_bins Location geometry
0 Harpy Eagle Harpia harpyja Bradley Hacker 🦜 2019 12 600.0 Panama Darién Río Chucunaque 8.162475 -77.740569 NaN NaN None None (500.0, 600.0] (-77.7405687, 8.1624754) POINT (-77.74057 8.16248)
1 Harpy Eagle Harpia harpyja Josep del Hoyo 2017 1 NaN Panama Emberá Darién Province 8.468300 -77.744800 NaN NaN None None NaN (-77.7448, 8.4683) POINT (-77.7448 8.4683)
2 Harpy Eagle Harpia harpyja Guillermo Saborío Vega 2019 6 900.0 Panama Darién PN Darién--Pijibasal 8.040023 -77.753377 NaN <iframe width="560" height="315" src="https://... None None (800.0, 900.0] (-77.753377, 8.040023) POINT (-77.75338 8.04002)
4 Harpy Eagle Harpia harpyja Noah Price 2024 4 600.0 Panama Darién Alto Playón 8.536680 -77.880494 NaN Older nestling in nest! We watched the nest fo... Adult None (500.0, 600.0] (-77.8804936, 8.53668) POINT (-77.88049 8.53668)
5 Harpy Eagle Harpia harpyja Luis Mario Arce 2019 2 NaN Panama Darién Pinogana (8.1767, -77.812) 8.176700 -77.812000 NaN NaN None None NaN (-77.812, 8.1767) POINT (-77.812 8.1767)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1009 Harpy Eagle Harpia harpyja Alex Molina 2021 10 800.0 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None (700.0, 800.0] (-77.8740406, 8.5382244) POINT (-77.87404 8.53822)
1012 Harpy Eagle Harpia harpyja Jose V. Padilla-Lopez, M.D. 2021 10 800.0 Panama Emberá Emberá-Wounaan, PA (8.551, -77.853) 8.550683 -77.853345 NaN Hembra None Female (700.0, 800.0] (-77.853345, 8.5506833) POINT (-77.85334 8.55068)
1018 Harpy Eagle Harpia harpyja Mel Cruz 2021 10 800.0 Panama Darién Alto Playon Comunidad Embera 8.538224 -77.874041 NaN NaN None None (700.0, 800.0] (-77.8740406, 8.5382244) POINT (-77.87404 8.53822)
1019 Harpy Eagle Harpia harpyja William Hull 2021 6 700.0 Panama Darién Provincia de Darién, PA (8.148, -77.726) 8.147680 -77.725982 NaN NaN None None (600.0, 700.0] (-77.7259824, 8.1476803) POINT (-77.72598 8.14768)
1026 Harpy Eagle Harpia harpyja María Henríquez 2021 9 1600.0 Panama Darién Chepigana, Provincia de Darién, PA (8.161, -78... 8.161125 -78.002729 NaN NaN None None (1500.0, 1600.0] (-78.0027289, 8.1611251) POINT (-78.00273 8.16113)

369 rows × 18 columns

In [95]:
df_puntos.set_geometry("geometry")
axes = gdf["geometry"].plot(color="DarkGreen", edgecolor="White", linewidth=0.8, figsize=(18, 15))

df_puntos["geometry"].plot(ax=axes, color="Lightgreen")



# Mostrar el mapa
plt.show()
No description has been provided for this image

Resultados obtenidos¶

La población de águilas harpías ha mostrado fluctuaciones significativas a lo largo de los años. Comenzó con niveles moderados en 2014, con una caída en 2015 y un repunte hasta 2017. En 2018, se redujo considerablemente, pero en 2019 alcanzó un pico de 60 avistamientos. Después de un desplome casi total en 2020, la población se recuperó, llegando a su máximo en 2022 con 70 avistamientos, antes de disminuir nuevamente en 2023 y 2024.

La distribución de los estadíos del águila harpía revela que la mayoría de la población se compone de adultos (30.5%), seguidos de juveniles (26.6%). Los individuos inmaduros representan un 20.3%, mientras que las combinaciones de adultos con juveniles (9.6%) y adultos con inmaduros (13%) son menos frecuentes. Esto indica una población predominantemente adulta, lo que podría implicar un enfoque en la conservación y manejo de esta especie para asegurar la sostenibilidad de sus jóvenes y en desarrollo. El gráfico de pastel de Sexos indica que la mayor proporción de águilas harpía corresponde a las hembras, seguidas por los machos, mientras que un porcentaje menor aplica a ambos sexos. Esto sugiere una tendencia hacia una mayor presencia femenina en la población, sobre todo porque el mayor avistamiento es en nidos.

Referente al mapa de calor y al mapa de puntos geográficos, las regiones con mayor frecuencia de avistamientos del "águila arpía" en Panamá son Darién y Emberá, destacadas en los tonos más oscuros que indican hasta 275 avistamientos. Les siguen Panamá y Kuna Yala, con una frecuencia alta de entre 74 y 275 avistamientos. Chiriquí y Colón presentan una frecuencia moderada, con un rango entre 16 y 74 avistamientos, mientras que las regiones de Ngäbe Buglé, Veraguas, Coclé, Panamá Oeste, Los Santos, Herrera y Bocas del Toro tienen los tonos más claros, lo que indica pocos o nulos avistamientos, entre 0 y 16.

Conclusiones¶

  • La población de águilas harpías ha mostrado variaciones significativas en avistamientos, destacando la importancia de un seguimiento continuo para identificar factores que influyen en su dinámica.

  • Con una mayoría de adultos y una proporción considerable de juveniles, es esencial implementar estrategias de conservación que aseguren el éxito reproductivo y la supervivencia de los jóvenes.

  • Darién y Emberá son áreas críticas para la conservación, con alta frecuencia de avistamientos, lo que sugiere que se deben dirigir esfuerzos de protección y restauración a estas regiones.

  • Para garantizar la protección de la especie, es imperante el desarrollo de esfuerzos educacionales públicos, con la finalidad de lograr cambios de actitud y aptitud en la población hacia el "águila arpía".

Referencias¶

Vargas, J. de J., Whitacre, D., Mosquera, R., Albuquerque, J., Piana, R., Thiollay, J.-M., Márquez, C., Sánchez, J. E., Lezama-López, M., Midence, S., Matola, S., Aguilar, S., Rettig, N., & Sanaiotti, T. (2006). Estado y distribución actual del águila arpía (Harpia harpyja) en Centro y Sur América. Ornitología Neotropical, 17, 39–55.

Autoridad Nacional del Ambiente de Panamá. (2008). Resolución No. AG-0051-2008 por la cual se reglamenta lo relativo a las especies de fauna y flora amenazada y en peligro de extinción y se dictan otras disposiciones. Panamá City, Panamá.

Autoridad Nacional del Ambiente de Panamá. (2008). Resolución No. AG-0051-2008 por la cual se reglamenta lo relativo a las especies de fauna y flora amenazada y en peligro de extinción y se dictan otras disposiciones. Panamá City, Panamá.

International Union for Conservation of Nature (IUCN). (2013). IUCN Red List of Threatened Species. Recuperado de https://www.iucnredlist.org/