Files
OpenBB/gamestonk_terminal/discovery/ark_model.py
2021-03-28 20:46:22 -07:00

104 lines
2.9 KiB
Python

""" ARK Model """
__docformat__ = "numpy"
from datetime import timedelta
import json
import requests
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from pandas.core.frame import DataFrame
import yfinance as yf
from gamestonk_terminal.helper_funcs import get_user_agent
def get_ark_orders() -> DataFrame:
"""Returns ARK orders in a Dataframe
Returns
-------
DataFrame
ARK orders data frame with the following columns:
ticker, date, shares, weight, fund, direction
"""
url_orders = "https://cathiesark.com/ark-funds-combined/trades"
raw_page = requests.get(url_orders, headers={"User-Agent": get_user_agent()}).text
parsed_script = BeautifulSoup(raw_page, "lxml").find(
"script", {"id": "__NEXT_DATA__"}
)
parsed_json = json.loads(parsed_script.string)
df_orders = pd.json_normalize(parsed_json["props"]["pageProps"]["arkTrades"])
if df_orders.empty:
return pd.DataFrame()
df_orders.drop(
[
"everything",
"everything.profile.customThumbnail",
"hidden",
"images.thumbnail",
],
axis=1,
inplace=True,
)
df_orders["date"] = pd.to_datetime(df_orders["date"], format="%Y-%m-%dZ").dt.date
return df_orders
def add_order_total(df_orders: DataFrame) -> DataFrame:
"""Takes an ARK orders dataframe and pulls data from Yahoo Finance to add
volume, open, close, high, low, and total columns
Parameters
----------
df_orders : DataFrame
ARK orders data frame with the following columns:
ticker, date, shares, weight, fund, direction
Returns
-------
DataFrame
ARK orders data frame with the following columns:
ticker, date, shares, volume, open, close, high, low, total, weight, fund, direction
"""
start_date = df_orders["date"].iloc[-1] - timedelta(days=1)
tickers = " ".join(df_orders["ticker"].unique())
print("")
prices = yf.download(tickers, start=start_date, progress=False)
for i, candle in enumerate(["Volume", "Open", "Close", "High", "Low", "Total"]):
df_orders.insert(i + 3, candle.lower(), 0)
for i, _ in df_orders.iterrows():
if np.isnan(
prices["Open"][df_orders.loc[i, "ticker"]][
df_orders.loc[i, "date"].strftime("%Y-%m-%d")
]
):
for candle in ["Volume", "Open", "Close", "High", "Low", "Total"]:
df_orders.loc[i, candle.lower()] = 0
continue
for candle in ["Volume", "Open", "Close", "High", "Low"]:
df_orders.loc[i, candle.lower()] = prices[candle][
df_orders.loc[i, "ticker"]
][df_orders.loc[i, "date"].strftime("%Y-%m-%d")]
df_orders.loc[i, "total"] = (
df_orders.loc[i, "close"] * df_orders.loc[i, "shares"]
)
return df_orders