我有一个这种示意图形式的 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(自相关函数)
但是聚合操作需要来自两个不同组的数据(即不同时间的组),到目前为止我还没有找到一种方法来做到这一点。有任何想法吗?