Я пытаюсь сделать список заказов на ремонт в «ежедневном» фрейме данных, содержащем количество ремонтов, открытых в магазине.
The repair table looks like this:
data = [['USA', 2007-01-01, 2007-01-10],
['EUR', 2007-01-01, 2007-01-08],
['ASIA', 2007-01-02, 2007-01-05],
['EUR', 2007-01-07, 2007-0-10]]
columns = ['Location', 'Date In', 'Date Out']
repairs = pd.DataFrame(data, columns=columns)
print(repairs)
Я хочу создать фрейм данных, содержащий все магазины и количество деталей, которые находятся в магазине каждый день. Итак, результат должен выглядеть так:
locations = repairs['Location'].unique()
dates = pd.date_range(start=2007-01-01, end = 2007-01-11)
locwork = pd.DataFrame(index=dates, columns=locations)
print(locwork)
Есть ли векторизованный способ добиться этого? Потому что единственный способ, которым я мог найти, - это перебрать фрейм данных locwork и посмотреть, сколько строк в фрейме данных ремонта удовлетворяет условию. Однако из-за размера обоих DataFrames (300 000 ремонтов, 01.01.2007 по сегодняшний день) этот вариант не достаточно быстр. Мое текущее решение таково (извините за скрытый код, мне просто нужно рабочее решение:
for date in dates:
temp = repairs.loc[(repairs['Date In'] < date) & (repairs['Date Out'] > date)][['Date In',
'Location']]
temp['Date In'] = date
temp = temp.reset_index()
temp = temp.drop(columns=['index'])
locdates = locdates.append(temp)
temp = temp.iloc[0:0]
locdates['Date'] = locdates['Date In']
locdates['Date In'] = 1
locwork = locdates.groupby(['Date', 'Shop']).sum()
locwork = locwork.unstack()\
.fillna(0)\
.reset_index()\
.droplevel(0, axis = 1)
locwork = locwork.set_index(locwork.columns[0])
print(locwork)
Каким будет более аккуратный, более pythoni c способ добиться этого?