我有一個由許多堆棧時間序列組成的DataFrame。索引是(poolId,month),其中兩個都是整數,「月」是自2000年以來的月數。計算多個變量的滯後版本的最佳方法是什麼?移動MultiIndex時間序列的最有效方法
現在,我做這樣的事情:
cols_to_shift = ["bal", ...5 more columns...]
df_shift = df[cols_to_shift].groupby(level=0).transform(lambda x: x.shift(-1))
對於我的數據,這花了我一個完整的60秒運行。 (我有48K不同池和共718k行。)
我來自R碼和等效data.table呼叫轉換此:
dt.shift <- dt[, list(bal=myshift(bal), ...), by=list(poolId)]
只需要9 s到運行。 (這裏的「myshift」就像是「function(x)c(x [-1],NA)」。)
有沒有辦法讓熊貓verison回到速度明智的行列?我在0.8.1上測試了這個。
編輯:這裏是產生足夠接近的數據集的例子,這樣你就可以得到我的意思了一些想法:
ids = np.arange(48000)
lens = np.maximum(np.round(15+9.5*np.random.randn(48000)), 1.0).astype(int)
id_vec = np.repeat(ids, lens)
lens_shift = np.concatenate(([0], lens[:-1]))
mon_vec = np.arange(lens.sum()) - np.repeat(np.cumsum(lens_shift), lens)
n = len(mon_vec)
df = pd.DataFrame.from_items([('pool', id_vec), ('month', mon_vec)] + [(c, np.random.rand(n)) for c in 'abcde'])
df = df.set_index(['pool', 'month'])
%time df_shift = df.groupby(level=0).transform(lambda x: x.shift(-1))
這花了64號,當我嘗試過。這些數據從第0個月開始每個系列;真的,他們都應該在np.max(鏡頭)月份結束,開始日期不齊,但是足夠好。
編輯2:這是一些比較R代碼。這需要0.8秒。 80因素,不好。
library(data.table)
ids <- 1:48000
lens <- as.integer(pmax(1, round(rnorm(ids, mean=15, sd=9.5))))
id.vec <- rep(ids, times=lens)
lens.shift <- c(0, lens[-length(lens)])
mon.vec <- (1:sum(lens)) - rep(cumsum(lens.shift), times=lens)
n <- length(id.vec)
dt <- data.table(pool=id.vec, month=mon.vec, a=rnorm(n), b=rnorm(n), c=rnorm(n), d=rnorm(n), e=rnorm(n))
setkey(dt, pool, month)
myshift <- function(x) c(x[-1], NA)
system.time(dt.shift <- dt[, list(month=month, a=myshift(a), b=myshift(b), c=myshift(c), d=myshift(d), e=myshift(e)), by=pool])
這裏我打開一個GitHub的問題:https://github.com/pydata/pandas /問題/ 2162。我會看看 –