【问题标题】:Error message when appending data to pandas dataframe将数据附加到熊猫数据框时出现错误消息
【发布时间】:2020-02-01 01:06:09
【问题描述】:

谁能帮帮我:

我创建了一个循环来附加来自 Coinbase 的历史价格数据的连续间隔。

我的循环成功迭代了几次然后崩溃。

错误信息(在 data_temp 代码行下):

“ValueError:如果使用所有标量值,则必须传递一个索引”

days = 10
end = datetime.now().replace(microsecond=0)
start = end - timedelta(days=days)
data_price = pd.DataFrame()

for i in range(1,50):
    print(start)
    print(end)
    data_temp = pd.DataFrame(public_client.get_product_historic_rates(product_id='BTC-USD', granularity=3600, start=start, end=end))
    data_price = data_price.append(data_temp)
    end = start
    start = end - timedelta(days=days)

很想知道如何解决这个问题以及为什么会发生这种情况。

谢谢!

这是完整的跟踪:

Traceback(最近一次调用最后一次): 文件“\coinbase_bot.py”,第 46 行,在 data_temp = pd.DataFrame(public_client.get_product_historic_rates(product_id='BTC-USD', 粒度=3600, start=start, end=end)) init 中的文件“D:\Program Files\Python37\lib\site-packages\pandas\core\frame.py”,第 411 行 mgr = init_dict(数据、索引、列、dtype=dtype) 文件“D:\Program Files\Python37\lib\site-packages\pandas\core\internals\construction.py”,第 257 行,在 init_dict return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype) 文件“D:\Program Files\Python37\lib\site-packages\pandas\core\internals\construction.py”,第 77 行,位于 arrays_to_mgr index = extract_index(数组) 文件“D:\Program Files\Python37\lib\site-packages\pandas\core\internals\construction.py”,第 358 行,在 extract_index raise ValueError("如果使用所有标量值,则必须传递一个索引") ValueError: 如果使用所有标量值,则必须传递索引

这是通过简单的 url 调用返回的 json:

[[1454716800,370.05,384.54,384.44,375.44,6276.66473729],[1454630400,382.99,389.36,387.99,384.5,7443.92933224],[1454544000,368.74,390.63,368.87,387.99,8887.7572324],[1454457600,365.63 ,373.01,372.93,368.87,7147.95657328],[1454371200,371.17,374.41,371.33,372.93,6856.21815799],[1454284800,366.26,379,367.89,371.33,7931.22922922],[1454198400,365,382.5,378.46,367.95,5506.77681302]]

与此用户的问题非常相似,但无法解决: When attempting to merge multiple dataframes, how to resolve "ValueError: If using all scalar values, you must pass an index"

【问题讨论】:

  • 您好,请添加一些示例数据和该错误的完整跟踪
  • 使用从 url 调用获得的完整错误跟踪和示例 json 数据更新了帖子。我正在使用一个包装 url 调用的 python 库。

标签: python-3.x pandas dataframe append


【解决方案1】:

-- 嗨 DashOfProgramming,

您的问题是 data_temp 仅使用单行进行初始化,而 pandas 要求您为其提供索引。

下面的 sn-p 应该可以解决这个问题。我用一个简单的字典替换了您的 API 调用,该字典类似于我期望 API 返回的内容,并使用 i 作为数据帧的索引(这具有您可以跟踪的优点):

import pandas as pd
from datetime import datetime, timedelta

days = 10
end = datetime.now().replace(microsecond=0)
start = end - timedelta(days=days)
data_price = pd.DataFrame()

temp_dict = {'start': '2019-09-30', 'end': '2019-10-01', 'price': '-111.0928', 
'currency': 'USD'}

for i in range(1,50):
  print(start)
  print(end)
  data_temp = pd.DataFrame(temp_dict, index=[i])
  data_price = data_price.append(data_temp)
  end = start
  start = end - timedelta(days=days)

print(data_price)

编辑

刚刚看到您的 API 输出是一个嵌套列表。 pd.DataFrame() 认为列表只有一行,因为它是嵌套的。我建议您将列存储在单独的变量中,然后执行以下操作:

cols = ['ts', 'low', 'high', 'open', 'close', 'sth_else']

v = [[...], [...], [...]] # your list of lists

data_temp = pd.DataFrame.from_records(v, columns=cols)

【讨论】:

  • 这一切让我感到困惑的是,如果我在开始 for 循环时使用 5 而不是 50 的范围,一切都很好;我得到具有预期行数和列数的熊猫框架。我会尝试您的 EDITED 解决方案并尽快报告。谢谢。
  • 好的,我只是注意到我稍后会检索空数据帧......这很可能是导致所有这些问题的原因
  • 只需添加一个额外的检查 if len(values) > 0 add dataframe else continue
  • 感谢乔的帮助。我调用 API 太快了。在每个循环之间添加了一秒钟的睡眠时间并解决了问题。
  • @DashOfProgramming 没问题!实际上我自己也可以想到这一点……以前建造过类似的东西。尽管带有 PUSH API 和 asyncio 侦听器。祝你好运!
猜你喜欢
  • 2019-03-06
  • 2019-01-14
  • 2018-02-08
  • 2017-06-13
  • 2014-01-03
  • 1970-01-01
  • 2023-02-01
  • 2021-09-24
  • 2022-11-25
相关资源
最近更新 更多