Koalas: Easy Transition from pandas to Apache Spark 記事翻訳してみた

##はじめに
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](https://databricks.com/blog/2019/04/24/koalas-easy-transition-from-pandas-to-apache-spark.html)

■Koalas の公式アナウンス発表動画リンク
[Announcing Koalas Open Source Project | Reynold Xin (Databricks), Brooke Wenig (Databricks)](https://youtu.be/Shzb15DZ9Qg)


##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

```python

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

```python

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 を使ったエンコード方法

```python

import pandas as pd
data = pd.read_csv("fire_department_calls_sf_clean.csv", header=0)
display(pd.get_dummies(data))
```

- 変更前のデータフレーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/fab9abfc-3802-422c-4974-0ea32cb006c7.png)


- 変更後のデータフレーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/2ce4daaa-09db-eae5-4c79-4a12ef135034.png)


Koalas を使えば、先程の pandas のコードを下記の様に微調整することで、 Spark 上でも同じことができるようになります。

■Koalas のコード

```python

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


###タイムスタンプと計算
データサイエンティストはタイムスタンプに常に取り組む必要がありますが、これに常に関わるのはとても大変です。pandas を使った解決策を、下記の日付のデータフレームを例に紹介します。

■データフレーム

```python

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 を引く場合は、下記のコマンドを実行すれば可能です。

■コード

```python

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 を引いた結果

```python

  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 のコード

```python

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)](https://youtu.be/Shzb15DZ9Qg)


##おわりに
翻訳まとめは以上となります。
Koalas をまだ試したことがない方は、この機会にぜひ利用してみてください。