Сравнение переменного числа аргументов с циклом For - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь написать функцию, которой можно дать любое количество имен криптовалюты. Функция будет использовать аргументы для очистки данных с CoinMarketCap.com. Поскольку я хочу сравнить только близкое значение каждой криптовалюты (и только для сегодняшней даты), я определил дату дня как строку, которую я могу ввести в раздел даты URL-адреса в правильном формате.

Однако я дошел до точки, когда я не уверен, как правильно вернуть результаты. Мое намерение состоит в том, чтобы последняя «криптовалютная» переменная для l oop состояла из словаря, содержащего данные дня соответствующей криптовалюты. Затем, используя эту переменную, я хотел бы иметь возможность сравнивать значения любого количества криптовалют, которые я выбираю в качестве аргументов в моей функции. Как мне продолжить работу, чтобы это стало возможным? Я думал использовать Numpy, чтобы сравнивать данные с помощью массивов? Тем не менее, я открыт для лучших предложений, если они есть.

Заранее большое спасибо.

def compare_close(*cryptos):
    for crypto in cryptos:
        date = str(datetime.date.today())
        date = date.replace('-', '')
        url = f"https://coinmarketcap.com/currencies/{crypto}/historical-data/?start={date}&end={date}"
        response = requests.get(url, timeout=5)
        tree = lxml.html.fromstring(response.text)
        table = tree.find_class('cmc-table')[0]
        xpath_0, xpath_1 = 'div[3]/div/table/thead/tr', 'div[3]/div/table/tbody/tr/td[%d]/div'
        cols = [c.text_content() for c in table.xpath(xpath_0 + '/th')]
        dates = (d.text_content() for d in table.xpath(xpath_1 % 1))
        m = map(lambda d: (float(_.text_content().replace(',', '')) for _ in table.xpath(xpath_1 % d)),
                range(2, 8))
        crypto = [{k: v for k, v in zip(cols, _)} for _ in zip(dates, *m)]
        return crypto 

...