UnboundLocalError:赋值前引用的局部变量'x'.在seaborn包中正确使用tsplot用于数据帧?

pbr*_*ach 6 python time-series seaborn

我不能让这个为我的数据工作所以首先我尝试一个非常相似的具体例子.这是数据帧:

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
Run Code Online (Sandbox Code Playgroud)

所以我希望做的是绘制一个时间序列,每个观察的变量(每列)中的中心趋势线(指数中的每一天),阴影区域表示指定的误差估计(可能只有95) %ci)对应于每一天的观察结果.

我试过这个:

sns.tsplot(data, time=idx)
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

所以我提供的数据与索引作为时间参数,但我不知道我做错了什么.我认为我不需要任何其他关键字参数,但可能就是问题.

如果我使用尺寸(单位,时间)的数组执行此操作:

sns.tsplot(data.values.T, time=idx)
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出(除了没有时间戳是xlabels):

在此输入图像描述

但是使用数据框执行此操作的正确方法是什么?我知道它必须是'长形',但我不太确定这对于这个特定的框架意味着什么.

pbr*_*ach 9

我最终搞清楚了.基本上,我应该已经看过的第一个地方是这里的部分标题为"指定输入数据与长形DataFrames".我必须做的是:

data.reset_index(inplace=True)
data.columns = np.arange(len(data.columns))
melted = pd.melt(data, id_vars=0)
Run Code Online (Sandbox Code Playgroud)

第一行将DatetimeIndex移动到其自己的列中,并在其中设置默认的整数索引.第二行对标题执行相同的操作,除非删除它们(我需要这样做,因为似乎不可能使用多索引进行分组).最后,我们融合创建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
Run Code Online (Sandbox Code Playgroud)

现在,在DataFrame准备就绪之后,我可以像这样使用tsplot:

sns.tsplot(melted, time=0, unit='variable', value='value')
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这与我做的几乎相同:

sns.tsplot(data.T.values, idx)
plt.xlabel('0')
plt.ylabel('value')
Run Code Online (Sandbox Code Playgroud)

除非我添加任何条件,否则tsplot会绘制其他系列并为我制作一个传奇.

如果tsplot考虑到函数的性质,至少可以将日期绘制为时间戳.我认为使用转置数组对于我的应用程序来说将是一个更容易的选择,而不是直接使用DataFrame.