【问题标题】:Function output into loop函数输出到循环
【发布时间】:2019-10-23 07:09:22
【问题描述】:

我正在尝试复制以下运行顺利的代码,并将日期参数添加到函数中,并在循环中以不同的日期运行函数:

功能 V1:

def getOHLCV(currencies):
    c_price = []
    data = {}
    try:
        url = 'https://pro-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical'
        parameters = {
          'symbol': ",".join(currencies),
          #'time_start': ",".join(start_dates),
          'count':'91',
          'interval':'daily',
          'convert':'JPY',
        }
        headers = {
         'Accepts': 'application/json',
          'X-CMC_PRO_API_KEY': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
        }
        session = Session()
        session.headers.update(headers)
        response = session.get(url, params=parameters)
        data = json.loads(response.text)
        for currency in  data['data']:
            used_list = [
                item['quote']['JPY']
                for item in data['data'][currency]['quotes']
            ]
            price = pd.DataFrame.from_records(used_list)
            price['timestamp'] = pd.to_datetime(price['timestamp'])
            price['timestamp'] = price['timestamp'].astype(str).str[:-15]
            price_c = price.set_index('timestamp').close
            c_price.append(price_c.rename(currency))
    except Exception as e:
        print (data)
    return c_price

c_price = []
c_price.extend(getOHLCV(available[:61]))
c_price.extend(getOHLCV(available[61:]))
c_price = pd.concat(c_price, axis=1, sort=True)
pd.set_option('display.max_columns', 200)
c_price = c_price.transpose()
c_price.index.name = 'currency'
c_price.sort_index(axis=0, ascending=True, inplace=True)

输出:

         2019-07-25   2019-07-26   2019-07-27   2019-07-28   2019-07-29  \
currency                                                                    
1WO          2.604104     2.502526     2.392313     2.418967     2.517868   
ABX          1.015568     0.957774     0.913224     0.922612     1.037273   
ADH          0.244782     0.282976     0.309931     0.287933     0.309613   
...               ...          ...          ...          ...          ...   
XTX          0.156103     0.156009     0.156009     0.165103     0.156498   
ZCO          0.685255     0.661324     0.703521     0.654763     0.616204   
ZPR          0.214395     0.204968     0.181529     0.178460     0.177596   

功能 V2:

V2 函数添加一个参数start_dates 并使用这个新参数循环该函数。问题是我从中得到了一个空的数据框。我认为日期有问题,但我不知道在哪里。任何帮助表示赞赏。

def getOHLCV(currencies, start_dates):
    ...
          'symbol': ",".join(currencies),
          'time_start': ",".join(start_dates),
          ...

date_list = [(date.today() - timedelta(days= x * 91)) for x in range(3)][1:]
one = []
for i in date_list:
  c_price = []
  c_price.extend(getOHLCV(available[:61], i))
  c_price.extend(getOHLCV(available[61:], i))
c_price = pd.concat(c_price, axis=1, sort=True)
one = pd.concat(c_price, axis=1, sort=True)
pd.set_option('display.max_columns', 200)

【问题讨论】:

    标签: python pandas function loops


    【解决方案1】:

    您正在扩展的数组在 foo 循环的每次迭代中都被清除,它可以像这样固定

    date_list = [(date.today() - timedelta(days= x * 91)) for x in range(3)][1:]
    one = []
    
    c_price = []
    
    for i in date_list:
      c_price.extend(getOHLCV(available[:61], i))
      c_price.extend(getOHLCV(available[61:], i))
    c_price = pd.concat(c_price, axis=1, sort=True)
    one = pd.concat(c_price, axis=1, sort=True)
    pd.set_option('display.max_columns', 200)
    

    希望对你有用

    编辑 1

    所以我们需要修复错误:"time_start" must be a valid ISO 8601 timestamp or unix time value'

    这是因为从这里返回

     date_list = [(date.today() - timedelta(days= x * 91)) for x in range(3)][1:]
    

    这是

    [datetime.date(2019, 7, 24), datetime.date(2019, 4, 24)]
    

    所以我们需要将列表从日期时间对象转换为API可以理解的东西,我们可以通过以下方式进行

    date_list = list(map(date.isoformat, date_list))
    

    我们得到以下输出

    ['2019-07-24', '2019-04-24']
    

    编辑 2

    当我们尝试在不是列表的东西上调用 join 时会发生错误,因此我们可以通过这样做来修复它

    'time_start': start_dates
    

    而不是做

    'time_start': ",".join(start_dates),
    

    【讨论】:

    • Traceback (most recent call last): File "inv_pos_aggregate.py", line 334, in <module> c_price = pd.concat(c_price, axis=1, sort=True) File "/Users/delalma/Library/Python/3.7/lib/python/site-packages/pandas/core/reshape/concat.py", line 255, in concat sort=sort, File "/Users/delalma/Library/Python/3.7/lib/python/site-packages/pandas/core/reshape/concat.py", line 304, in __init__ raise ValueError("No objects to concatenate") ValueError: No objects to concatenate
    • 我可以让你为循环的每次迭代打印 c_price 的内容吗?
    • {} {} [] {} {} []
    • 因此该函数不会返回任何内容,因为您只更改了 API 的参数,因此它似乎没有返回正确的内容。你在函数调用中从 API 得到正确的响应吗?
    • 我认为您将 date_list 中的单个日期解析到函数然后运行 ​​",".join 在该单个值上存在错误。尝试像这样写'time_start':start_dates
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多