Salesforce データの Power BI 可視化を全て Python で行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/bb625cbf-cdf3-5a38-a262-8bb1ff2b163d.png)
#概要
SalesforceもPower BIも職人芸なところがあり、Pythonでデータ分析・予測を行う人からは手を出しにくい（あまり余計な技を覚えたくない）かと思いますが、蓋を開けてみるとPythonコードで全て料理できたので、記録しておきます。

#事前に
Power BI Desktopを使うのでWindowsです。
pyenv-winでversion管理していたらPower BI謎エラー沼にはまったので、MS StoreでPython 3.8を入れました。3.9だとcdataが入りません。
Power BI大人事情により、numpyもversion指定です。

```powershell
> pip install seaborn sqlalchemy numpy==1.19.3 
```

#SalesforceデータをDataframeで抜いてくる
SFDCプロジェクトでは、古来よりDataloaderを使ってcsvを落としたり、$sfdxしてきたかもしれませんが、もう不要です。数行のコードでDataframeが作れます。

```python
import cdata.salesforce as mod
import pandas as pd
from sqlalchemy import create_engine

engine = create_engine("salesforce:///?User=a@b.com;Password=xxx;SecurityToken=yyy;")
df = pd.read_sql("SELECT Column1, Column2 FROM Object1;", engine)
```
#####cdataの入れ方
☟こちらからwhlを落としてpipします。
https://www.cdata.com/jp/drivers/salesforce/python/

```powershell
> pip install ~/Downloads/CData.Python.Salesforce/win/Python38/cdata_salesforce_connector-20.0.7654-cp38-cp38-macosx_10_9_x86_64.whl 
```

#####SecurityToken 取り方☟（お借りします）
https://qiita.com/kuwazzy/items/68bc7c4a5b36721cfe83


#Salesforceコネクタをあえて使わないでデータ取得する
真っ当にコネクタを使うところを☟
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/e92d6988-aff9-026b-2707-1b16908cab7f.png" width=50%>
☟あえてスクリプトで取り込みます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/acc40e6b-0344-9b8b-6bf0-c40204fce7ba.png" width=50%>

☟先ほどのスクリプトを入れて、最後にdfを加えます。(公式docはprint(df)ですが、間違えたら通りました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/245cb595-cb77-5c79-eb58-397c3255f33b.png)

何かメリットがあるのかという話ですが、強いて挙げるなら

1. 必要なカラムだけとれる
2. 事前に加工できる
3. 設定変更をしないとコネクタが勝手にDatetimeを'月'カラム(String)等にしてしまうのを防げる
4. 事前に手元で分析したPythonファイルをそのままコピペできる

ことでしょうか。

#Python Visualを使う
☟VisualizationsからPyを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/9ae0caec-c407-39c3-6ac1-1fc2993bb8d4.png)
☟使うカラムをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/53d106c2-9442-6c51-6496-8d57aa1515df.png)
☟スクリプトエディタに☟☟のコードが現れるので加筆していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/eb84fa63-f544-9702-2489-2fad76a827e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/39a426b0-a5f3-dd7d-6c93-ea5a41941c72.png)

はじめからdatasetが用意されていて、最後にpyplot.show()をするとグラフが表示される仕様です。
エディタで開くボタンを押すとわかるのですが☟のコードが隠れています。

```Python
# Prolog - Auto Generated #
import os, uuid, matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot
import pandas

os.chdir(u'C:/Users/user/PythonEditorWrapper_e52c53d3-3ad9-4b06-9404-d671e336fb61')
dataset = pandas.read_csv('input_df_bc91c5f1-75c9-47a1-be02-0e0ad04c0b60.csv')

matplotlib.pyplot.figure(figsize=(5.55555555555556,4.16666666666667), dpi=72)
matplotlib.pyplot.show = lambda args=None,kw=None: matplotlib.pyplot.savefig(str(uuid.uuid1()))
# Original Script. Please update your script content here and once completed copy below section back to the original editing window #
# データフレームを作成して重複行を削除する次のコードは、常に実行され、スクリプトのプリアンブルとして機能します。 

# dataset = pandas.DataFrame(Column1, Column2)
# dataset = dataset.drop_duplicates()

# スクリプトのコードをここに貼り付けるか入力します。
## ほげほげほげほげ

# Epilog - Auto Generated #
os.chdir(u'C:/Users/user/PythonEditorWrapper_e52c53d3-3ad9-4b06-9404-d671e336fb61')
```

##ダミーdfを作ってグラフを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142638/d1395c67-0bd1-b092-9ee5-434348fe1a73.png)
pdとpltは書きやすさのためにimportしています。
df = dataset等、前処理文を用意しておけば、手元のPythonコードをそのまま使えて大変便利です。

#TIPS
###日本語化（豆腐対策）
```Python
import matplotlib.font_manager as fm
from matplotlib import rcParams
fm.findSystemFonts()
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 'IPAexGothic', 'IPAPGothic', 'Noto Sans CJK JP']
```
###見た目
数値やラベルのサイズをPower BI用に調整しなければならないようで、ここでどうしても職人芸が必要とされてしまいますが、pyplot力の高い人にはハードルが低いと思います。

###機械学習
scikit-learnやxgboostが使えるようなので、予測結果も併せて出力できそうですね。（まだ試し中）
https://docs.microsoft.com/en-us/power-bi/connect-data/service-python-packages-support