0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BigQueryを使用してCSVデータを集計する

Posted at

はじめに

pandasで生徒の点数のデータフレームを作成しCSVファイルへ変換を行いGCSへアップロードします。
その後BigQueryからGCSのCSVファイルを読み込み平均点を算出してみます。

GCSへCSVファイルのアップロード

sampleデータを作成し、CSVファイルをGCSにアップロードします。
まず、GCSへ接続するために必要なPythonライブラリをインストールします。

pip3 install google-cloud-storage

pandasで生徒のテストの点数を作成します。

import pandas as pd

# サンプルデータの作成
data = {
    'Student': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
    'Math': [88, 92, 75, 90, 85],
    'Science': [95, 85, 80, 70, 90],
    'English': [78, 89, 85, 95, 92]
}
# データをDataFrameに変換
df = pd.DataFrame(data)
# CSVファイルに保存
df.to_csv('ファイル名.csv', index=False)

サービスアカウントキーのパスを指定します。
キーはIAMから作成しましょう。

import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'サービスアカウントキー.json'

GCSへCSVファイルをアップロード

from google.cloud import storage

def upload_to_gcs(bucket_name, source_file_name):
    # GCSクライアントを作成
    storage_client = storage.Client()
    # 指定したバケットを取得
    bucket = storage_client.bucket(bucket_name)
    # ローカルファイル名をそのままGCSのオブジェクト名として使用
    destination_blob_name = os.path.basename(source_file_name)
    # アップロードするファイルを指定
    blob = bucket.blob(destination_blob_name)
    # ファイルをGCSへアップロード
    blob.upload_from_filename(source_file_name)
    print(f"アップロードが完了しました!!")

bucket_name = 'GCSのバケット名'
source_file_name = 'アップロードするファイルパス'

upload_to_gcs(bucket_name, source_file_name)

ファイルがGCSに保存されていますね。
テスト用に3ファイル作成しています。
スクリーンショット 2024-08-16 2.02.47.png

各ファイルの中身は以下のようになります。
スクリーンショット 2024-08-15 23.38.46.png

スクリーンショット 2024-08-15 23.40.54.png

スクリーンショット 2024-08-15 23.41.23.png

BigQueryで計算

GCSにデータができたのでBigQueryから生徒のテストの平均点を求めてみましょう。
BigQueryへ接続するために必要なPythonライブラリをインストールします。

pip3 install google-cloud-bigquery pandas
from google.cloud import bigquery

# BigQueryクライアントを作成
bigquery_client = bigquery.Client()
# クエリを定義
query = """
    SELECT
        Student,
        ROUND(AVG(Math), 2) AS avg_math,
        ROUND(AVG(Science), 2) AS avg_science,
        ROUND(AVG(English), 2) AS avg_english
    FROM
        `tenacious-lore-401901.sample_data.test_point`
    GROUP BY
        Student
    ORDER BY
        Student
"""
# クエリを実行し、結果をDataFrameに保存
df = bigquery_client.query(query).to_dataframe()

クエリの結果が以下の通りとなります。
各教科の平均点数を求めることができました。
スクリーンショット 2024-08-16 11.44.21.png

参照

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?