Вы можете выполнять сгруппированные операции, используя функции индексации и groupby
в пандах.
Если у вас есть фрейм данных df
со столбцами ['week', 'year', 'weekday', 'volume'], ваше решение будет выглядеть примерно так:
import numpy as np
import pandas as pd
import timeit as t
# make up some data, only 1000 groups not your 30000, but it gets the point across
dates = pd.date_range(start = '2000-01-01', end = '2019-02-28', freq = 'D')
volume = np.random.randint(0,100,len(dates))
df = pd.DataFrame(list(zip(dates.week,dates.year,dates.dayofweek,volume)),
columns = ['week','year','weekday','volume'])
# group
grp = df.groupby(['year','week'])
grp_vol = grp['volume'].sum()
# rename to avoid overlap in names
grp_vol.name = 'weekly_volume'
# rejoin to calculate your ratio
df = df.join(grp_vol, on = ['year','week'])
df['ratio'] = df['volume']/df['weekly_volume']
А затем время для хорошей меры
%timeit df['ratio'] = df['volume']/df['weekly_volume']
196 µs ± 4.32 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Так намного меньше, чем 24 часа.