Мое решение не ужасно питонное, но, я думаю, оно выполнено.
По одному парку за раз я нарезал смещение кадра данных по дням (скорректируйте дни, чтобы получить сумму проката), а затем извлек значения автомобилей в список.
Работая с автомобилями в списке за каждый день, мы можем рассчитать общее количество уникальных автомобилей за день.
Результатом является список, который вы можете преобразовать в фрейм данных, если вам нужно.
import pandas as pd
import datetime
# initiate dataframe
df = pd.DataFrame({
'park': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
'date': ['2019-01-01', '2019-01-03', '2019-01-05', '2019-01-05',
'2019-01-01', '2019-01-08', '2019-01-08', '2019-01-10'],
'to_count': ['Honda', 'Lexus', 'BMW', 'Lexus', 'BMW', 'Lexus', 'Lexus', 'Ford']
})
# string to date
df['date'] = pd.to_datetime(df['date'])
result = []
for park in ['A', 'B']:
# Do one park at a time
df_park = df[df['park'] == park][['date','to_count']]
df_park.set_index('date',inplace=True)
# interate through the dataframe and put results to list.
for i, v in df_park.iterrows():
# THIS IS YOUR ROLLING VALUE IN DAYS
days = 1
# create the starting date
b = i - datetime.timedelta(days=days)
# create a list of cars during the period
li = df_park.loc[b:i].values
# reduce the list to unique cars
unique_cars = len(np.unique(li))
# append the results to the result list
result.append((park, i.strftime('%B %d, %Y'), unique_cars))
# the final list has duplicates, so use set to drop the dups and re-sort for the result.
sorted(list(set(result)))
Результат выглядит так:
[('A', 'January 01, 2019', 1),
('A', 'January 03, 2019', 1),
('A', 'January 05, 2019', 2),
('B', 'January 01, 2019', 1),
('B', 'January 08, 2019', 1),
('B', 'January 10, 2019', 1)]