Visualiza datos de estadísticas geoespaciales con un notebook de Colab


En este instructivo, visualizarás datos de estadísticas geoespaciales de BigQuery con un notebook de Colab.

En este instructivo, se usan los siguientes conjuntos de datos públicos de BigQuery:

Para obtener información sobre cómo acceder a estos conjuntos de datos públicos, consulta Accede a conjuntos de datos públicos en la Trusted Cloud by S3NS consola.

Usarás los conjuntos de datos públicos para crear las siguientes visualizaciones:

  • Un diagrama de dispersión de todas las estaciones de bicicletas compartidas del conjunto de datos de Ford GoBike Share
  • Polígonos en el conjunto de datos de vecindarios de San Francisco
  • Un mapa de coropletas de la cantidad de estaciones de bicicletas compartidas por vecindario
  • Un mapa de calor de los incidentes del conjunto de datos de denuncias del Departamento de Policía de San Francisco

Objetivos

  • Configura la autenticación con Trusted Cloud by S3NS y, de manera opcional, Google Maps.
  • Consulta datos en BigQuery y descarga los resultados en Colab.
  • Usar herramientas de ciencia de datos de Python para realizar transformaciones y análisis
  • Crear visualizaciones, incluidos diagramas de dispersión, polígonos, coropletas y mapas de calor

Costos

En este documento, usarás los siguientes componentes facturables de Trusted Cloud by S3NS:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios Trusted Cloud nuevos cumplan con los requisitos para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. In the Trusted Cloud console, on the project selector page, select or create a Trusted Cloud project.

    Go to project selector

  2. Verify that billing is enabled for your Trusted Cloud project.

  3. Enable the BigQuery and Google Maps JavaScript APIs.

    Enable the APIs

  4. Asegúrate de tener los permisos necesarios para realizar las tareas de este documento.
  5. Roles obligatorios

    Si creas un proyecto nuevo, serás el propietario y se te otorgarán todos los permisos de IAM necesarios para completar este instructivo.

    Si usas un proyecto existente, necesitas el siguiente rol a nivel del proyecto para ejecutar trabajos de consulta.

    Make sure that you have the following role or roles on the project:

    Check for the roles

    1. In the Trusted Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Trusted Cloud console, go to the IAM page.

      Ir a IAM
    2. Selecciona el proyecto.
    3. Haz clic en Grant access.
    4. En el campo Principales nuevas, ingresa tu identificador de usuario. Por lo general, este es el identificador de un usuario en un grupo de Workforce Identity. Para obtener más información, consulta Representa a los usuarios del grupo de personal en políticas de IAM o comunícate con tu administrador.

    5. En la lista Seleccionar un rol, elige un rol.
    6. Para otorgar funciones adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.
    7. Haz clic en Guardar.
    8. Para obtener más información sobre los roles en BigQuery, consulta Roles de IAM predefinidos.

      Crea un notebook de Colab

      En este instructivo, se compila un notebook de Colab para visualizar datos de análisis geoespaciales. Para abrir una versión prediseñada del notebook en Colab, Colab Enterprise o BigQuery Studio, haz clic en los vínculos que se encuentran en la parte superior de la versión del instructivo en GitHub: BigQuery Geospatial Visualization in Colab.

      1. Abre Colab.

        Abrir Colab

      2. En el cuadro de diálogo Abrir notebook, haz clic en Notebook nuevo.

      3. Haz clic en Untitled0.ipynb y cambia el nombre del notebook a bigquery-geo.ipynb.

      4. Selecciona File > Save.

      Autentícate con Trusted Cloud by S3NS y Google Maps

      En este instructivo, se consultan conjuntos de datos de BigQuery y se usa la API de JavaScript de Google Maps. Para usar estos recursos, debes autenticar el tiempo de ejecución de Colab con Trusted Cloud by S3NS y la API de Maps.

      Autentícate con Trusted Cloud by S3NS

      1. Para insertar una celda de código, haz clic en Código.

      2. Para autenticarte con tu proyecto, ingresa el siguiente código:

        # REQUIRED: Authenticate with your project.
        GCP_PROJECT_ID = "PROJECT_ID"  #@param {type:"string"}
        
        from google.colab import auth
        from google.colab import userdata
        
        auth.authenticate_user(project_id=GCP_PROJECT_ID)
        
        # Set GMP_API_KEY to none
        GMP_API_KEY = None

        Reemplaza PROJECT_ID con el ID del proyecto.

      3. Haz clic en  Ejecutar celda.

      4. Cuando se te solicite, haz clic en Permitir para otorgar acceso a Colab a tus credenciales, si estás de acuerdo.

      5. En la página Acceder con Google, elige tu cuenta.

      6. En la página Accede al código del notebook creado por terceros, haz clic en Continuar.

      7. En Selecciona a qué puede acceder el código de notebooks creado por terceros, haz clic en Seleccionar todo y, luego, en Continuar.

        Después de completar el flujo de autorización, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Opcional: Autenticación con Google Maps

      Si usas Google Maps Platform como proveedor de mapas base, debes proporcionar una clave de API de Google Maps Platform. El notebook recupera la clave de tus Colab Secrets.

      Este paso solo es necesario si usas la API de Maps. Si no te autenticas con Google Maps Platform, pydeck usa el mapa carto.

      1. Sigue las instrucciones de la página Usa claves de API en la documentación de Google Maps para obtener tu clave de API de Google Maps.

      2. Cambia a tu notebook de Colab y, luego, haz clic en  Secrets.

      3. Haz clic en Agregar Secret nuevo.

      4. En Nombre, ingresa GMP_API_KEY.

      5. En Value, ingresa el valor de la clave de la API de Maps que generaste anteriormente.

      6. Cierra el panel Secrets.

      7. Para insertar una celda de código, haz clic en Código.

      8. Para autenticarte con la API de Maps, ingresa el siguiente código:

        # Authenticate with the Google Maps JavaScript API.
        GMP_API_SECRET_KEY_NAME = "GMP_API_KEY" #@param {type:"string"}
        
        if GMP_API_SECRET_KEY_NAME:
          GMP_API_KEY = userdata.get(GMP_API_SECRET_KEY_NAME) if GMP_API_SECRET_KEY_NAME else None
        else:
          GMP_API_KEY = None
      9. Cuando se te solicite, haz clic en Otorgar acceso para que el notebook acceda a tu clave, si estás de acuerdo.

      10. Haz clic en  Ejecutar celda.

        Después de completar el flujo de autorización, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Instala paquetes de Python y bibliotecas de ciencia de datos

      Además de los módulos de Python colabtools (google.colab), en este instructivo se usan varios otros paquetes de Python y bibliotecas de ciencia de datos.

      En esta sección, instalarás los paquetes pydeck y h3. pydeck proporciona renderización espacial a gran escala en Python, con la tecnología de deck.gl. h3-py proporciona el sistema de indexación geoespacial jerárquico hexagonal H3 de Uber en Python.

      Luego, importa las bibliotecas h3 y pydeck, y las siguientes bibliotecas geoespaciales de Python:

      • geopandas para extender los tipos de datos que usa pandas y permitir operaciones espaciales en tipos geométricos
      • shapely para la manipulación y el análisis de objetos geométricos planos individuales.
      • branca para generar mapas de colores HTML y JavaScript.
      • geemap.deck para la visualización con pydeck y earthengine-api.

      Después de importar las bibliotecas, habilitas las tablas interactivas para los DataFrames de pandas en Colab.

      Instala los paquetes pydeck y h3.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para instalar los paquetes pydeck y h3, ingresa el siguiente código:

        # Install pydeck and h3.
        !pip install pydeck>=0.9 h3>=4.2
      3. Haz clic en  Ejecutar celda.

        Después de completar la instalación, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Importa las bibliotecas de Python

      1. Para insertar una celda de código, haz clic en Código.

      2. Para importar las bibliotecas de Python, ingresa el siguiente código:

        # Import data science libraries.
        import branca
        import geemap.deck as gmdk
        import h3
        import pydeck as pdk
        import geopandas as gpd
        import shapely
      3. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Habilita tablas interactivas para DataFrames de Pandas

      1. Para insertar una celda de código, haz clic en Código.

      2. Para habilitar los DataFrames de pandas, ingresa el siguiente código:

        # Enable displaying pandas data frames as interactive tables by default.
        from google.colab import data_table
        data_table.enable_dataframe_formatter()
      3. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Cómo crear una rutina compartida

      En esta sección, crearás una rutina compartida que renderiza capas en un mapa base.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para crear una rutina compartida para renderizar capas en un mapa, ingresa el siguiente código:

        # Set Google Maps as the base map provider.
        MAP_PROVIDER_GOOGLE = pdk.bindings.base_map_provider.BaseMapProvider.GOOGLE_MAPS.value
        
        # Shared routine for rendering layers on a map using geemap.deck.
        def display_pydeck_map(layers, view_state, **kwargs):
          deck_kwargs = kwargs.copy()
        
          # Use Google Maps as the base map only if the API key is provided.
          if GMP_API_KEY:
            deck_kwargs.update({
              "map_provider": MAP_PROVIDER_GOOGLE,
              "map_style": pdk.bindings.map_styles.GOOGLE_ROAD,
              "api_keys": {MAP_PROVIDER_GOOGLE: GMP_API_KEY},
            })
        
          m = gmdk.Map(initial_view_state=view_state, ee_initialize=False, **deck_kwargs)
        
          for layer in layers:
            m.add_layer(layer)
          return m
      3. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      Crea un diagrama de dispersión

      En esta sección, crearás un diagrama de dispersión de todas las estaciones de bicicletas compartidas en el conjunto de datos públicos de bicicletas compartidas de Ford GoBike de San Francisco recuperando datos de la tabla bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info. El diagrama de dispersión se crea con una capa y una capa de diagrama de dispersión del framework de deck.gl.

      Los diagramas de dispersión son útiles cuando necesitas revisar un subconjunto de puntos individuales (también conocido como verificación puntual).

      En el siguiente ejemplo, se muestra cómo usar una capa y una capa de diagrama de dispersión para renderizar puntos individuales como círculos.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para consultar el conjunto de datos públicos de Ford GoBike Share de San Francisco, ingresa el siguiente código. Este código usa la función mágica %%bigquery para ejecutar la consulta y devolver los resultados en un DataFrame:

        # Query the station ID, station name, station short name, and station
        # geometry from the bike share dataset.
        # NOTE: In this tutorial, the denormalized 'lat' and 'lon' columns are
        # ignored. They are decomposed components of the geometry.
        %%bigquery gdf_sf_bikestations --project {GCP_PROJECT_ID} --use_geodataframe station_geom
        
        SELECT
          station_id,
          name,
          short_name,
          station_geom
        FROM
          `bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info`
      3. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

      4. Para insertar una celda de código, haz clic en Código.

      5. Para obtener un resumen del DataFrame, incluidas las columnas y los tipos de datos, ingresa el siguiente código:

        # Get a summary of the DataFrame
        gdf_sf_bikestations.info()
      6. Haz clic en  Ejecutar celda.

        El resultado debe verse de la siguiente manera:

        <class 'geopandas.geodataframe.GeoDataFrame'>
        RangeIndex: 472 entries, 0 to 471
        Data columns (total 4 columns):
        #   Column        Non-Null Count  Dtype
        ---  ------        --------------  -----
        0   station_id    472 non-null    object
        1   name          472 non-null    object
        2   short_name    472 non-null    object
        3   station_geom  472 non-null    geometry
        dtypes: geometry(1), object(3)
        memory usage: 14.9+ KB
        
      7. Para insertar una celda de código, haz clic en Código.

      8. Para obtener una vista previa de las primeras cinco filas del DataFrame, ingresa el siguiente código:

        # Preview the first five rows
        gdf_sf_bikestations.head()
      9. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Las primeras cinco filas del DataFrame.

      Para renderizar los puntos, debes extraer la longitud y la latitud como coordenadas X e Y de la columna station_geom en el conjunto de datos de bicicletas compartidas.

      Como gdf_sf_bikestations es un geopandas.GeoDataFrame, se accede a las coordenadas directamente desde su columna de geometría station_geom. Puedes recuperar la longitud con el atributo .x de la columna y la latitud con su atributo .y. Luego, puedes almacenarlos en columnas nuevas de longitud y latitud.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para extraer los valores de longitud y latitud de la columna station_geom, ingresa el siguiente código:

        # Extract the longitude (x) and latitude (y) from station_geom.
        gdf_sf_bikestations["longitude"] = gdf_sf_bikestations["station_geom"].x
        gdf_sf_bikestations["latitude"] = gdf_sf_bikestations["station_geom"].y
      3. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      4. Para insertar una celda de código, haz clic en Código.

      5. Para renderizar el diagrama de dispersión de las estaciones de bicicletas compartidas según los valores de longitud y latitud que extrajiste anteriormente, ingresa el siguiente código:

        # Render a scatter plot using pydeck with the extracted longitude and
        # latitude columns in the gdf_sf_bikestations geopandas.GeoDataFrame.
        scatterplot_layer = pdk.Layer(
          "ScatterplotLayer",
          id="bike_stations_scatterplot",
          data=gdf_sf_bikestations,
          get_position=['longitude', 'latitude'],
          get_radius=100,
          get_fill_color=[255, 0, 0, 140],  # Adjust color as desired
          pickable=True,
        )
        
        view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
        display_pydeck_map([scatterplot_layer], view_state)
      6. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Es el diagrama de dispersión renderizado de las estaciones de bicicletas compartidas.

      Visualiza polígonos

      Las estadísticas geoespaciales te permiten analizar y visualizar datos geoespaciales en BigQuery con tipos de datos GEOGRAPHY y funciones geográficas de GoogleSQL.

      El tipo de datos GEOGRAPHY en el análisis geoespacial es una colección de puntos, linestrings y polígonos que se representa como un conjunto de puntos o un subconjunto de la superficie de la Tierra. Un tipo GEOGRAPHY puede contener objetos como los siguientes:

      • Puntos
      • Líneas
      • Polígonos
      • Multipolígonos

      Para obtener una lista de todos los objetos admitidos, consulta la documentación del tipo GEOGRAPHY.

      Si se te proporcionan datos geoespaciales sin conocer las formas esperadas, puedes visualizarlos para descubrirlas. Puedes visualizar formas convirtiendo los datos geográficos al formato GeoJSON. Luego, puedes visualizar los datos de GeoJSON con una capa de GeoJSON del framework de deck.gl.

      En esta sección, consultarás datos geográficos en el conjunto de datos de vecindarios de San Francisco y, luego, visualizarás los polígonos.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para consultar los datos geográficos de la tabla bigquery-public-data.san_francisco_neighborhoods.boundaries en el conjunto de datos San Francisco Neighborhoods, ingresa el siguiente código. Este código usa la función mágica %%bigquery para ejecutar la consulta y devolver los resultados en un DataFrame:

        # Query the neighborhood name and geometry from the San Francisco
        # neighborhoods dataset.
        %%bigquery gdf_sanfrancisco_neighborhoods --project {GCP_PROJECT_ID} --use_geodataframe geometry
        
        SELECT
          neighborhood,
          neighborhood_geom AS geometry
        FROM
          `bigquery-public-data.san_francisco_neighborhoods.boundaries`
      3. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

      4. Para insertar una celda de código, haz clic en Código.

      5. Para obtener un resumen del DataFrame, ingresa el siguiente código:

        # Get a summary of the DataFrame
        gdf_sanfrancisco_neighborhoods.info()
      6. Haz clic en  Ejecutar celda.

        Los resultados deberían verse así:

        <class 'geopandas.geodataframe.GeoDataFrame'>
        RangeIndex: 117 entries, 0 to 116
        Data columns (total 2 columns):
        #   Column        Non-Null Count  Dtype
        ---  ------        --------------  -----
        0   neighborhood  117 non-null    object
        1   geometry      117 non-null    geometry
        dtypes: geometry(1), object(1)
        memory usage: 2.0+ KB
        
      7. Para obtener una vista previa de la primera fila del DataFrame, ingresa el siguiente código:

        # Preview the first row
        gdf_sanfrancisco_neighborhoods.head(1)
      8. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Primera fila del DataFrame.

        En los resultados, observa que los datos son un polígono.

      9. Para insertar una celda de código, haz clic en Código.

      10. Para visualizar los polígonos, ingresa el siguiente código. pydeck se usa para convertir cada instancia del objeto shapely en la columna de geometría al formato GeoJSON:

        # Visualize the polygons.
        geojson_layer = pdk.Layer(
            'GeoJsonLayer',
            id="sf_neighborhoods",
            data=gdf_sanfrancisco_neighborhoods,
            get_line_color=[127, 0, 127, 255],
            get_fill_color=[60, 60, 60, 50],
            get_line_width=100,
            pickable=True,
            stroked=True,
            filled=True,
          )
        view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
        display_pydeck_map([geojson_layer], view_state)
      11. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Son los polígonos renderizados del conjunto de datos de vecindarios de San Francisco.

      Crea un mapa de coropletas

      Si exploras datos con polígonos que son difíciles de convertir al formato GeoJSON, puedes usar una capa de polígonos del framework de deck.gl. Una capa de polígonos puede procesar datos de entrada de tipos específicos, como un array de puntos.

      En esta sección, usarás una capa de polígonos para renderizar un array de puntos y usarás los resultados para renderizar un mapa de coropletas. El mapa coropletas muestra la densidad de las estaciones de bicicletas de uso compartido por vecindario. Para ello, se combinan los datos del conjunto de datos de vecindarios de San Francisco con los del conjunto de datos de bicicletas de uso compartido de Ford GoBike de San Francisco.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para agregar y contar la cantidad de estaciones por vecindario, y crear una columna polygon que contenga un array de puntos, ingresa el siguiente código:

        # Aggregate and count the number of stations per neighborhood.
        gdf_count_stations = gdf_sanfrancisco_neighborhoods.sjoin(gdf_sf_bikestations, how='left', predicate='contains')
        gdf_count_stations = gdf_count_stations.groupby(by='neighborhood')['station_id'].count().rename('num_stations')
        gdf_stations_x_neighborhood = gdf_sanfrancisco_neighborhoods.join(gdf_count_stations, on='neighborhood', how='inner')
        
        # To simulate non-GeoJSON input data, create a polygon column that contains
        # an array of points by using the pandas.Series.map method.
        gdf_stations_x_neighborhood['polygon'] = gdf_stations_x_neighborhood['geometry'].map(lambda g: list(g.exterior.coords))
      3. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      4. Para insertar una celda de código, haz clic en Código.

      5. Para agregar una columna fill_color para cada uno de los polígonos, ingresa el siguiente código:

        # Create a color map gradient using the branch library, and add a fill_color
        # column for each of the polygons.
        colormap = branca.colormap.LinearColormap(
          colors=["lightblue", "darkred"],
          vmin=0,
          vmax=gdf_stations_x_neighborhood['num_stations'].max(),
        )
        gdf_stations_x_neighborhood['fill_color'] = gdf_stations_x_neighborhood['num_stations'] \
          .map(lambda c: list(colormap.rgba_bytes_tuple(c)[:3]) + [0.7 * 255])   # force opacity of 0.7
      6. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      7. Para insertar una celda de código, haz clic en Código.

      8. Para renderizar la capa de polígonos, ingresa el siguiente código:

        # Render the polygon layer.
        polygon_layer = pdk.Layer(
          'PolygonLayer',
          id="bike_stations_choropleth",
          data=gdf_stations_x_neighborhood,
          get_polygon='polygon',
          get_fill_color='fill_color',
          get_line_color=[0, 0, 0, 255],
          get_line_width=50,
          pickable=True,
          stroked=True,
          filled=True,
        )
        view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
        display_pydeck_map([polygon_layer], view_state)
      9. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Es la capa de polígonos renderizada para los vecindarios de San Francisco.

      Crea un mapa de calor

      Los coropletos son útiles cuando tienes límites significativos que se conocen. Si tienes datos sin límites significativos conocidos, puedes usar una capa de mapa de calor para renderizar su densidad continua.

      En el siguiente ejemplo, consultarás datos en la tabla bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents del conjunto de datos de informes del Departamento de Policía de San Francisco (SFPD). Los datos se usan para visualizar la distribución de los incidentes en 2015.

      En el caso de los mapas de calor, se recomienda que cuantifiques y agregues los datos antes de renderizarlos. En este ejemplo, los datos se cuantifican y agregan con la indexación espacial H3 de Carto. El mapa de calor se crea con una capa de mapa de calor del framework de deck.gl.

      En este ejemplo, la cuantificación se realiza con la biblioteca de Python h3 para agregar los puntos de incidentes en hexágonos. La función h3.latlng_to_cell se usa para asignar la posición del incidente (latitud y longitud) a un índice de celda H3. Una resolución de H3 de nueve proporciona suficientes hexágonos agregados para el mapa de calor. La función h3.cell_to_latlng se usa para determinar el centro de cada hexágono.

      1. Para insertar una celda de código, haz clic en Código.

      2. Para consultar los datos del conjunto de datos de denuncias del Departamento de Policía de San Francisco (SFPD), ingresa el siguiente código. Este código usa la función mágica%%bigquery para ejecutar la consulta y devolver los resultados en un DataFrame:

        # Query the incident key and location  data from the SFPD reports dataset.
        %%bigquery gdf_incidents --project {GCP_PROJECT_ID} --use_geodataframe location_geography
        
        SELECT
          unique_key,
          location_geography
        FROM (
          SELECT
            unique_key,
            SAFE.ST_GEOGFROMTEXT(location) AS location_geography, # WKT string to GEOMETRY
            EXTRACT(YEAR FROM timestamp) AS year,
          FROM `bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents` incidents
        )
        WHERE year = 2015
      3. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

      4. Para insertar una celda de código, haz clic en Código.

      5. Para calcular la celda de la latitud y la longitud de cada incidente, agrega los incidentes de cada celda, construye un DataFrame de geopandas y agrega el centro de cada hexágono para la capa del mapa de calor, ingresa el siguiente código:

        # Compute the cell for each incident's latitude and longitude.
        H3_RESOLUTION = 9
        gdf_incidents['h3_cell'] = gdf_incidents.geometry.apply(
            lambda geom: h3.latlng_to_cell(geom.y, geom.x, H3_RESOLUTION)
        )
        
        # Aggregate the incidents for each hexagon cell.
        count_incidents = gdf_incidents.groupby(by='h3_cell')['unique_key'].count().rename('num_incidents')
        
        # Construct a new geopandas.GeoDataFrame with the aggregate results.
        # Add the center of each hexagon for the HeatmapLayer to render.
        gdf_incidents_x_cell = gpd.GeoDataFrame(data=count_incidents).reset_index()
        gdf_incidents_x_cell['h3_center'] = gdf_incidents_x_cell['h3_cell'].apply(h3.cell_to_latlng)
        gdf_incidents_x_cell.info()
      6. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        <class 'geopandas.geodataframe.GeoDataFrame'>
        RangeIndex: 969 entries, 0 to 968
        Data columns (total 3 columns):
        #   Column         Non-Null Count  Dtype
        --  ------         --------------  -----
        0   h3_cell        969 non-null    object
        1   num_incidents  969 non-null    Int64
        2   h3_center      969 non-null    object
        dtypes: Int64(1), object(2)
        memory usage: 23.8+ KB
        
      7. Para insertar una celda de código, haz clic en Código.

      8. Para obtener una vista previa de las primeras cinco filas del DataFrame, ingresa el siguiente código:

        # Preview the first five rows.
        gdf_incidents_x_cell.head()
      9. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Las primeras cinco filas del DataFrame.

      10. Para insertar una celda de código, haz clic en Código.

      11. Para convertir los datos a un formato JSON que pueda usar HeatmapLayer, ingresa el siguiente código:

        # Convert to a JSON format recognized by the HeatmapLayer.
        def _make_heatmap_datum(row) -> dict:
          return {
              "latitude": row['h3_center'][0],
              "longitude": row['h3_center'][1],
              "weight": float(row['num_incidents']),
          }
        
        heatmap_data = gdf_incidents_x_cell.apply(_make_heatmap_datum, axis='columns').values.tolist()
      12. Haz clic en  Ejecutar celda.

        Después de ejecutar el código, no se generará ningún resultado en tu notebook de Colab. La marca de verificación junto a la celda indica que el código se ejecutó correctamente.

      13. Para insertar una celda de código, haz clic en Código.

      14. Para renderizar el mapa de calor, ingresa el siguiente código:

        # Render the heatmap.
        heatmap_layer = pdk.Layer(
          "HeatmapLayer",
          id="sfpd_heatmap",
          data=heatmap_data,
          get_position=['longitude', 'latitude'],
          get_weight='weight',
          opacity=0.7,
          radius_pixels=99,  # this limitation can introduce artifacts (see above)
          aggregation='MEAN',
        )
        view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
        display_pydeck_map([heatmap_layer], view_state)
      15. Haz clic en  Ejecutar celda.

        El resultado es similar a este:

        Es el mapa de calor renderizado.

      Limpia

      Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

      Borra el proyecto

      Console

      1. In the Trusted Cloud console, go to the Manage resources page.

        Go to Manage resources

      2. In the project list, select the project that you want to delete, and then click Delete.
      3. In the dialog, type the project ID, and then click Shut down to delete the project.

      gcloud

      1. In the Trusted Cloud console, go to the Manage resources page.

        Go to Manage resources

      2. In the project list, select the project that you want to delete, and then click Delete.
      3. In the dialog, type the project ID, and then click Shut down to delete the project.

      Borra tu clave de API de Google Maps y tu notebook

      Después de borrar el proyecto Trusted Cloud , si usaste la API de Google Maps, borra la clave de la API de Google Maps de tus Colab Secrets y, luego, borra el notebook de forma opcional.

      1. En tu Colab, haz clic en  Secretos.

      2. Al final de la fila GMP_API_KEY, haz clic en  Borrar.

      3. Opcional: Para borrar el notebook, haz clic en Archivo > Mover a la papelera.

      ¿Qué sigue?