以 Python(Pythonic 方式)有效地拆分几何级数

split geometric progression efficiently in Python (Pythonic way)

我正在尝试实现一个涉及几何级数(拆分)的计算。有什么 effective/efficient 方法可以做到吗?数据集有数百万行。 我需要列“Traded_quantity”

Marker Action Traded_quantity
2019-11-05 09:25 0 0
09:35 2 BUY 3
09:45 0 0
09:55 1 BUY 4
10:05 0 0
10:15 3 BUY 56
10:24 6 BUY 8128

乌龟 = 2 (用户定义)

base_quantity = 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)

计算

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

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

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

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

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

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

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

每当有买入时,交易量将使用Traded_quantity次海龟的最后一批计算。

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

这应该有效

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