Вывод функции в цикл - PullRequest
       7

Вывод функции в цикл

0 голосов
/ 23 октября 2019

Я пытаюсь скопировать следующий код, который работает гладко, и добавить параметр для даты в функцию и запустить функцию с другой датой в цикле:

FUNCTION 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)

1 Ответ

0 голосов
/ 23 октября 2019

Расширяемый массив, который вы очищаете на каждой итерации цикла foor, может быть исправлен следующим образом:

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)]

Таким образом, нам нужно преобразовать список из объектов datetime в нечто, понятное API, мы можем сделать это следующим образом

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

И мы получим следующий вывод

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

Edit 2

Ошибка возникает, когда мы пытаемся вызвать join для чего-то, что не является списком, поэтому мы можем исправить это, выполнив

'time_start': start_dates

вместоделает

'time_start': ",".join(start_dates),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...