import pandas as pd import numpy as np import os import io from datetime import datetime from datetime import timedelta import hvplot as hv import holoviews as hvs import panel as pn import hvplot.pandas import yfinance as yf from datasets import load_dataset pn.extension('bokeh', template='bootstrap') def _extract_raw_data(ticker): df = yf.Ticker(ticker) return df.history(period="6mo", interval="1d").reset_index() def _transform_data(raw_data: pd.DataFrame): data = raw_data[["Date", "Open", "High", "Low", "Close", "Volume"]].copy(deep=True).rename(columns={ "Date": "time", "Open": "open", "High": "high", "Low": "low", "Close": "close", "Volume": "volume", }) t_delta = timedelta(hours=1) data['time_start'] = data.time - 9*t_delta # rectangles start data['time_end'] = data.time + 9*t_delta # rectangles end data['positive'] = ((data.close - data.open)>0).astype(int) return data def make_candle_stick(ticker): raw_data = _extract_raw_data(ticker = ticker) data = _transform_data(raw_data=raw_data) _delta = np.median(np.diff(data.time)) candlestick = hvs.Segments(data, kdims=['time', 'low', 'time', 'high']) * hvs.Rectangles(data, kdims=['time_start','open', 'time_end', 'close'], vdims=['positive']) candlestick = candlestick.redim.label(Low='Values') candlechart = pn.Column(candlestick.opts(hvs.opts.Rectangles(color='positive', cmap=['red', 'green'], responsive=True), hvs.opts.Segments(color='black', height=400, responsive=True , show_grid=True)) , data.hvplot(x="time", y="volume", kind="line", responsive=True, height=200).opts( show_grid=True) ) # data.hvplot(y="volume", kind="bar", responsive=True, height=200) ) return candlechart # Function to convert DataFrame to CSV def get_csv(df): sio = io.StringIO() df.to_csv(sio, index=False) sio.seek(0) return sio # Function to convert the 'Ticker' column to a comma-separated string in a text file def get_text(df): tickers = df['Ticker'].tolist() tickers_str = ','.join(tickers) sio = io.StringIO() sio.write(tickers_str) sio.seek(0) return sio dataset = load_dataset('AmirTrader/optioncharts.io', data_files='DFtickerTotal.csv') df = dataset['train'].to_pandas() #widget ticker = pn.widgets.AutocompleteInput(name='Ticker', options=list(df.Ticker) , placeholder='Write Ticker here همین جا',value='ALL', restrict=False) Industry = pn.widgets.CheckBoxGroup( name='Select Industry', value=list(set(df.Industry)), options=list(set(df.Industry)), inline=True) Sector = pn.widgets.CheckBoxGroup( name='Select Sector', value=list(set(df.Sector)), options=list(set(df.Sector)), inline=False) MarketCap = pn.widgets.FloatSlider(name='Market Capital (B$)', start=0, end=4000, step=1, value=1) def get_DF(DF,ticker, Sector,MarketCap): if ticker and ticker!="ALL": table1 = pn.widgets.Tabulator(DF.query("Ticker == @ticker"), height=200, widths=200, show_index=False) chart1 = make_candle_stick(ticker) return pn.Column(table1,chart1) else: # return pn.widgets.Tabulator( DF.query(" Sector in @Sector & MarketCap>@MarketCap"), height=800, widths=200, show_index=False) return pn.widgets.Tabulator( DF, height=800, widths=200, show_index=False) pn.extension('tabulator') bound_plot = pn.bind(get_DF, DF=df,ticker=ticker, Sector=Sector ,MarketCap=MarketCap) pn.Column(pn.Row(pn.Column(ticker, MarketCap, Sector),bound_plot)).servable(title="Option Volatility View")