2015-08-18 3 views
1

у меня есть набор данных местоположений магазинов с датами событий (дата все акции было продано от этого магазина) и количества проданных изделий, таких как:Создание временных рядов DataFrame из данных событий

import numpy as np, pandas as pd 

# Dates 
start = pd.Timestamp("2014-02-26") 
end = pd.Timestamp("2014-09-24") 

# Generate some data 
N = 1000 
quantA = np.random.randint(10, 500, N) 
quantB = np.random.randint(50, 250, N) 
sell = np.random.randint(start.value, end.value, N) 
sell = pd.to_datetime(np.array(sell, dtype="datetime64[ns]")) 

df = pd.DataFrame({"sell_date": sell, "quantityA":quantA, "quantityB":quantB}) 
df.index = df.sell_date 

Я хотел бы создать новый dataframe серии времени, который имеет за еженедельное резюме (или в день; или на пользовательский объект DATE_RANGE) из диапазона этих величин а и В.

я могу генерировать номер недели и заполнитель продажи на основе таких, как ...

df['week'] = df.sell_date.dt.week 
df.pivot_table(values = ['quantityA', 'quantityB'], index = 'week', aggfunc = [np.sum, len]) 

Но я не вижу, как сделать следующее:

  1. расширить это к полному временных рядов (на основе объекта DATE_RANGE, такие как period_range = pd.date_range(start = start, end = end, freq='7D'))
  2. включают первоначальную дату (как переменная «неделя начала»), вместо целого числа недели, или
  3. изменить переменную date, чтобы быть индексом этого нового фрейма данных.

ответ

2

Я не уверен, если это то, что вы хотите, но вы можете попробовать

df.set_index('sell_date', inplace=True) 
resampled = df.resample('7D', [sum, len]) 

Полученный показатель не может быть именно то, что вы хотите, как она начинается с самого раннего DateTime правильнее наносекунды. Вы могли бы заменить DateTimes, которые имеют 00:00:00 в то время, делая

resampled.index = pd.to_datetime(resampled.index.date) 

EDIT:

Вы можете на самом деле просто сделать

resampled = df.resample('W', [sum, len]) 

И полученный индекс именно то, что вам хотеть. Интересно, что прохождение 'D' также дает индекс, который вы ожидаете, но проходящий через кратное, как '2D', приводит к индексу «уродливого», то есть, начиная с самого раннего правильного на наносекунду и увеличиваясь в несколько раз ровно за 2 дня. Думаю, урок придерживается таких синглов, как «D», «W», «M», где это возможно.

+0

Отлично, спасибо. Чтобы быть полным, я добавил 'df.index = df.sell_date' к моему ответу, а затем ваш ответ работает полностью. –

+0

Любые мысли о том, как это сделать с пользовательской date_range? Например, если мне нужны еженедельные резюме за весь 2014 год? –

+0

Ну, вы можете установить период, заменив «W» тем, что вы хотите. Чтобы ограничить диапазон, вы можете делать разные вещи, но я думаю, что 'df.loc ['20140101': '20141231']. Resample ...' будет самым чистым в этом случае. Когда вы говорите весь 2014 год, вы имеете в виду подмножество такого же большого набора данных? В вашем примере данные ограничены до 2014. – JoeCondron