我有一个这种原理图形式的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)
然后聚合操作需要来自两个不同组(即不同时间组)的数据,到目前为止我还没有找到方法。有什么想法吗?