Stanby Tech Blog

求人検索エンジン「スタンバイ」を運営するスタンバイの開発組織やエンジニアリングについて発信するブログです。

RedashのデータをPythonで取得することでデータ管理を容易にする方法を検討してみました

はじめに

初めまして、株式会社スタンバイSQG(Search Quality Group)の前川と申します。
SQGのミッションは検索品質の評価で、評価結果をプロダクト開発にフィードバックしています。 また、私は組織の中で別の役割を担っており、その1つにKPIの品質管理があります。この業務の目的は、組織の意思決定を安定的にサポートすることです。
本記事では、この「KPIの品質管理」において工夫した、Redashのデータ出力をより簡便にするための取り組みを紹介いたします。Redashを活用されている方には、特に参考になる内容となっておりますので、ぜひともご一読ください。

各種ツールを簡単に紹介

今回の取り組みで使用したツールはPythonとRedashです。それぞれについて、どのようなツールかを説明します。

  • Python
    Pythonはオープンソースのプログラミング言語です。多様なモジュールを用いて、数学計算、日付処理、データベース操作などの作業を行うことができます。
    今回はPythonでRedashAPIを実行するモジュールを使い、Redashからデータを取得することとしました。

  • Redash
    Redashはデータを可視化し分析するのに役立つBIツールのオープンソースソフトウェアです。Redashで集計したデータはCSV等のフォーマットでダウンロードすることも可能です。
    私は普段の業務でRedashを操作して指標を集計していますので、今回の作業についてもRedashを通じて指標を集計しています。

PythonでRedashのデータを抽出しようと思った経緯

困っていたこと

普段の業務においては、Redashからで取得したデータをGoogleスプレッドシートに転記し、数値チェックを行って品質管理をしています。
Redashは非常に便利なツールなのですが、日々のルーチンワークを実行しようとした場合は以下のような作業を手動で行う必要があり、煩雑になります。

  1. Redashを実行して指標を集計する
  2. 集計した指標をダウンロードする
  3. ダウンロードしたデータを特定のフォーマットに整形する

1度の作業であればそれほど時間もかかりませんが、日々の業務となれば話は変わってきます。「なるべく簡便に集計したい。自動的に欲しいフォーマットに整形することで作業ミス自体も減らしたい。」といった思いで今回自動化に踏み切ることにしました。
今回ご紹介するプログラムを使えば、Redashからjson形式でデータを取得出来るようになります。

準備

これから具体的なコードを交えて実装方法を説明します。
以下のようなテーブルでデータを取得したいので、まずはRedash用のテーブルとSQLの準備をします。
具体例として、以下のデータが保存されているとします。テーブル名はstanby_tableとします。

date user_id action
2023-12-01 id_1 view
2023-12-01 id_2 click
2023-12-02 id_1 view
2023-12-02 id_1 click
2023-12-02 id_2 click
2023-12-03 id_1 view
2023-12-03 id_3 view

また、Pythonを通じて実行する際には、RedashのURLが必要となります。 今回は仮のURLとして https://redash-host-url/queries/12345 を使って進めます。

こちらのRedashのページに、以下のSQLを保存し、stanby_tableからデータを取得できる状態にします。

SELECT 
    distinct user_id
FROM 
    stanby_table
WHERE 
    date(date) >= date('{{ start_date }}')
    AND date(date) <= date('{{ end_date }}')
LIMIT 
    10
;

上記のSQLは、stanby_tableから、任意の日付を指定して日付範囲のuser_idを重複なく取得します。
後の処理の都合上、日付の指定の変数は start_dateend_date としておきます。

実装の方法

次に、PythonからRedashAPIを利用してデータの集計を行う実装を進めます。
使用するモジュールはオープンソースのredash_dynamic_queryです。このモジュールで、RedashのAPIを実行できます。なお、本記事でご紹介するredash_dynamic_queryのバージョンは1.0.4となります。

Pythonでこのモジュールを実行して、Redashからデータを抽出したいので、まずは、Pythonのスクリプト上で以下のコードを記載し、モジュールをインポートします。インポートとは、別のファイル(モジュール)に記述されたPythonコードを取り込む機能のことです。 以下のコードを実行することで、redash_dynamic_queryを使用できるようになります。

from redash_dynamic_query import RedashDynamicQuery

次に、RedashDynamicQueryの引数を設定します。コードは以下です。

redash = RedashDynamicQuery(
    endpoint = 'https://redash-host-url/',
    apikey = 'your_api_key',
)

endpointはRedashのURLのエンドポイントになります。今回はhttps://redash-host-url/です。
apikeyはRedashのアカウント編集画面で確認できます。 以下の手順で画面を進めれば確認可能です。

  1. Redashを開く
  2. settingsの画面を開く
  3. Accountのタブを開く
  4. API Key欄API Keyを確認する

記載されているAPI Keyをコピーして、上記のプログラムのyour_api_key部分を書き換えます。

次に、クエリの指定を行います。 query_idの変数には、SQL固有の識別番号を代入します。入力する文字はRedashのURLにあるqueries/直後の番号となり、今回は12345です。

query_id = 12345

次に、開始日と終了日の日付を指定します。start_dateend_dateのそれぞれに、文字列で日付を記載してください。形式はyyyy-mm-ddとなります。

start_date = '2023-12-01'  # 開始日
end_date = '2023-12-02'    # 終了日

次に、日付の型をRedashに適した形に変更します。こちらはお手元のテーブルの日付の型次第なので、必要に応じて設定してください。

start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d')

次に、ここまで設定した内容でRedashからデータを取得します。 以下のコードを実行すると、Redashの実行結果を変数resultにjson形式で代入します。

result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date})

これで、Pythonのスクリプトを用いてRedashのデータをjson形式で取得出来るようになりました。

以降は、jsonからデータフレームなど利用用途に合わせて型変換することで、スプレッドシートに簡易に転記したり、グラフ描画での利用、CSVファイル等で出力結果の保存などができます。
ここまでの内容をまとめたコード全体は以下となります。

# モジュールのインポート
from redash_dynamic_query import RedashDynamicQuery

# endpoint と apikey の指定
redash = RedashDynamicQuery(
    endpoint = 'https://redash-host-url/',
    apikey = 'your_api_key',
)

# どのSQLを実行するかを指定
query_id = 12345

# 開始日と終了日を指定
start_date = '2023-12-01'  # 開始日
end_date = '2023-12-02'    # 終了日

# 日付の型を RedashDynamicQuery に適した形に変更
start_date = datetime.strptime(start_date, '%Y-%m-%d').strftime('%Y-%m-%d')

# Redashの実行内容を result にjson形式で格納
result = redash.query(query_id, {'start_date': start_date, 'end_date': end_date})

スタンバイの中の活用事例

冒頭で述べたとおり、私は「KPIの品質管理」の業務を行っており、その一環で今回のプログラムを作成することで、従来困っていたRedashの実行から特定のフォーマットへの整形を、今回ご紹介したPythonのコードで完結できるようになりました。
実際の業務では、紹介したPythonのコードに加え、jsonをデータフレームに変更してGoogleスプレッドシートに転記する処理を行っています。これにより、分析を開始するまでのステップを簡略化し、結果分析のための時間を多く取ることができています。

実装した感想

実装する前は、手作業が多くあり、ヒューマンエラーが生じる危険性もありました。
今回の実装を通じて分析のプロセスまでの作業をなるべく簡略化できたので、データの確認や分析にも多くの時間を割けるようになりました。結果、KPIの品質担保に貢献できていると感じています。
今回紹介したプログラムを使って、Redashの実行結果をPythonで取得できるようにしました。これにより、Pythonを使用してデータ分析が可能となり、さらに高度な分析も行えます。 今後は、この方法を施策の分析にも応用しようと考えています。

まとめ

今回の記事では、PythonでRedashのデータを取得する方法について、具体的なコードを交えて紹介しました。
こちらの処理をすることで、手を動かしていた作業の一部を自動化でき、その結果KPIの分析に費やす時間を増やすことができました。
プログラム自体は非常にシンプルで、かつ今後発展性も見込める実装となりましたので、ご活用いただける内容でしたらとても嬉しいです。

スタンバイのプロダクトや組織について詳しく知りたい方は、気軽にご相談ください。 www.wantedly.com