Сокращайте наборы данных временных рядов изо дня в неделю - PullRequest
0 голосов
/ 18 июня 2019

Я получаю ежедневные царапины данных временных рядов от mysql, и я хочу превратить их в еженедельные данные временных рядов.Как я могу это сделать?

Например, вот набор данных о продукте с ключами Timestamp & Price, содержащий 14 дней дат и соответствующие цены.

Product: {'Timestamp': [datetime.date(2019, 4, 15), datetime.date(2019, 4, 16), datetime.date(2019, 4, 17), datetime.date(2019, 4, 18), datetime.date(2019, 4, 19), datetime.date(2019, 4, 20), datetime.date(2019, 4, 21), datetime.date(2019, 4, 22), datetime.date(2019, 4, 23), datetime.date(2019, 4, 24), datetime.date(2019, 4, 25), datetime.date(2019, 4, 26), datetime.date(2019, 4, 27), datetime.date(2019, 4, 28)]
, 'Price': ['3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988']}

Теперь вместо простогоимея соответствующие даты и цены, я хочу, чтобы мои еженедельные средние данные начинались в субботу и заканчивались в пятницу (здесь я использую примеры пятницы, 4/19 и пятницы, 4/26, чтобы представить средние значения за неделю, используя данные изза 6 дней до каждой из этих дат; обратите внимание, что эти даты не просто представляют цену одного дня), поэтому результат должен быть следующим:

Product: {'Timestamp': [ datetime.date(2019, 4, 19), datetime.date(2019, 4, 26)]
, 'Price': ['3988', '3988']}

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Вы можете легко найти среднее значение за неделю, начиная с пятницы, если преобразовать данные временных рядов в pd.to_datetime ()

df = pd.DataFrame({'Timestamp': [datetime.date(2019, 4, 15), datetime.date(2019, 4, 16), datetime.date(2019, 4, 17), datetime.date(2019, 4, 18), datetime.date(2019, 4, 19), datetime.date(2019, 4, 20), datetime.date(2019, 4, 21), datetime.date(2019, 4, 22), datetime.date(2019, 4, 23), datetime.date(2019, 4, 24), datetime.date(2019, 4, 25), datetime.date(2019, 4, 26), datetime.date(2019, 4, 27), datetime.date(2019, 4, 28)], 'Price': ['3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988', '3988']})
df['Timestamp'] = pd.to_datetime(df['Timestamp'])
df['Price'] = df['Price'].astype('int')

затем используйте списки для создания новой серии, а затем кумулятивно суммируйте данные

df['Week'] = [1 if x == 4 else 0 for x in df['Timestamp'].dt.weekday]
df['Week'] = df['Week'].cumsum()

Наконец, группировка по вновь созданной серии, чтобы получить результат

df[['Price', 'Week']].groupby('Week').mean()

Надеюсь, это поможет:)

UPDATE

Вы можете просто выполнить статистическую функцию для переменной Timestamp с помощью min и max, и вы также получите даты.

df[['Timestamp', 'Week']].groupby(['Week']).agg({'Timestamp':[np.min,np.max]})
0 голосов
/ 20 июня 2019

Следуя инструкциям @saahil, я могу почти получить то, что хочу.есть одна информация, которую мне нужно иметь в своем результате, это временная метка, соответствующая неделе. Однако, если есть мое решение, вместо того, чтобы сгруппировать, я выбираю опорный пункт, чтобы помочь мне с этим.

df2 = pd.pivot_table(df,index=['Week'],values=['Price','Timestamp'],aggfunc={'Price':np.mean,'Timestamp': max})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...