gpt4 book ai didi

pandas - 如何矢量化以加速 Dataframe apply pandas

转载 作者:行者123 更新时间:2023-12-05 07:00:17 28 4
gpt4 key购买 nike

我有一个 tXn (5000 X 100) 数据框 wts_df,

wts_df.tail().iloc[:, 0:6]
Out[71]:
B C H L R T
2020-09-25 0.038746 0.033689 -0.047835 -0.002641 0.009501 -0.030689
2020-09-28 0.038483 0.033189 -0.061742 0.001199 0.009490 -0.028370
2020-09-29 0.038620 0.034957 -0.031341 0.006179 0.007815 -0.027317
2020-09-30 0.038610 0.034902 -0.014271 0.004512 0.007836 -0.024672
2020-10-01 0.038790 0.029937 -0.044198 -0.008415 0.008347 -0.030980

和两个相似的 txn 数据帧,vol_df 和 rx_df(相同的索引和列)。现在我们可以使用,

rx_df = wts_df.applymap(lambda x: np.random.rand())
vol_df = wts_df.applymap(lambda x: np.random.rand())

我需要这样做(简化):

for date in wts_df.index:
wts = wts_df.loc[date] # is a vector now 1Xn

# mutliply all entries of rx_df and vol_df until this date by these wts, and sum across columns

rx = rx_df.truncate(after=date) # still a dataframe but truncated at a given date, kXn
vol = vol_df_df.truncate(after=date)

wtd_rx = (wts * rx).sum(1) # so a vector kX1
wtd_vol = (wts * vol).sum(1)

# take ratio
rx_vol = rx / vol

rate[date] = rx_vol.tail(20).std()

所以速率看起来像这样

pd.Series(rate).tail()
Out[71]:
rate
2020-09-25 0.0546
2020-09-28 0.0383
2020-09-29 0.0920
2020-09-30 0.0510
2020-10-01 0.0890

上面的循环很慢,所以我试了一下:

def rate_calc(wts, date, rx_df=rx_df, vol_df=vol_df):
wtd_rx = (rx_df * wts).sum(1)
wtd_vol = (vol_df * wts).sum(1)
rx_vol = wtd_rx / wtd_vol
rate = rx_vol.truncate(after=date).tail(20).std()
return rate

rates = wts_df.apply(lambda x: rate_calc(x, x.name), axis=1)

这仍然很慢。此外,我需要为字典中包含的多个 wts_df 执行此操作,因此总操作需要很多时间。

rates = {key: val.apply(lambda x: rate_calc(x, x.name), axis=1) for key, val in wts_df_dict.iteritems()}

关于如何加快此类操作的任何想法?

最佳答案

您的问题属于“优化”类别,因此请允许我与您分享一些解决问题的建议。

首先,在速度方面,请始终使用 %timeit 以确保您通过新策略获得更好的结果。

其次,迭代数据的方法很少:

  1. with iterrows() -- 仅在数据样本较小时使用它(或者更好的是,尽量不要使用它,因为它太慢)。

  2. 使用 apply --iterrows 的更好替代方案并且效率更高,但当数据集很大时(如您的示例),它可能会出现延迟问题。

  3. Vectorizing -- 简而言之,您对整个列/数组执行操作,速度非常快。 获胜者!

因此,为了解决您的速度问题,您的策略应该采用向量化的形式。所以这是它应该如何工作的; (注意 .values):

df['new_column'] = my_function(df['column_1'].values, df['column_2'].values...) 您会注意到一个超快的结果。

关于pandas - 如何矢量化以加速 Dataframe apply pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64178763/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com