ShivamMore's picture
commit name
12f4bef
# Library imports
import datetime
import requests_cache
import matplotlib.pyplot as plt
from pandas_datareader import data as wb
import yfinance as yf
class Ticker:
"""Class for fetcing data from yahoo finance."""
@staticmethod
def get_historical_data(ticker, start_date = None, end_date = None, cache_data = True, cache_days = 1):
"""
Fetches stock data from yahoo finance. Request is by default cashed in sqlite db for 1 day.
Params:
ticker: ticker symbol
start_date: start date for getting historical data
end_date: end date for getting historical data
cache_date: flag for caching fetched data into sqlite db
cache_days: number of days data will stay in cache
"""
try:
# initializing sqlite for caching yahoo finance requests
expire_after = datetime.timedelta(days = 1)
session = requests_cache.CachedSession(cache_name = 'cache', backend = 'sqlite', expire_after = expire_after)
# Adding headers to session
session.headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0',
'Accept': 'application/json;charset=utf-8'
}
if(start_date is not None and end_date is not None):
data = yf.download(ticker, start = start_date, end = end_date)
else:
data = yf.download(ticker)
if data is None:
return None
return data
except Exception as e:
print(e)
return None
@staticmethod
def get_columns(data):
"""
Gets dataframe columns from previously fetched stock data.
Params:
data: dataframe representing fetched data
"""
if data is None:
return None
return [column for column in data.columns]
@staticmethod
def get_last_price(data, column_name):
"""
Returns last available price for specified column from already fetched data.
Params:
data: dataframe representing fetched data
column_name: name of the column in dataframe
"""
if data is None or column_name is None:
return None
if column_name not in Ticker.get_columns(data):
return None
return data[column_name].iloc[len(data) - 1]
@staticmethod
def plot_data(data, ticker, column_name):
"""
Plots specified column values from dataframe.
Params:
data: dataframe representing fetched data
column_name: name of the column in dataframe
"""
try:
if data is None:
return
data[column_name].plot()
plt.ylabel(f'{column_name}')
plt.xlabel('Date')
plt.title(f'Historical data for {ticker} - {column_name}')
plt.legend(loc = 'best')
plt.show()
except Exception as e:
print(e)
return