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

# **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` のグラフなら：

```python
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` があるなら：

```python
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` 関数の中で変換

```python
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)` で明示的に型変換しておくと安全です：

```python
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」エラーの原因と対処法**

---

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

6. **pyvisでネットワーク可視化してたらエラー発生！int64問題との格闘記録**
7. **Streamlitで可視化中に出た謎のエラー、「int64」が犯人だった件**
8. **ネットワーク可視化中に沼った「int64はJSONにできない」問題の解決メモ**
9. **可視化ツールpyvisでTypeError！原因はnumpy.int64だった**
10. **データ型の罠？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()` に変換する必要があります。

```python
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**:

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

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