web-dev-qa-db-ja.com

Google CloudストレージからpandasデータフレームにCSVを読み取ります

Google Cloud Storageバケットにあるcsvファイルをパンダデータフレームに読み取ろうとしています。

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)

次のエラーメッセージが表示されます。

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

私は何を間違えていますか、グーグルデータラボを含まないソリューションを見つけることができませんか?

21
user1838940

更新

パンダのバージョン0.24では、read_csvはGoogle Cloud Storageからの直接読み取りをサポートしています。次のようにバケットへのリンクを提供するだけです:

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

完全を期すために、他の3つのオプションを残します。

  • 自家製コード
  • gcsfs
  • 夕暮れ

それらを以下で説明します。

難しい方法:日曜大工のコード

Google Storageから読み込む便利な関数をいくつか作成しました。より読みやすくするために、型注釈を追加しました。 Python 2を使用している場合は、これらを削除するだけで、コードはすべて同じように機能します。

許可されていることを前提として、パブリックデータセットとプライベートデータセットで等しく機能します。このアプローチでは、最初にデータをローカルドライブにダウンロードする必要はありません。

それを使用する方法:

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

コード:

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 は「Google Cloud StorageのPythonファイルシステム」です。

それを使用する方法:

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 「分析に高度な並列処理を提供し、お気に入りのツールに大規模なパフォーマンスを実現します」。 Pythonで大量のデータを処理する必要がある場合に最適です。 Daskはpandas AP​​Iの多くを模倣しようとしているため、初心者でも簡単に使用できます。

これが read_csv です

それを使用する方法:

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

もう1つのオプションは、Google Cloud Storageからストリーミング読み取りを行う機能を備えたTensorFlowを使用することです。

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

Tensorflowを使用すると、ファイル名のワイルドカードを処理する便利な方法も提供されます。例えば:

ワイルドカードCSVをパンダに読み込む

特定のパターン(例:gs:// bucket/some/dir/train- *)に一致するすべてのCSVを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)

使用法

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

read_csvgs://をサポートしていません

ドキュメント から:

文字列はURLである可能性があります。有効なURLスキームには、http、ftp、s3、およびfileが含まれます。ファイルURLの場合、ホストが必要です。たとえば、ローカルファイルはファイル://localhost/path/to/table.csvになります。

ファイルをダウンロード または 文字列として取得 を操作することができます。

3
Burhan Khalid

pandas==0.24.0現在、gcsfsがインストールされている場合、これはネイティブにサポートされます: https://github.com/pandas-dev/pandas/pull/22704

公式リリースまでは、pip install pandas==0.24.0rc1で試してみることができます。

2
bnaul

GCSのファイルにアクセスするには、3つの方法があります。

  1. クライアントライブラリのダウンロード(これはあなたのためです
  2. Google Cloud Platform ConsoleでCloud Storage Browserを使用する
  3. Cloud Storageのファイルを操作するためのコマンドラインツールであるgsutilを使用します。

ステップ1を使用して、 setup 作業用のGSC。その後、以下を行う必要があります。

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

次に、Cloud Storageバケット名を指定し、バケットにアクセスするための読み取り/書き込み関数を作成する必要があります。

残りの読み取り/書き込みチュートリアルを見つけることができます here

1
Ahmad M.

あなたの質問を正しく理解したら、このリンクはあなたのread_csv()関数のより良いURLを得るのに役立つかもしれません:

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

1
shubham