はじめに
2019年4月に Tony Liu 氏と Tim Hunter 氏によって投稿されました「 Koalas: Easy Transition from pandas to Apache Spark 」の記事を翻訳してまとめてみました。
本記事のリンクと、Reynold Xin 氏が Spark + AI Summit で Koalas の公式アナウンス発表の動画のリンクは下記になります。
■本記事リンク
Koalas: Easy Transition from pandas to Apache Spark
■Koalas の公式アナウンス発表動画リンク
Announcing Koalas Open Source Project | Reynold Xin (Databricks), Brooke Wenig (Databricks)
Koalas とは
本日、Spark + AI サミットにて Koalas という PySpark の データフレーム API を増強させ、pandas と互換性を保たせる新しいオープンソースプロジェクトを発表しました。
Python のデータサイエンスはここ数年間で拡大し、データサイエンティストは pandas を使ってデータセットに取り掛かるようになりました。pandas はデータを解析をするのにとても役立ちます。
実際に、pandas の read_csv は学生がデータサイエンスを始める際の最初のコマンドとしてよく使われてます。
しかき、そんな pandas にも弱点はあります。それは、ビッグデータに向いてないということです。
■pandas の抱える弱点
- pandas は1台のマシンで対処できる小さなデータセット向けにデザインされているため、ビッグデータには不向き
- とても大きなデータに取り組む場合は PySpark に移行するか、pandas でも利用できるデータにダウンサンプルする必要がある
しかし、Koalas の登場によりデータサイエンティストは新しいフレームワークを覚えずとも、1台のマシンから分散環境に移行することができます。
下記にあるように、1つのパッケージを他に置き換えるだけで pandas のコードを Koalas にスケーリングすることができます。
■pandas
1 2 3 4 5 6 |
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
1 2 3 4 5 6 |
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 がデータサイエンスにおける1次言語として現れたことで、コミュニティは numpy や matplotlib、pandas などを含む、最も重要なライブラリをベースに言語を開発していきました。
これらの言語をデータサイエンティストが利用できれば、結果に向けて自分たちの考えをフルに表現し、そしてアイディアを辿ることができます。彼らは何かを概念化し、そしてすぐに実行に移すことに長けています。
しかし、自分たちの言語外のライブラリで取り組むこととなると、話は別です。
つまずいたり、数分おきにスタックオーバーフローを確認する羽目になり、自分たちのコード実行の為だけワークフローを割くこととなります。PySpark は簡単に利用することができ、pandas に非常に似ているとしても、2つは異なる言語なので、改めて学ぶ必要があることには変わりません。
Databricks では、以下の3つの理由から pandas を Spark で使えることはデータサイエンティストやデータドリブンな機関の生産性を高めると信じております。
■3つの理由
- pandas か PySpark のどちらをデータセットに対して使うかの選択が不要となる
- pandas で記述したコードも Spark に簡単にスケールアップできる
- PySpark を学ぶ必要が無いので、より多くの機関やデータサイエンティストがビッグデータに取り組める
カテゴリ変数を用いた機能エンジニアリング
データサイエンティストは、ML モデルを構築する際、カテゴリ変数によく出くわします。
その際によく使われるテクニックは、ダミー変数としてカテゴリ変数をエンコードすることです。
下記のデータフレームを例にすると、コールの方法・近隣情報・ユニットタイプといった複数のカテゴリ変数があります。
pandas の get_dummies メソッドは、データフレームにダミー変数としてカテゴリ変数をエンコードするのにとても便利です。
■pandas を使ったエンコード方法
1 2 3 |
import pandas as pd data = pd.read_csv("fire_department_calls_sf_clean.csv", header=0) display(pd.get_dummies(data)) |
Koalas を使えば、先程の pandas のコードを下記の様に微調整することで、 Spark 上でも同じことができるようになります。
■Koalas のコード
1 2 3 |
import databricks.koalas as ks data = ks.read_csv("fire_department_calls_sf_clean.csv", header=>0) display(ks.get_dummies(data)) |
タイムスタンプと計算
データサイエンティストはタイムスタンプに常に取り組む必要がありますが、これに常に関わるのはとても大変です。pandas を使った解決策を、下記の日付のデータフレームを例に紹介します。
■データフレーム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 で End_date から Start_date を引く場合は、下記のコマンドを実行すれば可能です。
■コード
1 2 3 |
df['diff_seconds'] = df['End_date'] - df['Start_date'] df['diff_seconds'] = df['diff_seconds']/np.timedelta64(1,'s') print(df) |
■pandas で End_date から Start_date を引いた結果
1 2 3 4 5 6 7 8 |
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 上でも同じことができます。
■Koalas のコード
1 2 3 4 5 |
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) |
下記に、Reynold Xin 氏が Spark + AI Summit で Koalas の公式アナウンス発表の動画のリンクを載せてますので、ぜひ御覧ください。
■Announcing Koalas Open Source Project | Reynold Xin (Databricks), Brooke Wenig (Databricks)
おわりに
翻訳まとめは以上となります。
Koalas をまだ試したことがない方は、この機会にぜひ利用してみてください。
Azure Databricksの導入ならナレコムにおまかせください。
導入から活用方法までサポートします。お気軽にご相談ください。
Azure Databricksソリューションページはこちら