SQLのAS句を、pandas(python)をrenameメソッドを使って表現して見た

#はじめに
　最近、プライベートでデータ分析のツールを作成している関係でpandasというpython外部ライブラリを活用している。が、いざ使って見ると、「pandas?なにそれかわいいの？」と動物のパンダ🐼を連想させるヤバい思考に行きつつある状況になる。
　これはまずいと感じ、投稿者はpandasを探し求める旅に出る。
　この記事は、pandasを飼いならすために<b>pandasをSQLっぽく考えるというデータサイエンス初学者に向けた記事となります。</b>

#そもそもpandasとは何か
　pandasとは、構造化された（表形式、多次元、潜在的に不均質）データと時系列データを簡単かつ直感的に操作できるように設計された高速で柔軟な表現力のあるデータ構造を提供するPythonパッケージで、実際的な実世界のデータ分析を行うための基本的な高レベルのビルドを行う事が可能なツールです。
　<b>要は、表データをpythonを使っていい感じに処理して目的のデータ抽出するツールです。</b>

#実践
###準備
今回は下記の表データ【receipt】を用いてpandas攻略を行います。（表データはCSV形式）

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/8ab25deb-8863-9255-b0f5-5c0b627e8128.png)
※データは長いので冒頭部分のみ表示

参考データ：データサイエンス100本ノック
https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

また、今回はpandasを使用するため、コードは下記のように予め準備しておきます。

```python:python
import pandas as pd
df_receipt = pd.read_csv('receiptのCSVファイルのパス', sep=',')
```

###本題
タイトルにある通り、今回は<b>SQLのAS句を</b>pandasを使って再現します
<br>
問題：<b>レシート明細のデータフレーム（df_receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、10件表示させよ。ただし、sales_ymdはsales_dateに項目名を変更しながら抽出すること。</b>
<br>

目的：<b>表の特定の列の列別名を出力する事</b>

###解答

解答を記述するとこんな感じになります。

```python:pandas(python)
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].rename(columns={'sales_ymd': 'sales_date'}).head(10)
```

そして、図に表すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/733d6a69-9a13-cf2d-756c-8a85486c37e2.png)


これをSQL文で表すとこんな感じになります。

```SQL:SQL
SELECT sales_ymd AS sales_date,customer_id,product_cd,amount FROM receipt LIMIT 10;
```

###解説
それでは、ここから解説していきます。

* SQLのAS句を、pandasのrenameメソッドを用いて表現する<br>
まず、pandasの二重リストを活用し、表全体から対象の列名を選択します。

※補足：pandasの二重リストに関する記事は下記を参考にしてみて下さい。
https://qiita.com/syuki-read/items/9fcb06ff56b868167f85


```python:pandas(python)
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].head(10)
```

これをSQLで考えると、こんな感じになります。

```SQL:SQL
SELECT sales_ymd,customer_id,product_cd,amount FROM receipt LIMIT 10;
```

FROM句：データベース内の指定する表を選択する
SELECT文：指定した表から抽出すべき列を選択する
LIMIT句：抽出する行数を指定する

図に現すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/c984d5a5-29f0-8856-baba-d8bd8f66ecd7.png)

そしてここから、pandasのrenameメソッドを用いて、（SQLのAS句のように）対象の列名（sales_ymd）を指定の列別名（sales_date）に変換を行います。
書き方は、rename(columns={'変換前の列名': '変換後の列名'})と表現します。

実際に書いてみるとこんな感じになります。

```python:pandas(python)
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].rename(columns={'sales_ymd': 'sales_date'}).head(10)
```
これをSQLで考えるとこんな感じになります。

```SQL:SQL
SELECT sales_ymd AS sales_date,customer_id,product_cd,amount FROM receipt LIMIT 10;
```

そして、図を表すとこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/0dbdc022-9a95-20a1-ef3b-4d8551f461ed.png)


* 全体図<br>
全体をまとめると、こんな感じになります。

![3-1new2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681742/e207322e-fb75-51d6-d775-999097666857.png)



###別解
```python:pandas(python)
df_receipt.rename(columns={"sales_date": "sales_ymd"}, inplace=True)
df_receipt[['sales_ymd','customer_id','product_cd','amount']].head(10)
```

こちらの場合ですと、先に対象列を指定の列別名に指定し、その後対象の列の選択を行っております。

#まとめ
pandasを使って、SQLのAS句の表現を行いました。pandasはデータベース及びSQLを意識したpythonライブラリなため、普段からSQLを意識するとかなり使いやすいツールだと改めて感じます。また、特定の命令文を指示する時、SQLがいくつものパターンがあるように、pandasにも多様なパターンが存在すると、pandasを活用して日々実感を持ちます。

#終わりに
　今回、利活用したデータはデータサイエンス協会（DS協会）の「データサイエンス100本ノック」を参考にしております。こちらはJupyter notebookを使用しているので、より見やすいデータが抽出されます。
　この記事を読んで、「実際に実装してみたい！！」という方がおりましたら、下記にその実装に関する記事を上げているので、良かったそちらの記事を参考に是非実装してみて下さい。

データサイエンス初学者にむけた、データサイエンス100本ノックを実装する方法：
https://qiita.com/syuki-read/items/714fe66bf5c16b8a7407