6

これを自分のデータで機能させることができないため、最初に非常によく似た具体的な例を試しています。データフレームは次のとおりです。

In [56]:

idx = pd.DatetimeIndex(start='1990-01-01', freq='d', periods=5)
data= pd.DataFrame({('A','a'):[1,2,3,4,5],
                    ('A','b'):[6,7,8,9,1],
                    ('B','a'):[2,3,4,5,6],
                    ('B','b'):[7,8,9,1,2]}, idx)
Out[56]:
A   B
a   b   a   b
1990-01-01  1   6   2   7
1990-01-02  2   7   3   8
1990-01-03  3   8   4   9
1990-01-04  4   9   5   1
1990-01-05  5   1   6   2

したがって、私が望んでいるのは、各観測値 (インデックスの各日) の変数 (各列) の中心傾向の線で時系列をプロットし、指定された誤差推定量 (おそらくちょうど 95各日に対応する観察の % ci)。

私はこれを試しました:

sns.tsplot(data, time=idx)

しかし、次のエラーが表示されます。

UnboundLocalError                         Traceback (most recent call last)
<ipython-input-57-fa07e08ead95> in <module>()
      5                     ('B','b'):[7,8,9,1,2]}, idx)
      6 
----> 7 sns.tsplot(data, time=idx)

C:\Users\Patrick\Anaconda\lib\site-packages\seaborn\timeseries.pyc in tsplot(data, time, unit, condition, value, err_style, ci, interpolate, color, estimator, n_boot, err_palette, err_kws, legend, ax, **kwargs)
    253 
    254     # Pad the sides of the plot only when not interpolating
--> 255     ax.set_xlim(x.min(), x.max())
    256     x_diff = x[1] - x[0]
    257     if not interpolate:

UnboundLocalError: local variable 'x' referenced before assignment

tsplot の構文は次のとおりです。

sns.tsplot(data, time=None, unit=None, condition=None, value=None, err_style='ci_band', ci=68, interpolate=True, color=None, estimator=<function mean at 0x00000000044F2C18>, n_boot=5000, err_palette=None, err_kws=None, legend=True, ax=None, **kwargs)

したがって、時間引数としてインデックスを使用してデータを提供していますが、何が間違っているのかわかりません。他のキーワード引数は必要ないと思いますが、それが問題かもしれません。

代わりに次元(単位、時間)の配列でこれを行うと:

sns.tsplot(data.values.T, time=idx)

期待される出力が得られます (タイムスタンプがない場合は xlabels です):

ここに画像の説明を入力

しかし、データフレームでこれを行う正しい方法は何ですか? 「長い形式」でなければならないことはわかっていますが、この特定のフレームでこれが何を意味するのかはよくわかりません。

4

1 に答える 1

9

私はそれを理解することになりました。基本的に、最初に見るべきだったのは、ここの「長い形式の DataFrame を使用した入力データの指定」というタイトルのセクションでした。私がしなければならなかったのはこれでした:

data.reset_index(inplace=True)
data.columns = np.arange(len(data.columns))
melted = pd.melt(data, id_vars=0)

最初の行は、DatetimeIndex を独自の列に移動し、デフォルトの整数インデックスを設定します。2行目は、ヘッダーを削除することを除いて、ヘッダーに対して同じことを行います(マルチインデックスでグループ化を行うことができないように見えるため、これを行う必要がありました)。最後に、データを溶かして、次のような DataFrame を作成します。

In [120]:

melted
Out[120]:
0   variable    value
0   1990-01-01  1   1
1   1990-01-02  1   2
2   1990-01-03  1   3
3   1990-01-04  1   4
4   1990-01-05  1   5
5   1990-01-01  2   6
6   1990-01-02  2   7
7   1990-01-03  2   8
8   1990-01-04  2   9
9   1990-01-05  2   1
10  1990-01-01  3   2
11  1990-01-02  3   3
12  1990-01-03  3   4
13  1990-01-04  3   5
14  1990-01-05  3   6
15  1990-01-01  4   7
16  1990-01-02  4   8
17  1990-01-03  4   9
18  1990-01-04  4   1
19  1990-01-05  4   2

DataFrame の準備ができたら、次のように tsplot を使用できます。

sns.tsplot(melted, time=0, unit='variable', value='value')

私の場合、これは私がした場合とほとんど同じです:

sns.tsplot(data.T.values, idx)
plt.xlabel('0')
plt.ylabel('value')

条件を追加した場合を除いて、tsplot は他の系列をプロットし、凡例を作成します。

tsplot関数の性質を考えると、少なくとも日付をタイムスタンプとしてプロットできるとよいでしょう。転置配列を使用すると、DataFrame を直接使用するよりも、アプリケーションにとってはるかに簡単なオプションになると思います。

于 2014-12-05T08:21:46.030 に答える