遍历列表计算相邻两日收盘价差值出现随机计算错误求助
问题原因排查
- 初始值设置错误:当前代码将初始前值设为0,导致第一条数据的差值为
0 - 第一个交易日收盘价,不符合业务逻辑(首个交易日不存在前一日收盘价,无有效差值) - 变量逻辑冗余:使用长度为1的列表存储前值完全没有必要,操作不当还容易引发索引错误、变量污染等潜在问题
- 浮点数精度属于正常表现:输出中出现的科学计数法差值是Python双精度浮点数计算的正常现象,可通过格式化输出调整展示效果,不属于计算错误。
原生Python修复方案
逻辑更清晰,没有冗余操作,完全匹配你要求的「前一日收盘价减后一日收盘价」规则:
price_data = cg.get_coin_market_chart_by_id(user_crypto_answer,vs_currency=user_fiat_answer,days="max")["prices"] # 提取收盘价列表 pd_prices = [i[1] for i in price_data] differences = [] # 从第二个交易日开始遍历,对应第一个有效差值 for idx in range(1, len(pd_prices)): prev_close = float(pd_prices[idx-1]) curr_close = float(pd_prices[idx]) curr_diff = prev_close - curr_close differences.append(curr_diff) # 按需打印结果,和你给出的输出格式对齐 print(curr_diff, curr_close, pd_prices[idx])
更优Pandas实现方案
如果可以引入Pandas库,仅需数行代码即可完成计算,自带数据对齐、精度处理能力,适合处理时间序列类的金融数据:
import pandas as pd price_data = cg.get_coin_market_chart_by_id(user_crypto_answer,vs_currency=user_fiat_answer,days="max")["prices"] # 转换为DataFrame并处理日期格式 df = pd.DataFrame(price_data, columns=["timestamp", "close_price"]) df["date"] = pd.to_datetime(df["timestamp"], unit="ms").dt.date # 直接计算差值:pandas的diff方法默认是当前值减前值,取反即可得到前值减当前值的结果 df["difference"] = -df["close_price"].diff() # 输出时去掉第一条无有效差值的记录即可 print(df[["date", "close_price", "difference"]].dropna().head(40))
结果验证
用你给出的样例数据验证逻辑正确性:
2017-10-18收盘价:0.033458707800705645
2017-10-19收盘价:0.03348667581587972
计算差值:0.033458707800705645 - 0.03348667581587972 = -2.79680151740735e-05,和你给出的样例正确结果完全匹配。
内容的提问来源于stack exchange,提问作者ZoidEEE
相关产品推荐
相关产品推荐

