大熊猫中与时间相关的等级自相关

时间:2018-01-22 21:43:55

标签: python pandas aggregate pandas-groupby pandas-apply

我有一个这种原理图形式的MultiIndex pandas DataFrame(尽管我使用的真实数据帧有数百万行):

import pandas as pd

df = pd.DataFrame([['Alpha', 'a', 1,10], ['Alpha', 'a', 2,20],['Alpha', 'a', 3,30],
                   ['Alpha', 'b', 1,50],['Alpha', 'b', 2,60],['Alpha', 'b', 3,10],
                   ['Alpha', 'c', 1,10],['Alpha', 'c', 2,70],['Alpha', 'c', 3,80], 
                   ['Beta', 'a', 1,30], ['Beta', 'a', 2,40],['Beta', 'a', 3,50],
                   ['Beta', 'b', 1,80],['Beta', 'b', 2,70], ['Beta', 'b', 3,60],
                   ['Beta', 'c', 1,10],['Beta', 'c', 2,30], ['Beta', 'c', 3,40]], 
                    columns=['Product', 'Scenario', 'Time','Price'])\
                  .set_index(['Product', 'Scenario'])

按产品和时间分组,我希望排名自动相关' Price'跨场景,示意性地定义如下(逐个产品):

(时间t的排名自相关)=排名相关性('价格'时间t,'价格'时间t + 1)

其中('价格'在时间t)是一个具有与场景一样多的条目的向量(并且我们为每个产品都有一个这样的向量)。例如,对于产品' Alpha'在时间t = 2,期望的数量是

import scipy
from scipy import stats as ss

ss.spearmanr([20,60,70] , [30,10,80])[0] 

给出0.5。对于最后一个步骤(在这种情况下t = 3),它应该简单地返回NaN(因为t + 1没有数据)。总而言之,所需的结果数据框应为:

import numpy as np
df_result =  pd.DataFrame([['Alpha',1,0], ['Alpha',2,0.5],['Alpha',3,np.nan],                        
                           ['Beta',1,1], ['Beta',2,1],['Beta',3,np.nan]], 
                           columns=['Product', 'Time','Autocorrelation'])\
                          .set_index(['Product'])

        Time    Autocorrelation
Product     
Alpha      1                0.0
Alpha      2                0.5
Alpha      3                NaN
Beta       1                1.0
Beta       2                1.0
Beta       3                NaN

我想从

开始

df.groupby([' Product',' Time'])。agg(autocorrelation function)

然后聚合操作需要来自两个不同组(即不同时间组)的数据,到目前为止我还没有找到方法。有什么想法吗?

0 个答案:

没有答案