Pandas Resample Upsample последняя дата / край данных
Я пытаюсь повысить еженедельные данные до суточных, однако у меня возникают трудности с повышением частоты до последней границы. Как я могу пойти по этому поводу?
import pandas as pd
import datetime
df = pd.DataFrame({'wk start': ['2018-08-12', '2018-08-12', '2018-08-19'],
'car': [ 'tesla model 3', 'tesla model x', 'tesla model 3'],
'sales':[38000,98000, 40000]})
df['wk start'] = df['wk start'].apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d'))
df.set_index('wk start').groupby('car').resample('D').pad()
Это возвращает:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
Мой желаемый результат:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
Я посмотрел на это, но они используют периоды, и я смотрю на даты. Заранее спасибо!
3 ответа
Решение
Да, вы правы, последние данные исключены. Решение состоит в том, чтобы добавить их к входу DataFrame
моё решение создает помощника Dataframe
с помощью drop_duplicates
добавляет 6
дни и concat
к оригиналу df
перед использованием вашего решения:
df1 = df.sort_values('wk start').drop_duplicates('car', keep='last').copy()
df1['wk start'] = df1['wk start'] + pd.Timedelta(6, unit='d')
df = pd.concat([df, df1], ignore_index=True)
df = df.set_index('wk start').groupby('car').resample('D').pad()
print (df)
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
Назначьте столбец в конце каждой недели и stack
, перед использованием вашего предыдущего groupby
попытка:
(df.assign(end=df['wk start'].add(pd.DateOffset(6))).set_index(
['car', 'sales']).stack()
.rename('wk start').reset_index([0, 1])
.set_index('wk start').groupby('car')
.resample('D').pad()
)
Выход:
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000
Вы также можете сделать:
(pd.melt(df.assign(w = df['wk start']+pd.DateOffset(6)),df.columns[1:],value_name =
"wk start").drop('variable',1).set_index('wk start').groupby('car').resample('D').pad())
car sales
car wk start
tesla model 3 2018-08-12 tesla model 3 38000
2018-08-13 tesla model 3 38000
2018-08-14 tesla model 3 38000
2018-08-15 tesla model 3 38000
2018-08-16 tesla model 3 38000
2018-08-17 tesla model 3 38000
2018-08-18 tesla model 3 38000
2018-08-19 tesla model 3 40000
2018-08-20 tesla model 3 40000
2018-08-21 tesla model 3 40000
2018-08-22 tesla model 3 40000
2018-08-23 tesla model 3 40000
2018-08-24 tesla model 3 40000
2018-08-25 tesla model 3 40000
tesla model x 2018-08-12 tesla model x 98000
2018-08-13 tesla model x 98000
2018-08-14 tesla model x 98000
2018-08-15 tesla model x 98000
2018-08-16 tesla model x 98000
2018-08-17 tesla model x 98000
2018-08-18 tesla model x 98000