को स्थानांतरित करने का सबसे प्रभावी तरीका मेरे पास डेटाफ्रेम है जिसमें कई स्टैक्ड टाइम श्रृंखला शामिल हैं। इंडेक्स (पूलआईडी, महीने) है जहां दोनों पूर्णांक हैं, "महीने" 2000 से महीनों की संख्या है। एकाधिक चर के एक महीने के अंतराल संस्करणों की गणना करने का सबसे अच्छा तरीका क्या है?मल्टीइंडेक्स समय श्रृंखला
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 पंक्तियों के कुल की है।)
मैं आर कोड और बराबर data.table कॉल से परिवर्तित कर रहा हूँ:
dt.shift <- dt[, list(bal=myshift(bal), ...), by=list(poolId)]
केवल चलाने के लिए 9 रों लेता है। (यहां "माईशफ्ट" कुछ "फ़ंक्शन (एक्स) सी (एक्स [-1], एनए) जैसा है"।)
क्या कोई तरीका है कि मैं पैंडस कैरिसन को गति से वापस लाइन में वापस लाने के लिए एक तरीका प्राप्त कर सकता हूं? मैंने इसे 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 (लेंस) पर समाप्त होना चाहिए, ragged प्रारंभ तिथियों के साथ, लेकिन काफी अच्छा है।
संपादित करें 2: यहां कुछ तुलना आर कोड है। यह 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। मैं एक नज़र डालेंगे –