2015-11-15 4 views
1

Предположим, что у меня есть python dict, для каждого продукта ключ - это метка времени, а значение - цена продукта на этой отметке времени.Нормализация временных рядов по событию

data_dict = { 
'product_1' : {1: 415, 2: 550, 3: 0, 4: 550, 5: 600}, 
'product_2' : {1: 400, 2: 300, 3: 300, 4: 0, 5: 300}, 
'product_3' : {1: 500, 2: 400, 3: 0, 4: 500, 5: 500}, 
'product_4' : {1: 0, 2: 200, 3: 200, 4: 300, 5: 300} 
} 

Очень часто в анализе таймсерии быть перенормировки много таймсерий некоторым событием, предположим, что мы рассматриваем это событие как метки времени, когда продукт является бесплатным. Я хотел бы получить таблицу вот этой структуры

  | -3 | -2 | -1 | 0 | +1 | +2 | +3 | +4 | 
--------------------------------------------------------- 
product_1 | NA | 415 | 550 | 0 | 550 | 600 | NA | NA | 
product_2 | 400 | 300 | 300 | 0 | 300 | NA | NA | NA | 
product_3 | NA | 500 | 400 | 0 | 500 | 500 | NA | NA | 
product_4 | NA | NA | NA | 0 | 200 | 200 | 300 | 300 | 

Есть ли какой-нибудь способ сделать это легко с помощью панд для питона? Я уверен, что тонны ребята из науки о данных должны были сделать что-то подобное в какой-то момент. Если нет, было бы очень полезно, если бы парни-панды могли добавить некоторые функции для чего-то подобного в будущем! В то же время, какие-либо предложения, как это сделать?

ответ

3

Вы можете использовать метод .apply, но он имеет тенденцию быть неэффективным, если у вас много столбцов;

Так, начиная с этого кадра:

>>> df 
    product_1 product_2 product_3 product_4 
1  415  400  500   0 
2  550  300  400  200 
3   0  300   0  200 
4  550   0  500  300 
5  600  300  500  300 

вы определяете функцию синхронизации, как в:

>>> def sync(ts): 
...  vals = ts.values 
...  n, k = len(vals), np.where(vals == 0)[0][0] 
...  return Series(vals, np.arange(-k, n - k)) 

и применять его по столбцам:

>>> df.apply(sync).T 
      -3 -2 -1 0 1 2 3 4 
product_1 NaN 415 550 0 550 600 NaN NaN 
product_2 400 300 300 0 300 NaN NaN NaN 
product_3 NaN 500 400 0 500 500 NaN NaN 
product_4 NaN NaN NaN 0 200 200 300 300 

.T в конце для транспонирования.

+0

Да, здесь я привел пример для примера, но я работаю с файловой рамкой с более чем 8000 столбцами и рядом с 300 строками, а строки будут складываться. Спасибо за ваш вклад! Помогает много. –

+0

Эй, я сделал изменения, чтобы высмеять пример выше, продукт 3 свободен на 2-й и 3-й день. И в ожидаемой структуре я хочу, чтобы -1 отражал ненулевое значение и аналогично +1, как показано. Не могли бы вы мне помочь? –

+0

@ harshal.c: Это совсем другой вопрос. Недействительный ответ, изменяя свой вопрос, - это не совсем крикет. – DSM

Смежные вопросы