Python: Вычисление VWAP по дате

#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. Спасибо!!! Вот и все!