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¶
!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
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
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).
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
# 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
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
df.shape
(1043, 14)
# Imprimir valores nulos por columna
df.isna().sum()
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 |
# 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:
(369, 14)
# 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)
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
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
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
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]
df.shape
(369, 15)
# Imprimir los tipos de datos de cada columna
df.dtypes
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 |
# 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()
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¶
year_frequency_df = df['Year'].value_counts().reset_index()
year_frequency_df.columns = ['Year', 'Frequency']
year_frequency_df
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 |
# 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()
# 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()
# 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()
# 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()
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
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 |
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']):
# Unir las columnas 'Latitude' y 'Longitude' por comas
df['Location'] = '(' + df['Longitude'].astype(str) + ', ' + df['Latitude'].astype(str) + ')'
df
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
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)
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
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()
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/