我有一个这样的DataFrame有成千上万的行:
A B
Date
2020-01-02 09:59:45 -0.007641 1
2020-01-02 10:20:11 0.000211 1
2020-01-02 10:30:27 -0.001294 0
2020-01-02 11:42:54 -0.003468 0
2020-01-02 12:03:22 -0.005559 1
我们的想法是,我想一列C
用的最后一个元素.cumprod()
的A + 1
系列,每次B == 1
在该行的日期起计。
所以在这里,例如,在第二行,因为B == 1
,我把A列从对应的日期,2020-01-02 10:20:11
与df.loc['2020-01-02 10:20:11':, 'A']
:
A
Date
2020-01-02 10:20:11 0.000211
2020-01-02 10:30:27 -0.001294
2020-01-02 11:42:54 -0.003468
2020-01-02 12:03:22 -0.005559
然后我加1
A
Date
2020-01-02 10:20:11 1.000211
2020-01-02 10:30:27 0.998706
2020-01-02 11:42:54 0.996532
2020-01-02 12:03:22 0.994441
我做的(df.loc['2020-01-02 10:20:11':, 'A']+1).cumprod()
,我们得到:
A
Date
2020-01-02 10:20:11 1.000211
2020-01-02 10:30:27 0.998916
2020-01-02 11:42:54 0.995452
2020-01-02 12:03:22 0.989919
然后,最后一个值0.989919
在我的初始DataFrame中将如下所示:
A B C
Date
2020-01-02 09:59:45 -0.007641 1 a_value
2020-01-02 10:20:11 0.000211 1 0.989919
2020-01-02 10:30:27 -0.001294 0 0
2020-01-02 11:42:54 -0.003468 0 0
2020-01-02 12:03:22 -0.005559 1 another_value
因此,我最近发现了向量化,并尝试将其应用到那里。我首先尝试了一下,看看是否可以获取column中每一行的日期C
:
def last_cumul(date):
return date
df['C'] = last_cumul(df.index)
有效
A B C
Date
2020-01-02 09:59:45 -0.007641 1 2020-01-02 09:59:45
2020-01-02 10:20:11 0.000211 1 2020-01-02 10:20:11
2020-01-02 10:30:27 -0.001294 0 2020-01-02 10:30:27
2020-01-02 11:42:54 -0.003468 0 2020-01-02 11:42:54
2020-01-02 12:03:22 -0.005559 1 2020-01-02 12:03:22
所以我决定这样做:
def last_cumul(date):
return (df.loc[date:, 'A']+1).cumprod()[-1]
df['C'] = last_cumul(df.index)
但是这次我有错误:
TypeError: Cannot convert input [DatetimeIndex(['2020-01-02 09:59:45', '2020-01-02 10:20:11',
'2020-01-02 10:30:27', '2020-01-02 11:42:54',
'2020-01-02 12:03:22'],
dtype='datetime64[ns]', name='Date', freq=None)] of type <class 'pandas.core.indexes.datetimes.DatetimeIndex'> to Timestamp
可以使用向量化来完成它,否则我将不得不遍历DataFrame吗?
谢谢 !
对于每个B = 1,将选择日期较大的行,并乘以A + 1。当我们使用cumprod时,行的顺序无关紧要,因为我们只选择cumprod的最后一个元素。考虑到这一点,我们可以看到较大日期所需的行包含在较小日期中。因此,为了节省计算量,我们应该找到较大日期的cumprod,然后再将其用于较小日期。通过对Date进行反向排序,然后将cumprod应用于A + 1,无需任何花哨的算法即可完成。
df.sort_values(by='Date',ascending=False, inplace=True)
df['C']=(df['A']+1).cumprod()*df['B']
df.sort_index(inplace=True)
这有两个目的:1>将计算复杂度从O(N2)降低到O(Nlog(N)),并且2>保持数据组织得更整齐以便进行矢量化
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句