cesiumをwindows環境で使う方法

kaggleのPLASTICC competitionで見てた<a href="https://www.kaggle.com/mithrillion/strategies-for-flux-time-series-preprocessing">kernel</a>で<a href="http://cesium-ml.org/docs/auto_examples/index.html">cesium</a>という時系列データを扱うpackageを使っていたんですが、これがpip install cesiumでは入ってくれませんでした。どうやらcesiumパッケージはコンパイルしながらインストールするようなんですが、windows環境ではC++コンパイラが見つからなくてエラー停止してしまうようです。その後、Ubuntu18.04環境でpip installしたところすんなり入ってくれましたが、自宅のwindows環境でもやりたかったのでエラーコードでググったところMinGW64を入れれば良いようなのでその通りにやった内容をメモしておきます。

参考: エラーへの対処方法 (英語)
https://github.com/cesium-ml/cesium/issues/275#issuecomment-429055148

エラーコード

```
Failed building wheel for cesium
Running setup.py clean for cesium
Failed to build cesium
Installing collected packages: cesium
Running setup.py install for cesium ... error
```

#### やったこと
1. MinGW64をインストールする
- MinGW64にPATHを通す
- distutils.cfgを作ってcompilerを指定する
- pip install cesiumでインストール

#### 試した環境
windows10 64bit
cpu: Ryzen7 1700X
gpu: GTX1080Ti
Anaconda 5.1
python 3.6


#### 実行手順
##### 1. MinGW64をインストールする

sourceforgeからダウンロードします
https://sourceforge.net/projects/mingw-w64/

mingw-w64-install.exeが落ちてくる筈なので、これをダブルクリックで実行してインストーラーを起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/f9a66099-c254-4438-e640-b65f244609fd.png)
僕の環境では以下の条件で上手くいきました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/0081bd09-0359-06b6-d9dd-11b1da75e2de.png)
僕の環境ではインストール先はデフォルトで大丈夫でした。あとでPATHを通す必要があるので、インストール先を指定する場合はどこに入れたか覚えておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/89b4b9c4-26ce-3aea-bde5-88ef9d40d9f1.png)

##### 2. MinGW64にPATHを通す
まだMinGWにPATHが通ってないので使えません。環境変数のPATHにMinGWのインストール先のbinフォルダを追加します。バージョン8.1.0を上記の条件でインストールした場合は以下のフォルダにインストールされていると思います。

```
C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/ceac0136-6eca-2e1e-aee8-61e67a97dd1f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/04f70cf0-0abf-f001-4bc4-65ea4b75d52c.png)

PATHが通るとコマンドプロンプトからgccが呼べるようになるはずです。

```
 C:\>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=C:/Program\ Files/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-8.1.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/mingw810/x86_64-810-win32-seh-rt_v6-rev0/mingw64 --enable-shared --enable-static --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/mingw810/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-seh-rev0, Built by MinGW-W64 project' --with-bugurl=https://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-win32-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -fno-ident -I/c/mingw810/x86_64-810-win32-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' CPPFLAGS=' -I/c/mingw810/x86_64-810-win32-seh-rt_v6-rev0/mingw64/opt/include -I/c/mingw810/prerequisites/x86_64-zlib-static/include -I/c/mingw810/prerequisites/x86_64-w64-mingw32-static/include' LDFLAGS='-pipe -fno-ident -L/c/mingw810/x86_64-810-win32-seh-rt_v6-rev0/mingw64/opt/lib -L/c/mingw810/prerequisites/x86_64-zlib-static/lib -L/c/mingw810/prerequisites/x86_64-w64-mingw32-static/lib '
Thread model: win32
gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)
```

##### 3. distutils.cfgを作ってcompilerを指定する
次にpythonがcompilerとしてMinGW64を使うように、使用するpython環境のLib/distutils/distutils.cfgファイルに以下の4行を書き込みます。

```
[build]
compiler=mingw32

[build_ext]
compiler=mingw32
```

標準だとこのファイルは存在しないようなので、txtファイルを作って名前を書き換えましょう。Anacondaでtfという名前の環境を使っている場合は以下のフォルダにdistutils.cfgを置けばOKです。

```
Anaconda3/envs/tf/Lib/distutils/
```

##### 4. pip install cesiumでインストール
最後にpip installして完了です。PATHが通ってれば正常にインストールされました。

```
c:\> conda activate tf
(tf) c:\> pip install cesium
Collecting cesium
Successfully installed cesium-0.9.7 cloudpickle-0.6.1 dask-0.20.2 gatspy-0.3 numpy-1.15.4 pandas-0.23.4 python-dateutil-2.7.5 pytz-2018.7 scikit-learn-0.20.0 scipy-1.1.0 six-1.11.0 toolz-0.9.0
```
できたかな？

```
(tf) C:\>python
import cesium
```
無事インポートできたのでどうやらインストールできたみたいです。ちなみに、使い方は最初に書いたkernelを見れば分かります。

便利！