You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pandas计算首次资金存入至全部取出的时间间隔

问题解决:计算NFT代币的资金存取周期时长

需求与问题背景

我有一个DataFrame,其中LIQUIDITY_adj字段为正值代表资金存入,负值代表资金取出。需要实现:

  • 按NF_TOKEN_ID分组,计算每组内首次资金存入到全部资金取出的时间间隔(单位:小时)
  • 仅在LIQUIDITY_cumsum为0的行保留计算出的DURATION_HR值

原尝试代码:

lp_shortterm['DURATION_HR'] = lp_shortterm.groupby('NF_TOKEN_ID')['BLOCK_TIMESTAMP'].diff().dt.total_seconds() / 3600

存在的问题:

  • 对于NF_TOKEN_ID=41,出现了两个DURATION_HR值,但实际只需要首次存入(2021-05-05 02:10:21+00:00)到最终取出(2021-05-05 02:30:25+00:00)的差值
  • 对于NF_TOKEN_ID=157(有两次完整存取操作),应该保留两个时长值,但原代码无法正确区分周期

解决思路

核心是识别每个NF_TOKEN_ID下的独立存取周期:每个周期从首次存入开始,到累计资金归零(LIQUIDITY_cumsum=0)结束。具体步骤:

  1. 确保数据按NF_TOKEN_ID和BLOCK_TIMESTAMP排序,保证时序正确
  2. 计算每个NF_TOKEN_ID内的累计资金LIQUIDITY_cumsum
  3. 为每个NF_TOKEN_ID标记存取周期:当累计资金从0变为正,开启新周期;累计资金归0时周期结束
  4. 按NF_TOKEN_ID和周期分组,计算每个周期的结束时间与开始时间的差值,仅在周期结束行填充时长值

代码实现

# 1. 按代币ID和时间排序,确保操作时序正确
lp_shortterm = lp_shortterm.sort_values(['NF_TOKEN_ID', 'BLOCK_TIMESTAMP'])

# 2. 计算每个代币的累计资金变动(若未提前计算)
lp_shortterm['LIQUIDITY_cumsum'] = lp_shortterm.groupby('NF_TOKEN_ID')['LIQUIDITY_adj'].cumsum()

# 3. 标记每个独立的存取周期
# 当累计资金从0变为正(即新的存入操作开启),则周期ID加1
lp_shortterm['cycle_id'] = (
    lp_shortterm.groupby('NF_TOKEN_ID')
    .apply(lambda x: (x['LIQUIDITY_cumsum'].shift(1) == 0) & (x['LIQUIDITY_adj'] > 0))
    .reset_index(level=0, drop=True)
    .cumsum()
)

# 4. 计算每个周期的时长,仅在累计资金归零的行赋值
def fill_duration(group):
    # 获取周期内首次存入时间和周期结束时间(累计归0的时间)
    start_time = group[group['LIQUIDITY_adj'] > 0]['BLOCK_TIMESTAMP'].iloc[0]
    end_time = group[group['LIQUIDITY_cumsum'] == 0]['BLOCK_TIMESTAMP'].iloc[-1]
    duration_hr = (end_time - start_time).total_seconds() / 3600
    
    # 初始化DURATION_HR为None,仅在结束行赋值
    group['DURATION_HR'] = None
    group.loc[group['LIQUIDITY_cumsum'] == 0, 'DURATION_HR'] = duration_hr
    return group

# 按代币ID和周期分组处理
lp_shortterm = lp_shortterm.groupby(['NF_TOKEN_ID', 'cycle_id']).apply(fill_duration).reset_index(drop=True)

代码说明

  • 排序:保证每个代币的操作按时间顺序处理,避免因乱序导致的周期标记错误
  • 周期标记:通过判断累计资金从0转为正值的节点,准确划分多次存取的独立周期,解决一个代币多轮操作的场景
  • 时长计算:每个周期内取首次存入时间和周期结束(累计归0)的时间差,仅在结束行填充值,其余行留空,完全匹配需求

内容的提问来源于stack exchange,提问作者Olive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:03:17