Начните с определения функции для подсчета vwap за текущий месяц (группа строк):
def vwap(grp):
return (grp.price * grp.salesNo).sum() / grp.salesNo.sum()
Затем примените ее к группам по месяцам:
df.groupby(df.dat.dt.to_period('M')).apply(vwap)
Используя следующий тест DataFrame:
dat price salesNo
0 2018-05-14 120.5 10
1 2018-05-16 80.0 22
2 2018-05-20 30.2 12
3 2018-08-10 75.1 41
4 2018-08-20 92.3 18
5 2019-05-10 10.0 33
6 2019-05-20 20.0 41
(содержащий данные за одни и те же месяцы разных лет), я получил:
dat
2018-05 75.622727
2018-08 80.347458
2019-05 15.540541
Freq: M, dtype: float64
Как видите, результат содержит отдельных записей за май в оба года из исходных данных.