wake-up-neo.com

Lesen Sie csv aus dem Google Cloud-Speicher in den Pandas-Datenrahmen

Ich versuche, eine im Google Cloud Storage-Bucket vorhandene CSV-Datei auf einen Panda-Datenrahmen zu lesen. 

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)

Es zeigt diese Fehlermeldung:

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

Was mache ich falsch, ich kann keine Lösung finden, die Google Datalab nicht beinhaltet?

8
user1838940

AKTUALISIEREN

Seit Version 0.24 von Pandas unterstützt read_csv das direkte Lesen aus Google Cloud Storage. Geben Sie einfach den Link zum Bucket wie folgt an:

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

Der Vollständigkeit halber lasse ich drei weitere Optionen.

  • Hausgemachter Code
  • gcsfs
  • dask

Ich werde sie unten behandeln.

Der harte Weg: Code zum Selbermachen

Ich habe einige praktische Funktionen zum Lesen von Google Storage geschrieben. Um es lesbarer zu machen, fügte ich Typanmerkungen hinzu. Wenn Sie sich auf Python 2 befinden, entfernen Sie diese einfach, und der Code funktioniert trotzdem. 

Es funktioniert gleichermaßen für öffentliche und private Datensätze, vorausgesetzt, Sie sind autorisiert. Bei diesem Ansatz müssen Sie die Daten nicht zuerst auf Ihr lokales Laufwerk herunterladen.

Wie man es benutzt:

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

Der Code:

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, e.g. 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, e.g. 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 ist ein "Pythonic-Dateisystem für Google Cloud Storage". 

Wie man es benutzt:

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 "bietet erweiterte Parallelität für die Analyse und ermöglicht so eine Skalierbarkeit für die von Ihnen bevorzugten Tools". Es ist großartig, wenn Sie mit großen Datenmengen in Python umgehen müssen. Dask versucht, einen Großteil der pandas-API nachzuahmen, wodurch es für Neulinge einfach zu verwenden ist. 

Hier ist die read_csv

Wie man es benutzt:

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()
18

Eine andere Option ist die Verwendung von TensorFlow, mit dem Streaming-Lesevorgänge aus Google Cloud Storage durchgeführt werden können:

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

Mit Tensorflow können Sie auch Platzhalter im Dateinamen bequem behandeln. Zum Beispiel:

Wildcard CSV in Pandas einlesen

Hier ist ein Code, der alle CSVs, die einem bestimmten Muster entsprechen (z. B. gs: // bucket/some/dir/train- *), in einen Pandas-Datenrahmen liest:

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)

verwendungszweck

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

read_csv unterstützt gs:// nicht

Aus der Dokumentation :

Die Zeichenfolge kann eine URL sein. Gültige URL-Schemas sind http, ftp, s3, und Datei. Für Datei-URLs wird ein Host erwartet. Zum Beispiel eine lokale Datei könnte Datei sein: //localhost/path/to/table.csv

Sie können die Datei herunterladen oder als String abrufen , um sie zu bearbeiten.

2
Burhan Khalid

Es gibt drei Möglichkeiten, auf Dateien im GCS zuzugreifen: 

  1. Laden der Client-Bibliothek (dieses für Sie)
  2. Verwenden des Cloud Storage-Browsers in der Google Cloud Platform Console
  3. Verwenden von gsutil, einem Befehlszeilentool zum Arbeiten mit Dateien in Cloud Storage.

Verwenden Sie Schritt 1, setup the GSC für Ihre Arbeit. Nach dem müssen Sie:

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

Dann müssen Sie den Cloud Storage-Bucketnamen angeben und Lese-/Schreibfunktionen für den Zugriff auf Ihren Bucket erstellen:

Das restliche Lese-/Schreib-Tutorial hier :

1
Ahmad M.

Wenn ich Ihre Frage richtig verstanden habe, hilft Ihnen dieser Link möglicherweise, eine bessere URL für Ihre read_csv () - Funktion zu erhalten:

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

1
shubham

Ab pandas==0.24.0 wird dies nativ unterstützt, wenn Sie gcsfs installiert haben: https://github.com/pandas-dev/pandas/pull/22704 .

Bis zur offiziellen Veröffentlichung können Sie es mit pip install pandas==0.24.0rc1 ausprobieren.

1
bnaul