如何使用CoinGecko API拉取数据,在while循环中更新DataFrame计算交易量均值
代码调整方案
你需要调整变量初始化位置、合并逻辑,完整可运行代码如下:
import CoinGeckoAPI import pandas as pd import time cg = CoinGeckoAPI() coin_list = [code['id'] for code in cg.get_coins_list()] # 外层初始化累计DataFrame和迭代次数,全局复用 df_accum = pd.DataFrame() iter_count = 0 while True: counter = 0 def_dict = {} # 分批拉取所有币种数据 while counter < len(coin_list): temp_dict = cg.get_price( ids=coin_list[counter:counter+500], vs_currencies='usd', include_market_cap=True, include_last_updated_at=True, include_24hr_change=True, include_24hr_vol=True ) def_dict.update(temp_dict) counter += 500 # 所有批次拉取完成后再处理DataFrame df_temp = pd.DataFrame.from_dict(def_dict).T # 保留市值前3000币种 df_temp = df_temp.sort_values(by=['usd_market_cap'], ascending=False)[:3000] if iter_count == 0: # 首次迭代直接初始化累计数据 df_accum = df_temp.copy() df_accum['iterations'] = 1 df_accum['average_vol'] = df_accum['usd_24h_vol'] else: # 非首次迭代,利用索引自动对齐合并新旧数据 # 对齐新旧币种索引,新增币种自动补全 df_accum = df_accum.reindex(df_accum.index.union(df_temp.index)) # 更新价格、市值、涨跌幅为最新值 df_accum.update(df_temp[['usd', 'usd_market_cap', 'usd_24h_change', 'usd_24h_vol', 'last_updated_at']]) # 累计24小时交易量,缺失值补0 df_accum['usd_24h_vol'] = df_accum['usd_24h_vol'].add(df_temp['usd_24h_vol'], fill_value=0) # 迭代次数累加,新增币种初始次数为1 df_accum['iterations'] = df_accum['iterations'].add(pd.Series(1, index=df_temp.index), fill_value=1) # 计算累计平均交易量 df_accum['average_vol'] = df_accum['usd_24h_vol'] / df_accum['iterations'] iter_count += 1 # 每小时拉取一次修改为3600,当前60为1分钟测试间隔 time.sleep(3600)
核心逻辑说明
你提出的两个问题解决方式如下:
- 新旧DataFrame对比:直接利用pandas的索引对齐特性,以币种id为索引自动匹配相同币种,不需要手动写比对逻辑,新进入前3000的币种会自动加入统计,旧币种如果掉出前3000会保留历史累计数据,不需要的话可以在排序步骤过滤
- 下一轮迭代数据准备:全局的
df_accum变量会存储所有累计数据,每次迭代结束后自动保留最新状态,下一轮循环直接复用即可
内容的提问来源于stack exchange,提问作者Agustin Gonzalez Ribas
相关产品推荐
相关产品推荐

