Python 面板切片系列

Python 面板切片系列,python,pandas,slice,Python,Pandas,Slice,我有一个简单的数据框架: >>> df = pd.DataFrame(np.random.randint(0,5,(20, 2)), columns=['col1','col2']) >>> df['ind1'] = list('AAAAAABBBBCCCCCCCCCC') >>> df.set_index(['ind1'], inplace=True) >>> df col1 col2 ind1

我有一个简单的数据框架:

>>> df = pd.DataFrame(np.random.randint(0,5,(20, 2)), columns=['col1','col2'])
>>> df['ind1'] = list('AAAAAABBBBCCCCCCCCCC')
>>> df.set_index(['ind1'], inplace=True)
>>> df

      col1  col2
ind1            
A        0     4
A        1     2
A        1     0
A        4     1
A        1     3
A        0     0
B        0     4
B        2     0
B        3     1
B        0     3
C        1     3
C        2     1
C        4     0
C        4     0
C        4     1
C        3     0
C        4     4
C        0     2
C        0     2
C        1     2
我试图得到它的两列的滚动相关系数:

>>> df.groupby(level=0).rolling(3,min_periods=1).corr()

ind1
A    <class 'pandas.core.panel.Panel'>
Dimensions: ...
B    <class 'pandas.core.panel.Panel'>
Dimensions: ...
C    <class 'pandas.core.panel.Panel'>
Dimensions: ...
dtype: object
我能够分别得到每行所需的系数

>>> df.groupby(level=0).rolling(3,min_periods=1).corr()['A']

<class 'pandas.core.panel.Panel'>
Dimensions: 10 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: C to C
Major_axis axis: col1 to col2
Minor_axis axis: col1 to col2

>>> df.groupby(level=0).rolling(3,min_periods=1).corr().loc['A'].ix[2]

          col1      col2
col1  1.000000 -0.866025
col2 -0.866025  1.000000

>>> df.groupby(level=0).rolling(3,min_periods=1).corr().loc['A'].ix[2,'col1','col2']

-0.86602540378443849
有什么线索吗?还是获得滚动相关系数的更好方法?

您的问题是,调用时没有指定
其他
参数。即使您的数据帧只有两列,Pandas也不知道您实际需要的相关性,因此它会计算所有可能的相关性(
col1
x
col1
col1
x
col2
col2
x
col1
col2
)并在2x2数据结构中向您提供结果。如果要从一个相关性中获得结果,则需要通过设置基列和
其他
列来指定所需的相关性。如果您没有使用
groupby
,您可以这样做:

df['col1'].rolling(min_periods=1, window=3).corr(other=g['col2'])
由于使用的是
groupby
,因此需要将其嵌套在带有lambda函数的
apply
子句中(或者,如果愿意,可以将其移动到单独的函数中):


这是一个写得很好的问题——它包含了复制问题所需的一切,它显示了您迄今为止所做的尝试,并显示了您对希望解决方案是什么样子的想法。美好的
df['cor_coeff'] = df.groupby(level=0).rolling(3,min_periods=1).corr()['some slicing']
df['col1'].rolling(min_periods=1, window=3).corr(other=g['col2'])
df.groupby(level=0).apply(lambda g: g['col1'].rolling(min_periods=1, window=3).corr(other=g['col2']))