【发布时间】:2022-01-22 07:31:03
【问题描述】:
我正在尝试实现涉及几何级数(拆分)的计算。是否有任何有效/高效的方法来做到这一点。数据集有数百万行。 我需要“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 将乘以第 3 行的最后拆分乘以龟 > >4x2,第二个 1 将乘以第一个 1 的结果与海龟>>8x2),第三个 1 将乘以第二个 1 的结果与海龟>>16x2)然后我们将这三个数字相加)
对于第 6 行,Traded_quantity 应为 (32x2)+(32x2x2)+(32x2x2x2)+(32x2x2x2x2)+(32x2x2x2x2x2) = 8128
只要有买入,交易数量将使用 Traded_quantity 乘以 turtle 的最后一批计算。
事实证明,当 Marker 中没有零时,代码正在生成正确的 Traded_quantity。一旦有几个零几何级数的差距将无济于事,我将需要之前的图(来自缓存)重新计算 Traded_q。尝试使用 lru_cache 进行递归,没有用。
【问题讨论】:
-
“计算”我什么都不懂。这些数字从何而来?你怎么知道它们是正确的数字?底层逻辑是什么?
-
看来您确实有一道数学题,而不是编程题。提示:你能想出一个快速给出
2 + (2*2) + (2*2*2) + ...总和的规则吗?如果您尝试写出几个术语的结果,您是否注意到一种模式? (如果您将2添加到每个结果中,您会看到一种模式吗?) -
编辑了计算,尝试添加更多关于计算的细节
标签: python math data-science