0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TypeError: int64 is not JSON serializable の原因と解決方法 (pyvis)

Posted at

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 型のデータ(おそらく pandasnumpy 由来)をシリアライズできないことです。

int64numpy の型であり、Python の標準の json モジュールでは対応していません。


🔧 解決策

✅ 方法 1: int64 を標準の int に変換

あなたの generate_network(G, ...) 関数内、または G にノード・エッジ情報を渡す前に、int64 型をすべて Python の int に変換する必要があります。

例えば、Gnetworkx のグラフなら:

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 + pandasnumpy を併用していると int64 が入り込みやすい

🔁 補足:再発防止

将来的にデータを扱う際、以下のようにあらかじめ astype(int) で明示的に型変換しておくと安全です:

df["weight"] = df["weight"].astype(int)

ご希望があれば、あなたの現在の generate_network 関数のコードを貼っていただければ、それをベースに修正提案も可能です。

user:

解決しました。ありがとうございます!今回の会話をブログに書き残したいので、タイトル案をいくつか考えてください。

assistant:

解決おめでとうございます!ブログに書き残すのはとても良いアイデアですね。以下に、今回の内容に適したタイトル案をいくつかご提案します。


🔧 技術的な問題解決を前面に出したタイトル

  1. 「TypeError: int64 is not JSON serializable」の原因と解決方法(pyvis × Streamlit)
  2. Pyvisで「int64はシリアライズできません」エラーが出たときの対処法
  3. Streamlit + pyvisで遭遇したint64エラーを徹底解説
  4. 【初心者向け】pyvisで発生するint64のJSONシリアライズ問題を解決するには?
  5. Jinja2とpyvisで発生した「TypeError: int64」エラーの原因と対処法

📘 読み物として親しみやすいタイトル

  1. pyvisでネットワーク可視化してたらエラー発生!int64問題との格闘記録
  2. Streamlitで可視化中に出た謎のエラー、「int64」が犯人だった件
  3. ネットワーク可視化中に沼った「int64はJSONにできない」問題の解決メモ
  4. 可視化ツールpyvisでTypeError!原因はnumpy.int64だった
  5. データ型の罠?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:

どういたしまして!無事に解決できて、そして記事にもまとめられるとのことで本当によかったです。今後も技術的な疑問やブログ執筆のサポートなど、何でもお手伝いしますので、いつでもお気軽にご相談ください。

こちらこそ、引き続きよろしくお願いいたします!💻📘✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?