我正在为一个项目处理相当大量的(赛马!)数据,为各种不同的数据组合计算滚动总和-因此我需要尽可能地简化它.

从本质上讲,我是:

  • 计算点场随时间的滚动计算
  • 为各种分组数据组合计算此值[在本例中为马和教练的组合]
  • 查看过go 180天数据在一段时间内按组划分的平均值

下面的滚动窗口计算运行良好--但需要8.2秒[这大约是总数据集的1/8--因此需要1M 5秒].我正在寻找如何简化这种计算的 idea ,因为我希望对一些不同的数据组合进行计算,因此速度是至关重要的.谢谢.

import pandas as pd
import time

url = 'https://raw.githubusercontent.com/richsdixon/testdata/main/testdata.csv'
df = pd.read_csv(url, parse_dates=True)

df['RaceDate'] = pd.to_datetime(df['RaceDate'], format='mixed')
df.sort_values(by='RaceDate', inplace=True)
df['HorseRaceCount90d'] = (df.groupby(['Horse','Trainer'], group_keys=False)
                                 .apply(lambda x: x.rolling(window='180D', on='RaceDate', min_periods=1)['Points'].mean()))

推荐答案

这里有一个更快的方法:

df.merge(df.set_index('RaceDate')
           .groupby(['Horse', 'Trainer'])['Points']
           .rolling('180D')
           .mean()
           .rename('HorseRaceCount90d_1'), 
         right_index=True, 
         left_on=['Horse', 'Trainer', 'RaceDate'])

你的方式:

S每环18.5ms±727ms(平均值±标准戴夫.共7次运行,每次1次循环)

这条路:

1.18 S每圈±36.3ms(平均值±标准差戴夫.共7次运行,每次1次循环)

快速比较:

       RaceID   RaceDate               Horse           Jockey            Trainer  Points  HorseRaceCount90d  HorseRaceCount90d_1
0      678365 2017-01-08        STRADIVARIUS    Andrea Atzeni        John Gosden  100.00         100.000000           100.000000
289    680610 2017-01-08      CLASSIC PALACE     Brian Hughes       Dianne Sayer    1.76           1.760000             1.760000
288    680610 2017-01-08       ROMAN NUMERAL     Joe Colliver     David Thompson    0.00           0.000000             0.000000
287    680610 2017-01-08     COOPER'S FRIEND  Conor O'Farrell       R Mike Smith    0.00           0.000000             0.000000
286    680610 2017-01-08  GLEANN NA NDOCHAIS     Craig Nichol  Alistair Whillans    0.00           0.000000             0.000000
...       ...        ...                 ...              ...                ...     ...                ...                  ...
96817  702712 2018-12-06          URBAN ICON     Tom Marquand     Richard Hannon   12.50          12.500000            12.500000
96816  702712 2018-12-06           EVEN KEEL       Rob Hornby   Jonathan Portman   11.07          11.070000            11.070000
96815  702712 2018-12-06         MOLLY BLAKE    Hector Crouch          Clive Cox    9.73           9.730000             9.730000
96885  702719 2018-12-06      CELTIC ARTISAN       Cam Hardie    Rebecca Menzies    2.37           1.046667             1.046667
97076  704968 2018-12-06             REVENGE      David Allan       Tim Easterby    2.47           1.346667             1.346667

[100008 rows x 8 columns]

Python相关问答推荐

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

仿制药的类型铸造

如何列举Pandigital Prime Set

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

pyscript中的压痕问题

如何在WSL2中更新Python到最新版本(3.12.2)?

在np数组上实现无重叠的二维滑动窗口

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

多处理队列在与Forking http.server一起使用时随机跳过项目

幂集,其中每个元素可以是正或负""""

python中csv. Dictreader. fieldname的类型是什么?'

Cython无法识别Numpy类型

jsonschema日期格式

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

极点替换值大于组内另一个极点数据帧的最大值

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

文本溢出了Kivy的视区

一维不匹配两个数组上的广义ufunc

用LAKEF划分实木地板AWS Wrangler