2

我有一个这种示意图形式的 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'])

按产品和时间分组,我希望跨场景的“价格”排名自相关,示意性定义如下(按产品):

(时间 t 的秩自相关)= 秩相关(时间 t 的“价格”,时间 t+1 的“价格”)

其中 ('Price' at time t) 是一个包含与场景一样多的条目的向量(每个产品都有一个这样的向量)。例如,对于时间 t=2 的产品“Alpha”,所需数量为

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(自相关函数)

但是聚合操作需要来自两个不同组的数据(即不同时间的组),到目前为止我还没有找到一种方法来做到这一点。有任何想法吗?

4

0 回答 0