Platform blog

Koalas:pandas から Apache Spark への容易な移行 – データラングリング(カテゴリ変数の導入)

Share this post

データブリックスは本日開催された Spark + AI Summit において、PySpark の DataFrame API を拡張してpandas と互換性を持たせる新しいオープンソースプロジェクトの Koalas(コアラズ) を発表しました。

Python のデータサイエンスはここ数年で急速に拡大し、pandas は今ではエコシステムの要となっています。データサイエンティストはデータセットを入手する場合、pandas を使って検証します。pandas はデータラングリング(データクレンジング/データクリーニングおよびデータ整形)や分析に最適のツールです。実際に、pandas の read_csv は、データサイエンスに取り組む多くの学生が最初に学習する実行コマンドです。

pandas に課題があるとすれば、ビッグデータのスケーリングに適していないことです。pandas は単一のマシンで扱えるスモールデータ用に設計されています。一方、Apache Spark はビッグデータワークロードのデファクトスタンダードとして登場しました。今日、データサイエンティストの多くは pandas を使って、コースワーク、ペットプロジェクト、小さなデータタスクを行っています。しかし、膨大なデータセットを扱うために Spark を活用するには、 PySpark に移行するか、pandas で扱えるようにデータをダウンサンプリングしなければなりません。

Koalas はこの問題を解決します。Koalas を使用することで、データサイエンティストは新しいフレームワークを覚えなくとも、単一のマシンから分散環境へ移行することが可能です。次のように、1つのパッケージを別のパッケージに置き替えるだけで Spark 上で pandas のコードを Koalas にスケーリングすることが可能です。

pandas:


import pandas as pd
df = pd.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]})
# Rename columns
df.columns = [‘x’, ‘y’, ‘z1’]
# Do some operations in place
df[‘x2’] = df.x * df.x

Koalas:


import databricks.koalas as ks
df = ks.DataFrame({'x': [1, 2], 'y': [3, 4], 'z': [5, 6]})
# Rename columns
df.columns = [‘x’, ‘y’, ‘z1’]
# Do some operations in place
df[‘x2’] = df.x * df.x

pandasはPython データサイエンスの標準表現

Python がデータサイエンスの主要言語として認知され、データコミュニティは pandas、matplotlib、numpy などの重要なライブラリをベースとした表現型を開発しました。これらのライブラリが使用できれば、データサイエンティストは自分の考えを十分に表現し、アイデアどおりの結論を導くことが可能になります。また、アイデアを概念化し、すぐに実行することができます。

しかし、自分の専門ではない表現型でライブラリを扱わなければならない場合、作業を中断して数分ごとにスタックオーバーフローをチェックし、コードの動作確認のためだけにワークフローを妨げることになってしまいます。PySpark は使いやすく、pandas との類似点が多くありますが、表現に違いがあります。

データブリックスは、Spark で pandas を有効にすることで、データサイエンティストやデータドリブンな組織の生産性が大幅に向上すると確信しています。Koalas がもたらすメリットは以下のとおりです。

  • Koalas によって、特定のデータセットに pandas も PySpark も使用できる
  • データサイエンティストは、単一のマシン向けに記述された pandas を Koalas に切り替えるだけで、Spark 上でコードのスケールアップができる
  • Koalas を使用することで、Spark の活用するために PySpark を学ぶ必要がなくなり、より多くのデータサイエンティストがビッグデータを扱える

次に、Koalas を使って Spark で簡単に実行できる、シンプルで優れた pandas メソッドの 2 つの例を紹介します。

カテゴリ変数による特徴量エンジニアリング

データサイエンティストが機械学習モデルを構築する際、データラングリングの過程でカテゴリ変数を扱うことがよくあります。通常の手法は、カテゴリ変数をダミー変数としてエンコードすることです。以下の例には、コールタイプ、近傍、ユニットタイプなど、いくつかのカテゴリ変数が含まれています。pandas の get_dummies メソッドは、まさにこれらの変数をエンコードするのに便利なメソッドです。pandas を使って行う方法は以下のとおりです。


import pandas as pd
data = pd.read_csv("fire_department_calls_sf_clean.csv", header=0)
display(pd.get_dummies(data))
実行前の DataFrame
新しい DataFrame
新しい DataFrame

Koalas を使うことで、ほんの少し調整すれば Spark で次のように実行できます。


import databricks.koalas as ks
data = ks.read_csv("fire_department_calls_sf_clean.csv", header=0)
display(ks.get_dummies(data))

これだけです。

タイムスタンプによる算術演算

データサイエンティストは常にタイムスタンプを扱っていますが、実際に正しく処理することはとても厄介です。しかし、pandas は見事な解決策を提供してくれます。日付の DataFrame で説明しましょう。


import pandas as pd
import numpy as np
date1 = pd.Series(pd.date_range('2012-1-1 12:00:00', periods=7, freq='M'))
date2 = pd.Series(pd.date_range('2013-3-11 21:45:00', periods=7, freq='W'))
df = pd.DataFrame(dict(Start_date = date1, End_date = date2))
print(df)

  End_date            Start_date
0 2013-03-17 21:45:00 2012-01-31 12:00:00
1 2013-03-24 21:45:00 2012-02-29 12:00:00
2 2013-03-31 21:45:00 2012-03-31 12:00:00
3 2013-04-07 21:45:00 2012-04-30 12:00:00
4 2013-04-14 21:45:00 2012-05-31 12:00:00
5 2013-04-21 21:45:00 2012-06-30 12:00:00
6 2013-04-28 21:45:00 2012-07-31 12:00:00

pandas で終了日から開始日を引くには、以下のコマンドを実行するだけです。


df['diff_seconds'] = df['End_date'] - df['Start_date']
df['diff_seconds'] = df['diff_seconds']/np.timedelta64(1,'s')
print(df)

  End_date            Start_date          diff_seconds
0 2013-03-17 21:45:00 2012-01-31 12:00:00 35545500.0
1 2013-03-24 21:45:00 2012-02-29 12:00:00 33644700.0
2 2013-03-31 21:45:00 2012-03-31 12:00:00 31571100.0
3 2013-04-07 21:45:00 2012-04-30 12:00:00 29583900.0
4 2013-04-14 21:45:00 2012-05-31 12:00:00 27510300.0
5 2013-04-21 21:45:00 2012-06-30 12:00:00 25523100.0
6 2013-04-28 21:45:00 2012-07-31 12:00:00 23449500.0

pandas を Koalas に置き換えるだけで Spark 上で同じことができます。


import databricks.koalas as ks
df = ks.from_pandas(pandas_df)
df['diff_seconds'] = df['End_date'] - df['Start_date']
df['diff_seconds'] = df['diff_seconds'] / np.timedelta64(1,'s')
print(df)

繰り返しますが、ただこれだけです。

次のステップと Koalas の使用開始

Spark + AI Summit で Reynold Xin が公式発表した Koalas に関する動画をご覧ください。

私たちはこれまで、データラングリング(クレンジング/クリーニング)の困難さや、pandas でのダウンサンプリングの必要性などから、大規模なデータを扱うことに積極的ではない多くのデータサイエンティストに出会いました。そしてそのデータサイエンティストを支援するために Koalas を開発しました。Koalas は Spark での作業のスケーリングを劇的に容易にし、データサイエンティストの意欲を高めると確信しています。

ここまで、一般的な DataFrame の操作メソッドと、pandas の優れたインデックス作成技術を実行してきました。ロードマップの今後の項目は次のとおりです。主にカバレッジの改善に焦点を当てます。

このプロジェクトはまだ初期段階ですが、今後、急速に進展していく予定です。Koalas や使用開始についての詳細は、こちらのプロジェクトの GitHub リポジトリを参照してください。皆様のご意見をお待ちしております。

Databricks 無料トライアル

関連記事

Platform blog

Koalas:pandas から Apache Spark への容易な移行 – データラングリング(カテゴリ変数の導入)

April 24, 2019 Tony LiuTim Hunter による投稿 in お知らせ
データブリックスは本日開催された Spark + AI Summit において、PySpark の DataFrame API を拡張してpandas と互換性を持たせる新しいオープンソースプロジェクトの Koalas(コアラズ) を発表しました。 Python のデータサイエンスはここ数年で急速に拡大し、pandas は今ではエコシステムの要となっています。データサイエンティストはデータセットを入手する場合、pandas を使って検証します。pandas はデータラングリング(データクレンジング/データクリーニングおよびデータ整形)や分析に最適のツールです。実際に、pandas の read_csv は、データサイエンスに取り組む多くの学生が最初に学習する実行コマンドです。 pandas に課題があるとすれば、ビッグデータのスケーリングに適していないことです。pandas は単一のマシンで扱えるスモールデータ用に設計されています。一方、Apache Spark はビッグデータワークロードのデファクトスタンダードとし
See all お知らせ posts