numpyで`inf - inf`が計算されると、"invalid value encountered in AAA"というメッセージを持つ`RuntimeWarning`が発生する

# 環境
* Python 3.12.1
* numpy 1.26.4
* pandas 2.2.2


# 背景
`inf - inf`の結果は`nan`です。

```
In [30]: np.inf - np.inf
Out[30]: nan
```

numpyの関数内で`inf-inf`が計算されると、`RuntimeWarning`が発生します。`RuntimeWarning`のメッセージは`invalid value encountered in reduce`のようなメッセージです。どの関数（このメッセージでは`reduce`関数）で"invalid value"に遭遇したかが記載されます。しかし、記載されている関数はnumpyの内部の関数です。警告メッセージには、実際にどのAPIで発生したかが記載されていません。

そこで、numpyで私がよく利用するAPIにおいて、`inf - inf`が計算されたときに`RuntimeWarning`はどのようなメッセージになるかを、実際に試して確認しました。

また、pandasはnumpyのAPIを利用しているため、pandasを利用したときにも、`invalid value encountered in reduce`という`RuntimeWarning`は発生します。pandasでも、どのようなメッセージになるかを確認しました。



# 結果
## numpy
### `np.sum`

```
In [32]: np.sum([np.inf, -np.inf])
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/core/fromnumeric.py:88: RuntimeWarning: invalid value encountered in reduce
  return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
Out[32]: nan
```

### `np.mean`

```
In [33]: np.mean([np.inf, -np.inf])
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/core/_methods.py:118: RuntimeWarning: invalid value encountered in reduce
  ret = umr_sum(arr, axis, dtype, out, keepdims, where=where)
Out[33]: nan
```

### `np.std`

```
In [80]: np.std([np.inf])
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/core/_methods.py:173: RuntimeWarning: invalid value encountered in subtract
  x = asanyarray(arr - arrmean)
Out[80]: nan
```

###  `np.quantile`

```
In [48]: np.quantile([np.inf], 0.5)
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4655: RuntimeWarning: invalid value encountered in subtract
  diff_b_a = subtract(b, a)
Out[48]: nan

In [49]: np.quantile([np.inf,1], 0.5)
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4658: RuntimeWarning: invalid value encountered in subtract
  subtract(b, diff_b_a * (1 - t), out=lerp_interpolation, where=t >= 0.5,
Out[49]: nan

In [50]: np.quantile([np.inf,1,2], 0.5)
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4657: RuntimeWarning: invalid value encountered in multiply
  lerp_interpolation = asanyarray(add(a, diff_b_a * t, out=out))
Out[50]: nan

In [51]: np.quantile([np.inf,1,2,3], 0.5)
Out[51]: 2.5
```

### `np.array`による引き算

```
In [44]: np.array(np.inf) - np.array(np.inf)
<ipython-input-44-c7e173d9e363>:1: RuntimeWarning: invalid value encountered in subtract
  np.array(np.inf) - np.array(np.inf)
Out[44]: nan
```

```
In [46]: a = np.array([1, np.inf])

In [47]: a - a
<ipython-input-47-65de83fc0c8b>:1: RuntimeWarning: invalid value encountered in subtract
  a - a
Out[47]: array([ 0., nan])
```

問題となるコードを具体的に教えてくれました。

### `np.add`

```
In [79]: np.add(np.inf, -np.inf)
<ipython-input-79-e503359c7179>:1: RuntimeWarning: invalid value encountered in add
  np.add(np.inf, -np.inf)
Out[79]: nan
```

## pandas

### `pd.Series.sum`

```
In [34]: pd.Series([np.inf, -np.inf]).sum()
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/core/_methods.py:49: RuntimeWarning: invalid value encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial, where)
Out[34]: nan
```

### `pd.Series.mean`

```
In [87]: pd.Series([np.inf, -np.inf]).mean()
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/core/_methods.py:49: RuntimeWarning: invalid value encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial, where)
Out[87]: nan
```

### `pd.Series.std`

```
In [88]: pd.Series([np.inf]).std(ddof=0)
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/pandas/core/nanops.py:1016: RuntimeWarning: invalid value encountered in subtract
  sqr = _ensure_numeric((avg - values) ** 2)
Out[88]: nan
```

### `pd.Series.quantile`

```

In [52]: pd.Series([np.inf]).quantile()
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4655: RuntimeWarning: invalid value encountered in subtract
  diff_b_a = subtract(b, a)
Out[52]: nan

In [54]: pd.Series([np.inf,1]).quantile()
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4658: RuntimeWarning: invalid value encountered in subtract
  subtract(b, diff_b_a * (1 - t), out=lerp_interpolation, where=t >= 0.5,
Out[54]: nan

In [55]: pd.Series([np.inf,1,2]).quantile()
/home/yuji/.pyenv/versions/3.12.1/lib/python3.12/site-packages/numpy/lib/function_base.py:4657: RuntimeWarning: invalid value encountered in multiply
  lerp_interpolation = asanyarray(add(a, diff_b_a * t, out=out))
Out[55]: nan

In [56]: pd.Series([np.inf,1,2,3]).quantile()
Out[56]: 2.5

```

### `pd.core.groupby.DataFrameGroupBy.sum`

```
In [93]: df = pd.DataFrame({"key":["A","A"], "value":[np.inf, -np.inf]})

In [94]: df.groupby("key").sum()
Out[94]:
     value
key
A      NaN
```

RuntimeWarningは発生しませんでした。

### `pd.Series.sub`

```
In [97]: pd.Series([np.inf]) - pd.Series([np.inf])
Out[97]:
0   NaN
dtype: float64

```

RuntimeWarningは発生しませんでした。


# 分かったこと

* `np.sum`, `np.mean`では、`reduce`関数で`RuntimeWarning`が発生する
* `np.std`では、`subtract`関数で`RuntimeWarning`が発生する
* `pd.Series.sum`, `pd.Series.mean`, `pd.Series.std`では、`RuntimeWarning`が発生する
   * `pd.core.groupby.DataFrameGroupBy.sum`では、`RuntimeWarning`が発生しない
   * `pd.Series.sub`では`RuntimeWarning`が発生しない

pandasでnumpyの`RuntimeWarning`が発生するかどうかは、pandasの実装次第なので、あまり気にしなくてよいと思います。ただ、この`RuntimeWarning`でバグに気づけたこともあるので、pandasでも`RuntimeWarning`が発生するケースと発生しないケースをまとめました。


# 参考サイト


https://github.com/numpy/numpy/issues/25532