AOKI's copy&paste archive

高専から駅弁大学から東工大を経て大企業へ 浅く広い趣味とかキャリアの日記を

Anacondaバグ

バグってドツボにハマると抜けられないよね、という話。

仕事でモノの流れを把握するにあたり、サンキーダイアグラムを書きたくなった。
しかしこの図、出力は優れているものの、作るのが何のツールを使うにしてもややこしくてそこそこ難しい。
今回はやっぱりPythonを使った。近々Tableauも簡単に作れるようになるらしい。

Python で生成するサンキーダイアグラム

とはいえ、先駆者やChatGPTで大枠の回答は貰えるので、苦労はしないだろう。
と、たかをくくっていたら、冒頭書いた通りドツボにハマった。

結論を簡単に示してしまうと、Anacondaの環境次第の問題っぽかった。
バグの起こるポイントが色々あるので難しいし、環境すべてをAIが理解できるわけでもないので、ここはプログラマーの経験、スキルが依然重要であることを再認識させられた。

具体、どうすればよかったかというと、Anacondaの中でもSpyderとJupyterで環境依存性的なものが異なるようで、その問題っぽかった。
本質的に解決はさせずに放置して逃げているのだが、もう一方のツールで作業自体は完了できたというのが総括だ。

Pythonでのサンキーダイアグラムの書き方は主要なものでもいくつかあるが、上記で示したもので行こうとしていた。
Matplotは馴染みあるモジュールで安心感や信頼性があるものの、これに限ってはデザインがイマイチすぎた。
まあ図を極めようとするとSeabornとか色々あるからね。。

そこで割りと一般的なplotlyとholoviewsのモジュールのインポートが必要となった。
conda installでそれぞれを導入した。

さて準備完了であとは読み込みデータを自分用にアレンジして、Jupyterでランさせるとなぜかモジュールがインストールされないと出る。
通常、バグが出たらそのまま検索かChatGPTに貼り付ければ解決策が提示される。

しかしお分かりの通り、直前にインストールは完了したばかりで、普遍的な回答は解決策になり得ない。
ChatGPTでもその堂々巡りを無駄に何度か繰り返した。
一応、カーネルの再接続やソフトの再起動なんかも含めて、かなりやりつくしても解決せず。。

仕方がないのでダメ元でSpyderに環境を移すと、普通に実行できてしまい拍子抜け。
とはいえ、インタラクティブのビューの設定とは相容れないので、そこはちょっと調整して晴れて図を出力できた。

import holoviews as hv

# カスタムのカラーマップを定義します
name_color_map = {
    'StartNode': '#FF0000',  # 開始ノードの色は赤
    'EndNode': '#FF0000',    # 終了ノードの色も赤(同じ色を指定)
    'Node1': '#808080',      # 他のノードの色を定義する
    'Node2': '#800080',
    # 他のノードと色のマッピングを追加する
}

# Sankeyダイアグラムのデータを作成します
data = {
    'source': ['StartNode', 'StartNode', 'Node1', 'Node2'],
    'target': ['Node1', 'Node2', 'EndNode', 'EndNode'],
    'value': [10, 5, 8, 6]
}

# DataFrameに変換します
df = pd.DataFrame(data)

# カスタムのカラーマップを使用してノードの色を設定します
node_color = df['source'].map(name_color_map)

# Sankeyダイアグラムを作成します
sankey = hv.Sankey(df, ['source', 'target'], 'value')

# ノードの色を設定します
sankey.opts(node_color=node_color)

# ダイアグラムを表示します
# hv.renderer('matplotlib').save(sankey, 'sankey.png')

# もしくはHTMLファイルとして保存する場合
hv.save(sankey, 'sankey.html')

# もしくはノートブック上で表示する場合
# sankey

ちなみにChatGPTの提案からexport_pngで画像出力としたかったがこれがSpyderでもできず、仕方なくhtmlで出力した。
しかし意外にもマウスオーバーで色々出たりとこれはこれでスゴイ。棚ぼた的な。

あとノードの色はカクカクシカジカ手動設定できたのだが、上下流のセグメントが指定できず微妙に困っております。

蛇足的だがどうもConda InstallとJupyterへの反映設定の間に別設定的なものがありそうであることはなんとなく察した。
学生まではSpyder、社会人になってからは社内やYouTuberのデータサイエンティストの真似をしてJupyterに移行していた。
確かに全体を実行しなくてもいい利便性は最近享受していた。
だからこそJupyterに固執しすぎてドツボにハマったとも言える。
結局、Spyterの方が性に合ってそうかなと考え直すに至っている。

さらにさらにいずれもGitHub Copilotが使えないものと認識している。
これは今後、必須であるから、その導入も見据えて、NodeJSなどにIDEに移行するにはいい機会なのかもしれないとも思っている。

SQLもWebアプリケーション上でやっていて、最低限の補完は出るものの、インデントの調整などは弱いので、可能であればここ含めて直したい。
個人的にSQLは面倒なので、予約語も変数名も小文字、インデントはあまりつけない人外しています。
こういう面倒というか細かいのは、やっぱ機械に任せたいよね~。

python-graph-gallery.com