import streamlit as st import geopandas as gpd import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from io import BytesIO import requests import folium import zipfile from streamlit.components.v1 import html # Función para descargar y descomprimir el archivo def download_and_extract_data(): url = 'https://fire.ak.blm.gov/content/maps/aicc/Data/Data%20(zipped%20Shapefiles)/CurrentYearLightning_SHP.zip' response = requests.get(url) zip_file = zipfile.ZipFile(BytesIO(response.content)) zip_file.extractall("CurrentYearLightning_SHP") # Descargar y descomprimir los datos st.title('Alaska Lightning Detection Network Analysis') st.subheader('How its works: Explorar y comprender mejor la actividad de los rayos. ') with st.spinner('Downloading and extracting data...'): download_and_extract_data() # Cargar el shapefile shapefile_path = 'CurrentYearLightning_SHP/TOA_STRIKES.shp' alaskaP = gpd.read_file(shapefile_path) st.subheader('Current Year Lightning Strikes in Alaska') m = folium.Map(location=[alaskaP['LATITUDE'].mean(), alaskaP['LONGITUDE'].mean()], zoom_start=6) for _, row in alaskaP.iterrows(): folium.CircleMarker( location=[row['LATITUDE'], row['LONGITUDE']], radius=3, weight=1, color='red', fill=True, fill_color='red' ).add_to(m) # Renderizar el mapa usando st.components.v1.html folium_html = m._repr_html_() html(folium_html, width=700, height=500) # Convertir a datetime alaskaP['STRIKETIME'] = pd.to_datetime(alaskaP['STRIKETIME']) alaskaP['year'] = alaskaP['STRIKETIME'].dt.year alaskaP['month'] = alaskaP['STRIKETIME'].dt.month alaskaP['day'] = alaskaP['STRIKETIME'].dt.day alaskaP['hour'] = alaskaP['STRIKETIME'].dt.hour alaskaP['dayofweek'] = alaskaP['STRIKETIME'].dt.dayofweek alaskaP['week'] = alaskaP['STRIKETIME'].dt.isocalendar().week # Número de rayos por mes st.subheader('Number of Lightning Strikes by Month') fig, ax = plt.subplots() sns.countplot(x='month', data=alaskaP, ax=ax) ax.set_title('Number of Lightning Strikes by Month') ax.set_xlabel('Month') ax.set_ylabel('Count') st.pyplot(fig) # Número de rayos por día st.subheader('Number of Lightning Strikes by Day') fig, ax = plt.subplots() sns.countplot(x='day', data=alaskaP, ax=ax) ax.set_title('Number of Lightning Strikes by Day') ax.set_xlabel('Day') ax.set_ylabel('Count') st.pyplot(fig) # Distribución de tipos de rayos en un mapa st.subheader('Lightning Strikes by Type') fig, ax = plt.subplots() alaskaP.plot(column="STROKETYPE", legend=True, ax=ax) ax.set_title('Lightning Strikes by Type') st.pyplot(fig) # Número de rayos por día del año actual st.subheader('Number of Lightning Strikes by Day in Current Year') alaskaP['day'] = alaskaP['STRIKETIME'].dt.date daily_counts = alaskaP['day'].value_counts().sort_index() daily_counts.index = pd.to_datetime(daily_counts.index) fig, ax = plt.subplots() sns.lineplot(x=daily_counts.index, y=daily_counts.values, marker='o', ax=ax) ax.set_title('Number of Lightning Strikes by Day') ax.set_xlabel('Date') ax.set_ylabel('Count') ax.grid(True) st.pyplot(fig) # Número de rayos por hora en el año actual st.subheader('Number of Lightning Strikes by Hour in Current Year') current_year = alaskaP['year'].max() daily_data = alaskaP[alaskaP['year'] == current_year] hourly_counts = daily_data['hour'].value_counts().sort_index() fig, ax = plt.subplots() sns.lineplot(x=hourly_counts.index, y=hourly_counts.values, ax=ax) ax.set_title('Number of Lightning Strikes by Hour in Current Year') ax.set_xlabel('Hour of the Day') ax.set_ylabel('Count') ax.grid(True) st.pyplot(fig) # Número de rayos por día de la semana st.subheader('Number of Lightning Strikes by Day of the Week') alaskaP['day_of_week'] = alaskaP['STRIKETIME'].dt.dayofweek day_of_week_counts = alaskaP['day_of_week'].value_counts().sort_index() fig, ax = plt.subplots() sns.barplot(x=day_of_week_counts.index, y=day_of_week_counts.values, ax=ax) ax.set_title('Number of Lightning Strikes by Day of the Week') ax.set_xlabel('Day of the Week') ax.set_ylabel('Count') ax.set_xticklabels(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']) ax.grid(True) st.pyplot(fig) # Número de rayos por día en los últimos 10 días st.subheader('Number of Lightning Strikes by Day in Last 10 Days') last_10_days = daily_counts.tail(10) fig, ax = plt.subplots() sns.lineplot(x=last_10_days.index, y=last_10_days.values, marker='o', ax=ax) ax.set_title('Number of Lightning Strikes by Day in Last 10 Days') ax.set_xlabel('Date') ax.set_ylabel('Count') ax.grid(True) st.pyplot(fig)