user:
次のエラーの解決法を教えてください。
Traceback (most recent call last):
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/streamlit/runtime/scriptrunner/exec_code.py", line 121, in exec_func_with_error_handling
result = func()
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 639, in code_to_exec
_mpa_v1(self._main_script_path)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 159, in _mpa_v1
page.run()
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/streamlit/navigation/page.py", line 297, in run
exec(code, module.__dict__)
File "/Users/ikemen/streamlit-app/pages/test.py", line 658, in <module>
generate_network(G, "lingam_network.html", edge_weight=True)
File "/Users/ikemen/streamlit-app/pages/test.py", line 395, in generate_network
net.save_graph(path)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/pyvis/network.py", line 438, in save_graph
self.write_html(name)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/pyvis/network.py", line 515, in write_html
self.html = self.generate_html(notebook=notebook)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/pyvis/network.py", line 479, in generate_html
self.html = template.render(height=height,
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/jinja2/environment.py", line 1295, in render
self.environment.handle_exception()
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/jinja2/environment.py", line 942, in handle_exception
raise rewrite_traceback_stack(source=source)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/pyvis/templates/template.html", line 435, in top-level template code
edges = new vis.DataSet({{edges|tojson}});
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/jinja2/filters.py", line 1721, in do_tojson
return htmlsafe_json_dumps(value, dumps=dumps, **kwargs)
File "/Users/ikemen/streamlit-app/venv/lib/python3.10/site-packages/jinja2/utils.py", line 669, in htmlsafe_json_dumps
dumps(obj, **kwargs)
File "/Users/ikemen/.pyenv/versions/3.10.0/lib/python3.10/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/Users/ikemen/.pyenv/versions/3.10.0/lib/python3.10/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Users/ikemen/.pyenv/versions/3.10.0/lib/python3.10/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/Users/ikemen/.pyenv/versions/3.10.0/lib/python3.10/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type int64 is not JSON serializable
assistant:
このエラーの原因は、pyvis
ライブラリが network.py
内で json.dumps()
を通じてエッジやノード情報を HTML に変換しようとしているときに、int64
型のデータ(おそらく pandas
や numpy
由来)をシリアライズできないことです。
int64
は numpy
の型であり、Python の標準の json
モジュールでは対応していません。
🔧 解決策
✅ 方法 1: int64
を標準の int
に変換
あなたの generate_network(G, ...)
関数内、または G
にノード・エッジ情報を渡す前に、int64
型をすべて Python の int
に変換する必要があります。
例えば、G
が networkx
のグラフなら:
import numpy as np
for u, v, d in G.edges(data=True):
for key in d:
if isinstance(d[key], np.integer):
d[key] = int(d[key])
ノード属性にも int64
があるなら:
for n, d in G.nodes(data=True):
for key in d:
if isinstance(d[key], np.integer):
d[key] = int(d[key])
✅ 方法 2: generate_network
関数の中で変換
import numpy as np
def generate_network(G, path, edge_weight=True):
from pyvis.network import Network
net = Network(notebook=False)
# ノードとエッジを追加する前に属性を修正
for node, data in G.nodes(data=True):
clean_data = {k: int(v) if isinstance(v, np.integer) else v for k, v in data.items()}
net.add_node(node, **clean_data)
for source, target, data in G.edges(data=True):
clean_data = {k: int(v) if isinstance(v, np.integer) else v for k, v in data.items()}
net.add_edge(source, target, **clean_data)
net.save_graph(path)
✅ 根本的なポイント
- Python の
json.dumps()
はnumpy.int64
などを扱えない -
pyvis
は内部的にjson.dumps()
を用いて HTML を生成している -
networkx
+pandas
やnumpy
を併用しているとint64
が入り込みやすい
🔁 補足:再発防止
将来的にデータを扱う際、以下のようにあらかじめ astype(int)
で明示的に型変換しておくと安全です:
df["weight"] = df["weight"].astype(int)
ご希望があれば、あなたの現在の generate_network
関数のコードを貼っていただければ、それをベースに修正提案も可能です。
user:
解決しました。ありがとうございます!今回の会話をブログに書き残したいので、タイトル案をいくつか考えてください。
assistant:
解決おめでとうございます!ブログに書き残すのはとても良いアイデアですね。以下に、今回の内容に適したタイトル案をいくつかご提案します。
🔧 技術的な問題解決を前面に出したタイトル
- 「TypeError: int64 is not JSON serializable」の原因と解決方法(pyvis × Streamlit)
- Pyvisで「int64はシリアライズできません」エラーが出たときの対処法
- Streamlit + pyvisで遭遇したint64エラーを徹底解説
- 【初心者向け】pyvisで発生するint64のJSONシリアライズ問題を解決するには?
- Jinja2とpyvisで発生した「TypeError: int64」エラーの原因と対処法
📘 読み物として親しみやすいタイトル
- pyvisでネットワーク可視化してたらエラー発生!int64問題との格闘記録
- Streamlitで可視化中に出た謎のエラー、「int64」が犯人だった件
- ネットワーク可視化中に沼った「int64はJSONにできない」問題の解決メモ
- 可視化ツールpyvisでTypeError!原因はnumpy.int64だった
- データ型の罠?pyvis × Jinja2 × JSONの落とし穴とその回避法
使いたいトーン(カジュアル/技術書風など)や対象読者に合わせて選んでいただければと思います。もし記事の導入文も必要でしたら、あわせてお手伝いします!
user:
「TypeError: int64 is not JSON serializable の原因と解決方法 (pyvis)」にしようと思います。最後に、今回のまとめを詳しく書いてください。
assistant:
了解しました!以下に「TypeError: int64 is not JSON serializable の原因と解決方法 (pyvis)」というタイトルに合った詳しいまとめをご用意しました。ブログ記事の締めや、「まとめ」セクションとしてそのまま使える構成になっています。
📝 まとめ:「TypeError: int64 is not JSON serializable の原因と解決方法 (pyvis)」
今回遭遇したエラー:
TypeError: Object of type int64 is not JSON serializable
は、Python の json
モジュールが numpy.int64
型のデータをそのままでは処理できないことに起因するものでした。特に、pyvis
ライブラリが内部で Jinja2
を用いて HTML を生成する際に、ノードやエッジの属性に int64
型が含まれていると、json.dumps()
によって変換できずにこのエラーが発生します。
🔍 エラーの発生ポイント(概要)
-
pyvis.Network.save_graph()
→write_html()
→generate_html()
→template.render(...)
-
template.html
内でedges = new vis.DataSet({{edges|tojson}});
を生成する過程で失敗 - 原因:ネットワークデータの属性に
numpy.int64
型が含まれていた
✅ 解決策
1. 属性値の型変換:numpy.int64
→ Python標準の int
ネットワークのノードやエッジの属性に numpy
の整数(int64
など)が使われている場合、それを明示的に int()
に変換する必要があります。
import numpy as np
for u, v, d in G.edges(data=True):
for key in d:
if isinstance(d[key], np.integer):
d[key] = int(d[key])
for n, d in G.nodes(data=True):
for key in d:
if isinstance(d[key], np.integer):
d[key] = int(d[key])
2. generate_network
関数内で属性の前処理を行う
属性を追加する際に、辞書の中身を都度チェックして int()
で包むようにしておけば、再利用性も高くなります。
💡 再発防止のポイント
- データフレームや NumPy を経由した数値データは、明示的に
int
に変換する癖をつける -
astype(int)
やint(x)
を適宜使う - JSON を介して HTML や外部サービスにデータを渡す際は、型の確認が重要
📌 教訓
Pythonでは見た目が「整数」でも、内部的に numpy.int64
などが使われていることがあります。特に可視化系ライブラリ(pyvis
, plotly
, bokeh
など)では、出力を HTML や JSON に変換するため、型の互換性が重要になります。
「TypeError: int64 is not JSON serializable」 はその典型的な落とし穴でした。
このまとめが、同じエラーで困っている人の助けになれば幸いです!
必要であれば、この記事に合う導入文やコード全体のサンプルもご提供できますので、お気軽にどうぞ。
user:
ありがとうございます。これで大丈夫です。今後もよろしくお願いします!
assistant:
どういたしまして!無事に解決できて、そして記事にもまとめられるとのことで本当によかったです。今後も技術的な疑問やブログ執筆のサポートなど、何でもお手伝いしますので、いつでもお気軽にご相談ください。
こちらこそ、引き続きよろしくお願いいたします!💻📘✨