Google Colaboratoryでnysol_pythonをインストールして使ってみる。

nysol_pythonの知名度は低いですが、実はかなりデータの加工や集計などの処理に便利なのでnysol_pythonについて、具体的な利用方法などを紹介します。

# nysol_pythonの特徴
nysol_pythonは、データ解析のためのオープンソースのPythonライブラリで、pandasと同様にデータの加工や集計を得意とします。そして、表形式（CSVファイル）のデータやリストを対象に簡単に高速に動作します。pandasはSeriesとDataFrameなどの型を意識する必要がありますが、nysol_pythonでは、型を意識する必要はなく、上から下にメソッドをつなげていくことで処理ができるのが特徴です。

もともとnysolはコマンドとして提供されていましたが （https://www.nysol.jp) 、2018年にPythonライブラリが公開され、Pythonでnysolコマンドと同じ機能が利用できるようになりました。

## この記事の対象読者
+ nysol_pythonは知らんという方
+ ExcelやAccessを卒業したい方
+ 手軽にビッグデータを処理したい方
+ pandasで処理するのが厳しいデータ量を扱っている方 

## この記事でわかること
1. nysol_pythonのGoogle Colabへの導入方法
1. nysol_pythonの入出力
1. nysol_pythonの処理手順

## 実行環境
Pythonの実行環境が構築されている[Goolge Colaboratory] (https://colab.research.google.com/notebooks/intro.ipynb#recent=true) (以下、Colab）でnysol_pythonを利用します。

# nysol_pythonの導入方法
nysol_pythonの[github](https://github.com/nysol/nysol_python/wiki)によると、以下の導入が必要とのこと。
c++ compiler
boost C++ library
lib2xml Library

各OSでインストール方法は異なるので、**Colab**を利用します。
Colabでファイルを新規作成し、最初のセルに以下のコードを入力し実行しましょう。
<del>コーヒーでも飲んで10分ほど待ちましょう。</del>
<font color="OrangeRed">nysol_pythonの開発者の方にバイナリーパッケージを作成してもらいましたので、数秒でインストールできるようになりました。2021/07/18</font>

```
!pip install nysol
```
この方法でインストールしたパッケージは、Colabの**仮想マシンがリセットされると消える**ので、パッケージを**Google Driveにインストール**したい場合は次の方法を実施します。必要なければ[nysol_pythonの利用](#nysol_pythonの利用)まで読み飛ばしてください。


### Google Driveへのインストール方法
次の方法は、[Google Colabでpip installしたものを消えないようにする] (https://qiita.com/Koshka/items/d42d47685b592816054d) を参考にしました。

#### 1.  Google Driveにパッケージ保存用のディレクトリを作成
例として、Google Driveの**Colab Notebooks**内に、**MyPackage**という名前で作成しました。

#### 2. Google Driveのマウント
以下のコードをColabで実行し、Google Drive をマウントします。

```
from google.colab import drive
drive.mount('/content/gdrive')
```

#### 3. パスの設定。
パッケージの保存先をGoogle Driveにするためにパスを作成

```
pkPathSys = '/content/gdrive/MyDrive/Colab\ Notebooks/MyPackage'
```

#### 4. nysol_pythonのインストール
nysol_pythonをGoogle Driveのパスを指定してインストール。

```
# -t $pkPathでインストール先のパスを指定
!pip install nysol -t $pkPathSys

# githubのソースからインストールしたい場合は以下を実行
# !pip install git+https://github.com/nysol/nysol_python.git -t $pkPathSys

``` 

#### 5. system pathを通す
Google Driveにインストールされたnysol_pythonを利用するためにシステムパスを設定します。

```
import sys
pkPath = '/content/gdrive/MyDrive/Colab Notebooks/MyPackage'
sys.path.append(pkPath)
```

### 次回以降の準備
Google Driveにインストールしたパッケージを利用するために、次回以降（仮想マシンがリセットされた場合）にGoogle Driveのマウントと、パス設定が必要になります。次回以降は以下のコードを実行します。

```
# Google Driveマウント
from google.colab import drive
drive.mount('/content/gdrive')

# システムパスを通す
import sys
pkPath = '/content/gdrive/MyDrive/Colab Notebooks/MyPackage'
sys.path.append(pkPath)
```

# nysol_pythonの利用
無事にインストールできていれば、以下のimport文でnysolパッケージがインポートできます。
エラーがでなければOKです。

```
import nysol.mcmd as nm

import os
# エラーメッセージを表示するための環境変数をセット
os.environ['KG_UsingPySysMsg']='1
```
#### 1. 利用データの準備
データのダウンロード
nysol_pythonのドキュメントで示されている焼き肉データである[yakiniku_jp.csv](https://www.nysol.jp/nysol_python/_downloads/610138a8b5d1260d3bc540f9d4e20d60/yakiniku_j
p.csv)をダウンロードします。次のコマンドをColabで実行すると、Colabのセッションストレージに保存されます。セッションが切断されるとストレージも削除されるため、その場合は再度ダウンロードが必要です。

```
# Colabから実行
!wget https://www.nysol.jp/nysol_python/_downloads/610138a8b5d1260d3bc540f9d4e20d60/yakiniku_j
p.csv
```

<!-- 
Google Driveに保存します。例として、Colab Notebooks内にdataディレクトリを作成し、そこに保存しました。
-->

焼き肉データはCSVファイルで、その項目名は以下のようになります。これは、[nysol_pythonのデータセット](https://www.nysol.jp/nysol_python/dataset/yakiniku.html)を参考にしました。

| 項目名       |型          | 内容 |
|:-----------|:------------|:------------|
| date        |	文字列     |	注文日付でyyyymmddの8桁固定長。470営業日。 |
| time        |	文字列     |	注文時刻でhhmmssの6桁固定長。同じレシートの中で異なる時刻あり。 |
| receipt     | 文字列      |	レシート番号で、同じ番号であれば同じテーブルでの注文。96789枚。 |
| itemID      | 文字列      |	商品を唯一識別するID。 793種。 |
| item        |	文字列     |	商品名 |
| price       |	整数       |	単価 |
| quantity    |	整数       |	注文数量 |

#### 2. nysol_pythonの入出力
nysol_pythonでは入出力をi=とo=で指定できます。

##### CSV形式の入出力
CSV形式のファイルを読み込み、CSV形式でファイル出力します。そして、焼き肉データの中身を表示してみましょう。
入力をファイル指定する場合は、i="filename.csv" のように、ファイル名を文字列で与えます。また、出力ファイルも同様です。mread メソッドは、i=で指定された内容をそのまま出力するメソッドで、run()メソッドによって実行されます。

```
# 焼き肉データを読み込み、out1.csvに出力
nm.mread(i="yakiniku_jp.csv",o="out1.csv").run()
# pメソッドでファイルを表形式に整形して表示
nm.p('out1.csv')
```

![out1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1761404/65a4f857-7f98-5c83-6972-af9aa3c9c909.png "out1.csvの表示")

##### CSV形式の入力、リスト出力
o=を指定せずに実行すると、2次元リストが出力されます。run()メソッドによって実行されたmreadの処理結果が２次元リストとして返ってくるため、それをsに代入しています。print文では先頭から5行を出力しています。

```
# 入力をCSVファイル、出力をリスト（o=の指定なし）
s=nm.mread(i="yakiniku_jp.csv").run()
print(s[0:5])

# 出力 5行のみ表示
[['20070701', '115200', '5589', '107', '和牛焼肉弁当', '1240', '1'],
 ['20070701', '122800', '5594', '102', '冷麺定食', '1130', '2'],
 ['20070701', '120800', '5595', '105', 'オリジナル３品盛り合わせ', '880', '1'],
 ['20070701', '120800', '5595', '107', '和牛焼肉弁当', '1240', '1'],
 ['20070701', '122600', '5596', '107', '和牛焼肉弁当', '1240', '1'],
```

#### 3. 複数のメソッドを実行する
次に、焼き肉データを利用し、売上金額の合計を計算してみましょう。
まず、yakiniku_jp.csvからmcutメソッドでpriceを抜き出し、msumメソッドでpriceを合計します。
この処理フローオブジェクトがsに代入され、s.run()で処理フローオブジェクトが実行されます。
そして、その結果は2次元リストでsalesに代入されます。

```
# 売上金額の合計を計算してみましょう。
s=nm.mcut(f="price",i="yakiniku_jp.csv").msum(f="price")
sales=s.run()
print(sales)

# 売上金額の合計
# [['91772640']]
```

#### 処理フローオブジェクトに処理メソッドをそれぞれ追加して実行
複数の処理メソッドを処理フローオブジェクトに順次追加して実行する方法を示します。
**上から下に順番に処理メソッドを記述する直感的な書き方です。**
1行目でmcutメソッドが処理フローオブジェクトとしてsに代入されます。
次に、<<=演算子を利用することで、msumメソッドを処理フローオブジェクトsに順次追加します。
そして、s.run()で実行します。
処理メソッドが増えても同様に<<=演算子を利用して追加できます。

```
# 処理フローオブジェクトに追加
s=nm.mcut(f="price",i="yakiniku_jp.csv")
s<<=nm.msum(f="price")
sales=s.run()
```

# まとめ
この記事では、Google Colabを利用してnysol_pythonのインストールとその実行方法を示しました。
nysol_pyhonの処理メソッドは80種類ほどあり、それらを処理フローオブジェクトに代入しながら処理が実行できます。
特に、型を意識する必要はなく、それぞれのメソッドを組み合わせていくことで柔軟な処理ができることが特徴です。
引き続きGoogle Colabでnysol_pythonの利用方法を紹介していきます。