在Python中有效地分割几何级数(Pythonic方式)

Sud*_*osh 7 python math data-science

我正在尝试实现涉及几何级数(分割)的计算。有没有有效/高效的方法来做到这一点?该数据集有数百万行。我需要“Traded_quantity”列

标记 行动 交易数量
2019-11-05 09:25 0 0
09:35 2 3
09:45 0 0
09:55 1 4
10:05 0 0
10:15 3 56
10:24 6 8128

海龟 = 2(用户定义)

基本数量 = 1(用户定义)

    def turtle_split(row):
        if row['Action'] == 'BUY':
            return base_quantity * (turtle ** row['Marker'] - 1) // (turtle - 1)
        else:
            return 0
    df['Traded_quantity'] = df.apply(turtle_split, axis=1).round(0).astype(int)
Run Code Online (Sandbox Code Playgroud)

计算

对于第 0 行,Traded_quantity 应为零(因为标记为零)

对于第一行,Traded_quantity 应为 (1x1) + (1x2) = 3(标记 2 将分为 1 和 1,第一个 1 将与 base_quantity>>1x1 相乘,第二个 1 将与第一个 1 的结果相乘乘以turtle>>1x2),然后我们对这两个数字求和)

对于第二行,Traded_quantity 应为零(因为标记为零)

对于第 3 行,Traded_quantity 应为 (2x2) = 4(标记 1 将乘以第 1 行时间海龟的最后一次分割,即 2x2)

对于第四行,Traded_quantity 应为零(因为标记为零)

对于第 5 行,Traded_quantity 应为 (4x2)+(4x2x2)+(4x2x2x2) = 56(标记 3 将被拆分为 1,1 和 1,第一个 1 将与 row3 的最后一次拆分乘以turtle >> 4x2,第二个 1 将与第一个 1 的结果相乘(turtle>>8x2),第三个 1 将与第二个 1 的结果相乘(turtle>>16x2),然后我们将这三个数字相加)

对于第 6 行,Traded_quantity 应为 (32x2)+(32x2x2)+(32x2x2x2)+(32x2x2x2x2)+(32x2x2x2x2x2) = 8128

每当有买入时,交易数量将使用最后一批 Traded_quantity 乘以海龟来计算。

事实证明,当标记中没有零时,代码会生成正确的 Traded_quantity。一旦存在带有几个零的间隙,几何级数将无济于事,我将需要之前的图(来自缓存)来重新计算 Traded_q。尝试使用 lru_cache 进行递归,但没有成功。

小智 5

这应该有效

def turtle_split(row):
        global base_quantity
        if row['Action'] == 'BUY':
            summation = base_quantity * (turtle ** row['Marker'] - 1) // (turtle - 1)
            base_quantity = base_quantity * (turtle ** (row['Marker'] - 1))*turtle
            return summation
        else:
            return 0
Run Code Online (Sandbox Code Playgroud)