如何使用multiindex数据框创建seaborn回归图?

时间:2017-06-04 15:23:26

标签: python-3.x pandas linear-regression seaborn

我有时间序列数据,这些数据在(年,月)上被多重索引,如下所示:

print(df.index)
print(df)
MultiIndex(levels=[[2016, 2017], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0], [2, 3, 4, 5, 6, 7, 8, 9]],
           names=['Year', 'Month'])
            Value
Year Month            
2016 3       65.018150
     4       63.130035
     5       71.071254
     6       72.127967
     7       67.357795
     8       66.639228
     9       64.815232
     10      68.387698

我想对这些时间序列数据进行非常基本的线性回归。因为pandas.DataFrame.plot没有做任何回归,我打算用Seaborn进行我的绘图。

我尝试使用lmplot

执行此操作
sns.lmplot(x=("Year", "Month"), y="Value", data=df, fit_reg=True) 

但是我收到了错误:

TypeError: '>' not supported between instances of 'str' and 'tuple'

这对我来说特别有趣,因为df.index.levels[:]中的所有元素都属于numpy.int64类型,df.index.labels[:]中的所有元素都属于numpy.int8类型。

为什么我收到此错误?我该如何解决?

2 个答案:

答案 0 :(得分:4)

您可以使用reset_index将数据框的索引转换为列。然后使用seaborn直接绘制DataFrames列。

我猜使用lmplot的原因是为了显示不同年份的不同回归(否则regplot可能更适合),"Year"列可以用作{ {1}}。

hue

enter image description here

答案 1 :(得分:1)

考虑以下方法:

df['x'] = df.index.get_level_values(0) + df.index.get_level_values(1)/100

的产率:

In [49]: df
Out[49]:
                Value        x
Year Month
2016 3      65.018150  2016.03
     4      63.130035  2016.04
     5      71.071254  2016.05
     6      72.127967  2016.06
     7      67.357795  2016.07
     8      66.639228  2016.08
     9      64.815232  2016.09
     10     68.387698  2016.10

让我们准备X-ticks标签:

labels = df.index.get_level_values(0).astype(str) + '-' + \
         df.index.get_level_values(1).astype(str).str.zfill(2)

sns.lmplot(x='x', y='Value', data=df, fit_reg=True)
ax = plt.gca()
ax.set_xticklabels(labels)

结果:

enter image description here