Añadir estudio viales.py
Script para el cálculo de mediana de los viales de madrid
This commit is contained in:
92
estudio viales.py
Normal file
92
estudio viales.py
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
import geopandas as gpd
|
||||||
|
import pandas as pd
|
||||||
|
import requests
|
||||||
|
import zipfile
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Descargar y descomprimir el archivo
|
||||||
|
url = "https://geoportal.madrid.es/fsdescargas/IDEAM_WBGEOPORTAL/CALLEJERO/VIALES/VIALES_SHP.zip"
|
||||||
|
|
||||||
|
print("Descargando datos...")
|
||||||
|
response = requests.get(url)
|
||||||
|
zip_file = zipfile.ZipFile(io.BytesIO(response.content))
|
||||||
|
zip_file.extractall("viales_madrid")
|
||||||
|
print("Datos descargados y descomprimidos")
|
||||||
|
|
||||||
|
# Cargamos el shapefile
|
||||||
|
shp_file = None
|
||||||
|
for file in os.listdir("viales_madrid"):
|
||||||
|
if file.endswith(".shp"):
|
||||||
|
shp_file = os.path.join("viales_madrid", file)
|
||||||
|
break
|
||||||
|
|
||||||
|
if shp_file is None:
|
||||||
|
raise FileNotFoundError("No se encontró el archivo .shp en el zip")
|
||||||
|
|
||||||
|
print(f"Cargando shapefile: {shp_file}")
|
||||||
|
gdf = gpd.read_file(shp_file)
|
||||||
|
|
||||||
|
# Información básica del fichero
|
||||||
|
print(f"Número de viales cargados: {len(gdf)}")
|
||||||
|
print(f"Columnas disponibles: {gdf.columns.tolist()}")
|
||||||
|
|
||||||
|
# Inspeccionar las primeras filas para entender los datos
|
||||||
|
print("\nPrimeras 5 filas del dataset:")
|
||||||
|
print(gdf[['CV_TX_DENO', 'DEN_TX_NOM', 'DEN_TX_PAR']].head())
|
||||||
|
|
||||||
|
# Calcular la longitud de cada vial en metros
|
||||||
|
print("\nCalculando longitudes...")
|
||||||
|
gdf = gdf.to_crs(epsg=25830) # CRS proyectado para España (metros)
|
||||||
|
gdf['longitud_metros'] = gdf.geometry.length
|
||||||
|
|
||||||
|
# Calcular las estadísticas que nos interesan
|
||||||
|
estadisticas = {
|
||||||
|
'Media': gdf['longitud_metros'].mean(),
|
||||||
|
'Mediana': gdf['longitud_metros'].median(),
|
||||||
|
'Mínimo': gdf['longitud_metros'].min(),
|
||||||
|
'Máximo': gdf['longitud_metros'].max(),
|
||||||
|
'Total': gdf['longitud_metros'].sum(),
|
||||||
|
'Cantidad de viales': len(gdf)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Mostrar resultados de forma básica
|
||||||
|
print("\n" + "="*50)
|
||||||
|
print("ESTADÍSTICAS DE LONGITUD DE VIALES DE MADRID")
|
||||||
|
print("="*50)
|
||||||
|
for stat, value in estadisticas.items():
|
||||||
|
if stat in ['Total', 'Media', 'Mediana', 'Mínimo', 'Máximo']:
|
||||||
|
print(f"{stat}: {value:,.2f} metros")
|
||||||
|
else:
|
||||||
|
print(f"{stat}: {value:,}")
|
||||||
|
|
||||||
|
# Estadísticas más concretas
|
||||||
|
print(f"\nLongitud promedio por vial: {estadisticas['Media']:,.2f} metros")
|
||||||
|
print(f"Longitud total de calles: {estadisticas['Total']/1000:,.2f} kilómetros")
|
||||||
|
|
||||||
|
# Mostrar algunos ejemplos para las explicaciones
|
||||||
|
# Viales más largos, tienen que corresponder a autopistas
|
||||||
|
print(f"\n--- Top 10 viales más largos ---")
|
||||||
|
# Usar DEN_TX_NOM para el nombre y CV_TX_DENO para tipo de vía
|
||||||
|
top_largas = gdf.nlargest(10, 'longitud_metros')[['CV_TX_DENO', 'DEN_TX_NOM', 'longitud_metros']]
|
||||||
|
for idx, row in top_largas.iterrows():
|
||||||
|
nombre = f"{row['CV_TX_DENO']} {row['DEN_TX_NOM']}" if pd.notna(row['DEN_TX_NOM']) else "Sin nombre"
|
||||||
|
print(f"{nombre}: {row['longitud_metros']:,.2f} metros")
|
||||||
|
|
||||||
|
# Viales más cortos, corresponden a pasajes y plazas
|
||||||
|
print(f"\n--- Top 10 viales más cortos ---")
|
||||||
|
top_cortas = gdf.nsmallest(10, 'longitud_metros')[['CV_TX_DENO', 'DEN_TX_NOM', 'longitud_metros']]
|
||||||
|
for idx, row in top_cortas.iterrows():
|
||||||
|
nombre = f"{row['CV_TX_DENO']} {row['DEN_TX_NOM']}" if pd.notna(row['DEN_TX_NOM']) else "Sin nombre"
|
||||||
|
print(f"{nombre}: {row['longitud_metros']:,.2f} metros")
|
||||||
|
|
||||||
|
# Análisis adicional por tipo de vía por si fuera necesario posteriormente
|
||||||
|
print(f"\n--- Estadísticas por tipo de vía ---")
|
||||||
|
if 'CV_TX_DENO' in gdf.columns:
|
||||||
|
stats_por_tipo = gdf.groupby('CV_TX_DENO')['longitud_metros'].agg([
|
||||||
|
('count', 'count'),
|
||||||
|
('longitud_total', 'sum'),
|
||||||
|
('longitud_promedio', 'mean'),
|
||||||
|
('longitud_maxima', 'max')
|
||||||
|
]).round(2)
|
||||||
|
print(stats_por_tipo.sort_values('longitud_total', ascending=False))
|
||||||
Reference in New Issue
Block a user