1. ホーム
  2. python

[解決済み] 非推奨のtsplotの置き換え

2022-02-11 06:57:14

質問

一様なサンプルを持つ時系列がnumpy配列に保存されており、ブートストラップされた信頼区間を持つそれらの平均値をプロットしたいのですが。一般的に、私は tsplot のSeabornで実現できます。しかし、これは現在 非推奨 . 代わりに何を使えばいいのでしょうか?

以下は、Seabornのドキュメントから引用した使用例です。

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
sns.tsplot(data)

という質問と同じようなものです。 Seaborn tsplot エラー "と" seaborn tsplotを使用した複数行のチャート "。しかし、私の場合、実際にはSeabornの信頼区間機能が必要で、厄介なコーディングなしにMatplotlibを単純に使うことはできません。

どのように解決するのか?

tsplot の問題は、matplotlibを使って簡単に再現することができます。

標準偏差を誤差の推定値として使用する

import numpy as np; np.random.seed(1)
import matplotlib.pyplot as plt
import seaborn as sns

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)


fig, (ax,ax2) = plt.subplots(ncols=2, sharey=True)
ax = sns.tsplot(data=data,ax=ax, ci="sd")

def tsplot(ax, data,**kw):
    x = np.arange(data.shape[1])
    est = np.mean(data, axis=0)
    sd = np.std(data, axis=0)
    cis = (est - sd, est + sd)
    ax.fill_between(x,cis[0],cis[1],alpha=0.2, **kw)
    ax.plot(x,est,**kw)
    ax.margins(x=0)

tsplot(ax2, data)

ax.set_title("sns.tsplot")
ax2.set_title("custom tsplot")

plt.show()

誤差の推定にブートストラップを使用する

import numpy as np; np.random.seed(1)
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)


fig, (ax,ax2) = plt.subplots(ncols=2, sharey=True)
ax = sns.tsplot(data=data,ax=ax)

def bootstrap(data, n_boot=10000, ci=68):
    boot_dist = []
    for i in range(int(n_boot)):
        resampler = np.random.randint(0, data.shape[0], data.shape[0])
        sample = data.take(resampler, axis=0)
        boot_dist.append(np.mean(sample, axis=0))
    b = np.array(boot_dist)
    s1 = np.apply_along_axis(stats.scoreatpercentile, 0, b, 50.-ci/2.)
    s2 = np.apply_along_axis(stats.scoreatpercentile, 0, b, 50.+ci/2.)
    return (s1,s2)
    
def tsplotboot(ax, data,**kw):
    x = np.arange(data.shape[1])
    est = np.mean(data, axis=0)
    cis = bootstrap(data)
    ax.fill_between(x,cis[0],cis[1],alpha=0.2, **kw)
    ax.plot(x,est,**kw)
    ax.margins(x=0)

tsplotboot(ax2, data)

ax.set_title("sns.tsplot")
ax2.set_title("custom tsplot")

plt.show()


この関数が非推奨なのは、まさにこの関数の用途がかなり限定的で、ほとんどの場合、プロットしたいデータを直接プロットした方が良いからでしょう。