Черпая вдохновение в ответе @ jezrael выше, а также в ответе на другой вопрос здесь , вот решение для среднего значения по игроку - без ограничения размера окна даты.
# Get the running count of Names, sorted by Date, Name
df['NameCount'] = df.sort_values(['Date','Name'], ascending=True).groupby('Name').cumcount() + 1
# Running sum of points, in the same order as above (important)
df['PointSum'] = df.sort_values(['Name','NameCount'], ascending=True).groupby('Name')['Points'].cumsum()
df['MA'] = df['PointSum']/df['NameCount']
# Drop the unneeded columns
df = df.drop(['NameCount', 'PointSum'], axis=1)
Метод cumcount (), предоставляемый @MaxU здесь , в качестве эмуляции номера строки SQL, секционирования по методу