#python
Вопрос:
Я пытаюсь добавить в этот код функцию, которая вычисляла бы vwap по дате, но она не работает:
def get_ohlc (pair, interval=1, since='last'): endpoint = 'https://api.kraken.com/0/public/OHLC' payLoad = { 'pair': pair, 'interval': interval, 'since' : since } response = requests.get(endpoint, payLoad) data = response.json() OHLC = data['result'][pair] data = pd.DataFrame.from_records(OHLC, columns=['Time', 'Open', 'High', 'Low', 'Close', 'vwap', 'volume', 'count']) data['Time'] = pd.to_datetime(data['Time'], unit='s') data['Date'] = data['Time'].dt.date data.set_index('Time',inplace=True) data = data.drop(['vwap', 'count'], axis=1) data['Open'] = data.Open.astype(float) data['High'] = data.High.astype(float) data['Low'] = data.Low.astype(float) data['Close'] = data.Close.astype(float) data['volume'] = data.volume.astype(float) data['Vwap'] = data.groupby('Date', group_keys=False).apply(Vwap) return data def Vwap(data): H = data.High L = data.Low C = data.Close V = data.volume return data.assign(Vwap = (V * ((H L C)/3)).cumsum() / V.cumsum())
Я получаю следующую ошибку:
ValueError: Wrong number of items passed 7, placement implies 1
Ответ №1:
На мой взгляд, вы смешиваете «обязанности» в своем коде:
Vwap
функция должна заботиться только оcalculation
бите- вы можете создать
vwap
столбец вget_ohlc
функции (кстати: на мой взгляд, это делает слишком много вещей — возможно, я бы разделил загрузку от манипулирования данными).
В любом случае, вот как я бы написал быстрое решение вашей проблемы:
import requests import pandas as pd def get_ohlc (pair, interval=1, since='last'): endpoint = 'https://api.kraken.com/0/public/OHLC' payLoad = { 'pair': pair, 'interval': interval, 'since' : since } response = requests.get(endpoint, payLoad) data = response.json() OHLC = data['result'][pair] data = pd.DataFrame.from_records(OHLC, columns=['Time', 'Open', 'High', 'Low', 'Close', 'vwap', 'volume', 'count']) data['Time'] = pd.to_datetime(data['Time'], unit='s') data['Date'] = data['Time'].dt.date data.set_index('Time',inplace=True) data = data.drop(['vwap', 'count'], axis=1) data['Open'] = data.Open.astype(float) data['High'] = data.High.astype(float) data['Low'] = data.Low.astype(float) data['Close'] = data.Close.astype(float) data['volume'] = data.volume.astype(float) data = data.assign(vwap = data.groupby('Date', group_keys=False).apply(vwap_func)) return data def vwap_func(data): H = data["High"] L = data["Low"] C = data["Close"] V = data["volume"] res = (V * (H L C) / 3).cumsum() / V.cumsum() return res.to_frame() data = get_ohlc(pair="XXBTZUSD") print(data)
Как вы можете видеть, нет необходимости вызывать vwap_func
в конце, учитывая, что он уже применяется в вашей get_ohlc
функции
Комментарии:
1. Спасибо, я только что попробовал ваше исправление, но теперь я получаю «Неверное количество переданных предметов 720, размещение подразумевает 1».
2. @GusC извините, что исправил сейчас!
3. Спасибо!!! Вот и все!