Lea csv desde Google Cloud storage a pandas dataframe

Estoy intentando leer un archivo csv presente en el cubo de almacenamiento de Google Cloud en un dataframe de panda.

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from io import BytesIO from google.cloud import storage storage_client = storage.Client() bucket = storage_client.get_bucket('createbucket123') blob = bucket.blob('my.csv') path = "gs://createbucket123/my.csv" df = pd.read_csv(path) 

Muestra este mensaje de error:

 FileNotFoundError: File b'gs://createbucket123/my.csv' does not exist 

¿Qué estoy haciendo mal, no puedo encontrar ninguna solución que no implique google datalab?

ACTUALIZAR

A partir de la versión 0.24 de pandas, read_csv admite la lectura directamente desde Google Cloud Storage. Simplemente proporcione un enlace al cubo como este:

 df = pd.read_csv('gs://bucket/your_path.csv') 

Os dejo otras tres opciones por el bien de la integridad.

  • Código casero
  • gcsfs
  • dask

Los cubriré abajo.

La manera más difícil: hazlo tú mismo.

He escrito algunas funciones de conveniencia para leer desde Google Storage. Para hacerlo más legible agregué anotaciones de tipo. Si se encuentra en Python 2, simplemente elimínelos y el código funcionará de la misma manera.

Funciona igualmente en conjuntos de datos públicos y privados, suponiendo que esté autorizado. En este enfoque, no necesita descargar primero los datos a su unidad local.

Cómo usarlo:

 fileobj = get_byte_fileobj('my-project', 'my-bucket', 'my-path') df = pd.read_csv(fileobj) 

El código:

 from io import BytesIO, StringIO from google.cloud import storage from google.oauth2 import service_account def get_byte_fileobj(project: str, bucket: str, path: str, service_account_credentials_path: str = None) -> BytesIO: """ Retrieve data from a given blob on Google Storage and pass it as a file object. :param path: path within the bucket :param project: name of the project :param bucket_name: name of the bucket :param service_account_credentials_path: path to credentials. TIP: can be stored as env variable, eg os.getenv('GOOGLE_APPLICATION_CREDENTIALS_DSPLATFORM') :return: file object (BytesIO) """ blob = _get_blob(bucket, path, project, service_account_credentials_path) byte_stream = BytesIO() blob.download_to_file(byte_stream) byte_stream.seek(0) return byte_stream def get_bytestring(project: str, bucket: str, path: str, service_account_credentials_path: str = None) -> bytes: """ Retrieve data from a given blob on Google Storage and pass it as a byte-string. :param path: path within the bucket :param project: name of the project :param bucket_name: name of the bucket :param service_account_credentials_path: path to credentials. TIP: can be stored as env variable, eg os.getenv('GOOGLE_APPLICATION_CREDENTIALS_DSPLATFORM') :return: byte-string (needs to be decoded) """ blob = _get_blob(bucket, path, project, service_account_credentials_path) s = blob.download_as_string() return s def _get_blob(bucket_name, path, project, service_account_credentials_path): credentials = service_account.Credentials.from_service_account_file( service_account_credentials_path) if service_account_credentials_path else None storage_client = storage.Client(project=project, credentials=credentials) bucket = storage_client.get_bucket(bucket_name) blob = bucket.blob(path) return blob 

gcsfs

gcsfs es un “sistema de archivos Pythonic para Google Cloud Storage”.

Cómo usarlo:

 import pandas as pd import gcsfs fs = gcsfs.GCSFileSystem(project='my-project') with fs.open('bucket/path.csv') as f: df = pd.read_csv(f) 

dask

Dask “proporciona un paralelismo avanzado para análisis, que permite el rendimiento a escala de las herramientas que le gustan”. Es genial cuando necesitas lidiar con grandes volúmenes de datos en Python. Dask intenta imitar gran parte de la API de pandas , lo que facilita su uso para los recién llegados.

Aquí está el read_csv

Cómo usarlo:

 import dask.dataframe as dd df = dd.read_csv('gs://bucket/data.csv') df2 = dd.read_csv('gs://bucket/path/*.csv') # nice! # df is now Dask dataframe, ready for distributed processing # If you want to have the pandas version, simply: df_pd = df.compute() 

Otra opción es usar TensorFlow que viene con la capacidad de hacer una lectura de transmisión desde Google Cloud Storage:

 from tensorflow.python.lib.io import file_io with file_io.FileIO('gs://bucket/file.csv', 'r') as f: df = pd.read_csv(f) 

El uso de tensorflow también le brinda una forma conveniente de manejar comodines en el nombre de archivo. Por ejemplo:

Leyendo el comodín CSV en Pandas

Aquí hay un código que leerá todos los CSV que coincidan con un patrón específico (por ejemplo: gs: // bucket / some / dir / train- *) en un dataframe de Pandas:

 import tensorflow as tf from tensorflow.python.lib.io import file_io import pandas as pd def read_csv_file(filename): with file_io.FileIO(filename, 'r') as f: df = pd.read_csv(f, header=None, names=['col1', 'col2']) return df def read_csv_files(filename_pattern): filenames = tf.gfile.Glob(filename_pattern) dataframes = [read_csv_file(filename) for filename in filenames] return pd.concat(dataframes) 

uso

 DATADIR='gs://my-bucket/some/dir' traindf = read_csv_files(os.path.join(DATADIR, 'train-*')) evaldf = read_csv_files(os.path.join(DATADIR, 'eval-*')) 

read_csv no soporta gs://

De la documentación :

La cadena podría ser una URL. Los esquemas de URL válidos incluyen http, ftp, s3 y file. Para las URL de archivos, se espera un host. Por ejemplo, un archivo local podría ser file: //localhost/path/to/table.csv

Puede descargar el archivo o recuperarlo como una cadena para manipularlo.

Hay tres formas de acceder a los archivos en el GCS:

  1. Descargando la librería cliente ( esta para ti )
  2. Uso de Cloud Storage Browser en la consola de Google Cloud Platform
  3. Usando gsutil, una herramienta de línea de comandos para trabajar con archivos en Cloud Storage.

Usando el Paso 1, configura el GSC para tu trabajo. Después de lo cual tienes que:

 import cloudstorage as gcs from google.appengine.api import app_identity 

Luego, debe especificar el nombre del grupo de almacenamiento en la nube y crear funciones de lectura / escritura para acceder a su grupo:

Puede encontrar el tutorial de lectura / escritura restante aquí :

Si entendí su pregunta correctamente, entonces este enlace puede ayudarlo a obtener una mejor URL para su función read_csv () :

https://cloud.google.com/storage/docs/access-public-data

A partir de pandas==0.24.0 esto es compatible de forma nativa si tiene gcsfs instalado: https://github.com/pandas-dev/pandas/pull/22704 .

Hasta el lanzamiento oficial puedes probarlo con pip install pandas==0.24.0rc1 .