Consulta el seminario de capacitación Python Tips and Tricks for ArcGIS donde @DerekNelson1 y yo mostramos docenas de estrategias para ayudarte a automatizar tareas repetitivas y flujos de trabajo complejos.
Busca soluciones existentes antes de empezar desde cero.
Hay muchas probabilidades de que alguien más haya tenido un problema similar y haya creado un módulo Python que puedes usar para ayudar a resolver el problema.
ArcPy es para los tipos de tareas que harías en ArcGIS Pro.
Si buscas automatizar tareas de geoprocesamiento o trabajar con archivos locales y bases de datos, la biblioteca ArcPy tiene funciones Python que replican las cosas que puedes hacer manualmente en la interfaz gráfica de usuario.
La ArcGIS API for Python es para los tipos de tareas que harías en tu portal.
Automatizar la gestión de usuarios, grupos y contenido en tu portal ArcGIS Online o ArcGIS Enterprise es un gran caso de uso para la ArcGIS API for Python. La API Python también tiene herramientas para crear un Spatially Enabled DataFrame a partir de datos locales o servicios de entidades. Esta es una extensión de un Pandas DataFrame, por lo que viene con todo el poder de la manipulación tabular de datos de Pandas junto con propiedades espaciales y métodos para manejar datos geográficos.
Los Notebooks son excelentes para enseñar, compartir y contar historias con código.
La capacidad de dividir el código en celdas, agregar markdown para explicar el código e incluir la salida en el notebook los convierte en herramientas poderosas para ayudar a iterar sobre tu código y ayudar a otros a entender el contexto e importancia del trabajo representado en el notebook.
Un IDE tiene herramientas potentes para facilitar la escritura de código.
Un entorno de desarrollo integrado como PyCharm o VS Code incluye herramientas sofisticadas de depuración, detección de errores y advertencias, linting automatizado y útiles herramientas de autocompletado para facilitar escribir mucho código. Incluso se está volviendo común que los IDE integren asistentes AI para código que aceleran aún más el desarrollo.
Gestionar un entorno Python es difícil. Espera encontrar desafíos.
Cada módulo en un entorno Python debe ser compatible con todos los demás módulos. Puede ser fácil romper accidentalmente tu entorno de maneras sutiles.
Usa el entorno Python predeterminado de ArcGIS Pro para minimizar desafíos.
Afortunadamente, el entorno arcgispro-py3 que viene con ArcGIS Pro tiene un conjunto de paquetes seleccionados por desarrolladores Esri que contiene las bibliotecas que necesitarás para la gran mayoría de tareas GIS. Debido a que no puedes alterar este entorno predeterminado, siempre tendrás al menos un entorno Python funcional si trabajas con ArcGIS Pro.
Clona el entorno predeterminado para crear un entorno personalizado.
Para esos casos donde necesitas bibliotecas adicionales que no están incluidas con arcgispro-py3, puedes clonar el entorno predeterminado y agregar esas bibliotecas desde el Administrador de Paquetes en la pestaña Proyecto de ArcGIS Pro. Tienes acceso a miles de bibliotecas Python a través de conda que puedes instalar desde la interfaz.
Usa conda para gestión avanzada del entorno. Evita pip si es posible.
Algunas tareas avanzadas requieren una gestión del entorno más compleja que no puede hacerse mediante la interfaz ArcGIS Pro. Puedes acceder a conda desde la línea de comandos para esas tareas, como especificar un canal particular desde donde obtener un paquete o exportar tu entorno como archivo texto. Aunque es posible instalar paquetes con pip, corres el riesgo de instalar paquetes incompatibles porque pip no resuelve completamente todas las dependencias en tu entorno. A veces necesitas usar pip si un paquete requerido no está disponible en ningún canal conda, pero es mejor evitarlo si es posible.
Sé consciente de las dependencias y licencias de paquetes/bibliotecas listadas en el Administrador de Paquetes.
El Administrador de Paquetes te ayudará a identificar dependencias para todas tus bibliotecas instaladas. También enlazará a la licencia para cualquier paquete disponible para instalación, así puedes asegurarte que los requisitos de licencia son compatibles con tu caso de uso.
Enviar a ventana Python/Notebook.
Puedes arrastrar y soltar una herramienta desde el panel Geoprocesamiento a la ventana Python para obtener la sintaxis correcta para la herramienta. En versiones recientes de ArcGIS Pro, también puedes arrastrarla a un ArcGIS Notebook.
Aprovecha recursos existentes como modelos ModelBuilder.
Si ya tienes un modelo que realiza una tarea, no necesitas reescribirlo desde cero para usarlo en un script Python. Puedes llamar al modelo como una herramienta geoprocesamiento en tu script. También tienes la opción que ArcGIS Pro exporte tu modelo como código Python.
Verifica que archivos y clases entidad existan antes de ejecutar código sobre ellos.
La función Exists probará si un objeto dato particular realmente existe o no. Si no existe, puedes omitir ejecutar parte del código. Estrategias para retornos tempranos ayudan a que tu código corra más rápido.
Verifica que filas/valores existan antes de ejecutar.
Aun si un objeto dato existe, puede tener datos vacíos. Puedes usar la función GetCount para identificar si una tabla está vacía y omitir ejecución del código si es así.
Parametriza elementos del modelo para permitir entrada del usuario.
Los modelos con parámetros son más fáciles de incorporar en un script porque puedes insertar programáticamente diferentes valores entrada para sus parámetros.
Copiar comando Python desde la interfaz gráfica en ArcGIS Pro.
Cuando abres una herramienta en el panel Geoprocesamiento, hay una pequeña flecha hacia arriba junto al botón Ejecutar. Una opción es Copiar comando Python. Esto copiará un fragmento Python que representa los parámetros necesarios para replicar los parámetros que has llenado en la interfaz usuario. Este es nuestro consejo más impactante para usuarios familiarizados haciendo tareas geoprocesamiento en ArcGIS Pro pero nuevos en Python. Puedes ver la correspondencia entre los parámetros elegidos en la interfaz familiar y los valores pasados como argumentos a la función Python. Además de obtener una copia del comando Python desde el panel Geoprocesamiento, también puedes hacer clic derecho sobre cualquier elemento en tu Historial Geoprocesamiento y obtener el mismo fragmento.
Usa Copiar ruta en la UI ArcGIS Pro.
Las rutas archivo son tediosas para escribir y es fácil cometer errores. En el panel Catálogo en ArcGIS Pro, puedes hacer clic derecho sobre un objeto dato y Copiar ruta para no tener que escribirla.
Revisa regularmente que tu código devuelva resultados esperados mientras construyes.
No quieres pasar horas escribiendo código sin verificar si realmente funciona. Cuanto más código escribas entre pruebas, más código tendrás que revisar por errores cuando inevitablemente falle. Revisiones frecuentes pueden ayudarte a identificar código problemático temprano.
Seaborn es excelente para gráficos/chartas.
Las visualizaciones gráficas pueden ayudarte (y ayudar a otras personas) a entender mejor tus datos. Seaborn es una buena biblioteca para crear esas visualizaciones, y cuando lo ejecutas en un notebook, puedes ver directamente la salida junto con tu código.
import seaborn as sns
# Diccionario de valores
cryptid_data = {
"Lochness Monster":LochnessMonsterCount,
"Chupacabra":ChupacabraCount,
"Bigfoot":BigfootCount
}
# Gráfico barras desde el diccionario
cryptid_plot = sns.barplot(
x=list(cryptid_data.keys()),
y=list(cryptid_data.values())
)
Nunca pongas credenciales login en tu código.
Esto representa un gran riesgo seguridad. La ArcGIS API for Python te permite aprovechar las credenciales login de tu entorno si trabajas en ArcGIS Pro, Notebook Server o ArcGIS Online
Cuaderno. También puedes usar perfiles, que utilizan las herramientas de gestión de secretos de tu sistema operativo, o PKI que usa certificados de seguridad. Consulta la
documentación Trabajando con diferentes esquemas de autenticación para más detalles.<\/P>
Los Notebooks tienen una salida enriquecida que puede incluir imágenes, hipervínculos y texto formateado.<\/STRONG><\/P>Esto es parte de lo que hace que un notebook sea tan bueno para enseñar y compartir. La salida enriquecida ayuda a las personas a entender mejor los resultados del trabajo que has realizado en tu código.<\/P>Usa parámetros adicionales para acotar tu búsqueda en la ArcGIS API for Python.<\/STRONG><\/P>El método search del ContentManager puede buscar por categorías o item_type o mediante una consulta en varios campos. Puedes ver algunos ejemplos de consultas en este artículo de la base de conocimientos.<\/P>Asigna nombres significativos a las variables de los objetos con los que trabajas.<\/STRONG><\/P>Asignar nombres a las variables te permitirá usar los valores que creas. Darles nombres significativos te ayudará a entender qué significan esos valores. <\/P> <\/P>x = 2405<\/code><\/pre> <\/P>No significa realmente nada.<\/P> <\/P>population = 2405<\/code><\/pre> <\/P>Proporciona el contexto relevante para el valor dentro del script.<\/P>Sé consciente del tipo específico de objeto con el que estás trabajando.<\/STRONG><\/P>Diferentes objetos tienen diferentes propiedades y métodos. Es fácil confundirse con tipos similares de objetos, como FeatureLayerCollection, FeatureLayer, y FeatureSet. Usa la comprobación de tipo para confirmar con qué estás trabajando, y la documentación para verificar qué puedes hacer con un objeto en particular.<\/P>Busca arcpy <lo que intentas hacer>.<\/STRONG><\/P>Los motores de búsqueda como Google y Bing casi siempre devolverán la documentación correcta en los primeros resultados. Los resultados de Esri Community y Stack Exchange también suelen ser recursos valiosos porque provienen de personas haciendo preguntas. Hay una muy buena posibilidad de que alguien más ya haya hecho la misma pregunta que tú, y puedas ver qué les funcionó.<\/P>La documentación es tu mejor amiga<\/STRONG><\/P>Nadie recuerda todo esto. La habilidad más importante que puedes cultivar es familiarizarte con la documentación. Usa el código de ejemplo para ver cómo funcionan diferentes funciones y objetos.<\/P>Usa argumentos con palabras clave (arguments) en lugar de solo argumentos posicionales.<\/STRONG><\/P>Usar palabras clave al llamar funciones, en lugar de depender solo del orden de los argumentos, hace tu código más legible. Te permite omitir algunos parámetros opcionales y hace más obvio para quienes lean tu código después para qué son los diferentes valores.<\/P>Utiliza help() o ?<\/STRONG><\/P>Pasa un objeto a la función help para acceder a la documentación de esa función sin tener que salir de tu entorno de desarrollo. Eso reduce el costo cognitivo del cambio de contexto y facilita volver a escribir código. En un entorno notebook, también puedes añadir un ? a un objeto para obtener documentación bien formateada.<\/P>Usa listas y bucles para procesar datos por lotes.<\/STRONG><\/P>ArcPy tiene varias funciones de lista como ListWorkspaces o ListFiles que generan automáticamente listas de objetos de datos. Una vez que tienes una lista, puedes iterar sobre todos los elementos para realizar alguna tarea.<\/P> <\/P># Establece el espacio de trabajo
arcpy.env.workspace = r"C:\Input_Data"
# Lista todas las geodatabases archivo en ese espacio
fgdbs = arcpy.ListWorkspaces(workspace_type="FileGDB")
# Ejecuta el modelo para cada geodatabase archivo en el espacio
for gdb in fgdbs:
arcpy.PythonTipsandTricksatbx.Model1(Database=gdb)<\/code><\/pre> <\/P>Programa tareas periódicas<\/STRONG><\/P>Si un proceso necesita ejecutarse cada mes, semana o incluso cada minuto, puedes programar esa tarea. Las herramientas locales pueden ser programadas desde la interfaz ArcGIS Pro. También puedes programar notebooks ejecutándose en ArcGIS Notebook Server o en ArcGIS Online.<\/P>Configura variables ambientales para controlar cómo funcionan las herramientas geoprocesamiento arcpy<\/STRONG><\/P>Si necesitas establecer un espacio de trabajo, asegurar que las salidas puedan sobrescribirse, especificar una referencia espacial de salida u otra variable ambiental de geoprocesamiento, puedes declararlas usando la clase env en ArcPy. No todas las herramientas respetan todas las variables ambientales, así que asegúrate de revisar la documentación específica para ver cuáles soporta cada herramienta.<\/P>Usa variables para rutas de archivos, no las codifiques directamente en los parámetros de función.<\/STRONG><\/P>Las rutas de archivos son largas, difíciles de leer y a menudo no reflejan el propósito o significado de los datos que representan. Al asignarlas a nombres variables, puedes simplificar la referencia a los datos en esa ruta y darles un nombre que proporcione el contexto adecuado para esos datos.<\/P>Usa la función Describe para obtener información sobre un elemento de datos.<\/STRONG><\/P>En la interfaz gráfica, si quieres saber sobre un elemento, usualmente puedes hacer clic derecho y seleccionar Propiedades. En un script no puedes hacer clic derecho en nada. La función Describe puede crear un objeto que contiene todas las propiedades del elemento. Puedes acceder a esas propiedades y usarlas en tu script. <\/P> <\/P>import pandas as pd
import arcpy
# Las herramientas ArcPy respetan el entorno workspace, pero pandas no
# Usa Describe para extraer la ruta completa del archivo
arcpy.env.workspace = r"C:\Data"
delays = "AA_delays_jan_2023.csv"
desc = arcpy.Describe(delays)
delays_df = pd.read_csv(desc.catalogPath)<\/code><\/pre> <\/P>Usa la biblioteca pandas para manipulación tabular de datos.<\/STRONG><\/P>Cargar tablas o clases de entidad en un DataFrame pandas te permite usar las potentes herramientas de esa biblioteca para limpiar, resumir, agrupar y agregar tus datos (¡y más!). La extensión Spatially Enabled DataFrame para pandas creada por ArcGIS API for Python te permite combinar las herramientas estándar pandas con funcionalidad espacial adicional para datos geográficos.<\/P> <\/P>delays_df.fillna(0, inplace=True)
airport_group = delays_df.groupby(['ORIGIN_AIRPORT_SEQ_ID'])
delays_by_airport_df = airport_group.agg({'WEATHER_DELAY': 'mean'})<\/code><\/pre> <\/P>Une datos no espaciales con datos espaciales para aprovechar las herramientas de análisis espacial.<\/STRONG><\/P>Los conjuntos de datos con los que trabajas a menudo serán implícitamente espaciales, pero sin geometría real. Por ejemplo, datos sobre una ubicación conocida o datos con direcciones en lugar de coordenadas. Puedes incorporar estos conjuntos a tu análisis espacial si los unes con geometrías usando herramientas como Join, Spatial Join o Geocoding. Si tienes un Spatially Enabled DataFrame, puedes usar la función merge en pandas para unir datos espaciales y no espaciales en un nuevo Spatially Enabled DataFrame.<\/P> <\/P>airports_sdf = pd.DataFrame.spatial.from_featureclass(airports_fc)
airport_delays_sdf = airports_sdf.merge(
right=delays_by_airport_df,
how='inner',
left_on='AIRPORT_SEQ_ID',
right_on='ORIGIN_AIRPORT_SEQ_ID'
)<\/code>
<\/>\nSpatially Enabled DataFrames pueden ser entradas para muchas herramientas geoprocesamiento.<\/>\nAunque un DataFrame no es una clase entidad, puedes tratarlo como tal para muchas herramientas. Esto es útil porque no tienes que exportar el DataFrame a otro formato solo para hacer procesamiento adicional. <\/>\n <\/>\n\n<\/>\n <\/>\nUsa variables para hacer it más fácil encadenar herramientas de geoprocesamiento juntas.<\/STRONG><\/P>En análisis complejos, a menudo quieres tomar la salida de una herramienta y pasarla como entrada a otra herramienta. Las variables facilitan escribir código flexible, porque puedes cambiar el valor de la variable sin tener que alterar todo el código de las herramientas de geoprocesamiento que escribiste. <\/P> <\/P># Unir espacialmente un DataFrame a una clase de entidad
arcpy.analysis.SpatialJoin(
airport_delays_sdf,
climate_data,
delays_by_airport_weather,
match_option="CLOSEST"
)
# Pasar la salida de Spatial Join como entrada a GLR
arcpy.GeneralizedLinearRegression_stats(
in_features=delays_by_airport_weather,
dependent_variable="WEATHER_DELAY",
explanatory_variables= ["Mean_T_f_01_Jan", "Mean_mmPr_01_Jan"]
model_type="CONTINUOUS",
output_features=delay_climate_glr",
)<\/code><\/pre> <\/P>Usa variables para facilitar la iteración y experimentación con valores de parámetros.<\/STRONG><\/P>A menudo con una tarea compleja, querrás probar diferentes valores para algunos de los parámetros. O querrás hacer que esos parámetros sean definidos por el usuario para que el script pueda manejar entradas diferentes de usuarios distintos. Codificar los valores directamente en los parámetros hace que eso sea más difícil. Asignar variables a esos valores y sacarlos de la llamada a la función lo hace más fácil.<\/P> <\/P># Sacar valores fuera de la llamada a la función
dependent_variable = "WEATHER_DELAY"
explanatory_variables = [
"Mean_T_f_01_Jan",
"Mean_mmPr_01_Jan"
]
arcpy.GeneralizedLinearRegression_stats(
in_features=delays_by_airport_weather,
dependent_variable=dependent_variable,
explanatory_variables= explanatory_variables
model_type="CONTINUOUS",
output_features=delay_climate_glr
)<\/code><\/pre> <\/P>Aprende los atajos de productividad de tu entorno de desarrollo<\/STRONG><\/P>Probablemente estés familiarizado con herramientas como ctrl+c para copiar o ctrl+z para deshacer. Diferentes entornos de desarrollo también tienen sus propios atajos de teclado y macros que te permiten ser más productivo. Puede tomar algo de tiempo aprender estos atajos, pero cuanto más código escribas, más tiempo ahorrarás al final aprendiendo ellos. En un entorno notebook, puedes hacer clic en la paleta de comandos en el lado derecho de la barra de herramientas para ver todos los atajos.<\/P>Cuando recibas un error frustrante, aléjate un rato.<\/STRONG><\/P>De lejos, la mejor estrategia para depurar es un descanso. Da un paseo. Toma un vaso de agua. Trabaja en otra cosa. Ve a dormir. Cuando regreses al problema, a menudo tendrás una perspectiva diferente que te permitirá superar el problema. Si te estás enojando o frustrando, sabes que es hora de tomar un descanso.<\/P>Consigue un compañero que te ayude.<\/STRONG><\/P>La segunda estrategia más valiosa para depurar es pedir ayuda. Dedica algo de tiempo a intentar resolver el problema por tu cuenta primero, pero no guardes el problema para ti para siempre. A veces un compañero puede detectar un problema muy rápido que tú no viste. Y cuando tu compañero tiene un problema, puede acudir a ti para pedir ayuda.<\/P>Empieza desde el final del mensaje de error.<\/STRONG><\/P>Un mensaje de error no es una novela. No lo leas desde el principio hasta el fin por diversión. Es una novela de misterio. Salta al final para descubrir al culpable. Las últimas líneas en un mensaje de error probablemente serán las más útiles.<\/P>El éxito en depurar significa obtener un error diferente al anterior.<\/STRONG><\/P>Este es un consejo clave para manejar tu estado emocional durante una sesión de depuración. Si conceptualizas el éxito como obtener tu código perfecto, nunca ganarás. Porque el código que hace algo interesante siempre es imperfecto. Pero si piensas en el éxito como avanzar incrementalmente hacia la perfección, experimentarás muchas victorias en el camino. <\/P>Usa declaraciones print para verificar valores y tipos de datos.<\/STRONG><\/P>Las variables Python pueden cambiar valores e incluso tipos de datos. Eso lo hace extremadamente flexible, pero esa flexibilidad también es la fuente de muchos errores. La forma más simple de verificar si una variable tiene el valor o tipo correcto es imprimirla.<\/P> <\/P># Imprime el valor del csv_list para asegurarte que es correcto
arcpy.env.workspace = r"C:\LTS"
csv_list = arcpy.ListFiles("*.csv")
print(csv_list)<\/code><\/pre> <\/P>Las rutas incorrectas a archivos son una fuente frecuente de error.<\/STRONG><\/P>Copiar y pegar rutas a archivos puede ayudar con problemas asociados a errores tipográficos en las rutas. Pero aún podrías copiar la ruta equivocada. O alguien más usando tu script puede no tener los datos en la misma ruta que codificaste directamente en el script. Si hay un problema accediendo o cargando datos, la ruta del archivo debería ser una de las primeras cosas que revises.<\/P>Los errores tipográficos son otra fuente frecuente de error.<\/STRONG><\/P>Una cosa curiosa sobre el cerebro humano es que sabes lo que querías escribir, así que ves lo que querías escribir, no lo que realmente escribiste. Las rutas a archivos, nombres largos de funciones o caracteres especiales son fuentes comunes de errores tipográficos. Encontrar errores tipográficos es un buen caso para tener un compañero que te ayude, porque ellos solo ven lo que realmente escribiste.<\/P>La autocompletación puede ayudar a evitar errores tipográficos.<\/STRONG><\/P>Un IDE tiene herramientas sofisticadas de autocompletado que pueden ayudarte a encontrar la función o nombre del parámetro correcto. No solo te ahorra tiempo usar mucho el autocompletado, sino que también reduce drásticamente el riesgo de escribir un valor incorrecto. Estas herramientas de autocompletado son una de las primeras cosas que deberías practicar para aprovechar al máximo tu entorno de desarrollo.<\/P>Python complementa tu experiencia en la materia; no la reemplaza.<\/STRONG><\/P>Código perfecto que se ejecuta sin error y resuelve el problema equivocado no vale nada. Tu experiencia en climatología, demografía, transporte u otro dominio que use datos espaciales importa muchísimo. Python es una herramienta extra que puedes usar para multiplicar el valor de esa experiencia.<\/P>Recursos adicionales<\/STRONG><\/P>Para formación adicional en Python, consulta el curso Creating Python Scripts for ArcGIS de Esri: https:\/\/go.esri.com\/python-course<\/A>.<\/SPAN><\/SPAN><\/LI>Haz preguntas y responde en las Comunidades Esri para Python\ArcPy<\/A> y la ArcGIS API for Python<\/A>. <\/SPAN><\/SPAN><\/LI><\/UL>