AmirTrader's picture
Update app.py
b0ac0e1 verified
import pandas as pd
import os
import panel as pn
import hvplot as hv
pn.extension("bokeh", template="bootstrap")
import hvplot.pandas
from datetime import datetime
from datetime import date, timedelta
from DescriptionDict import DescriptionDict
# from dotenv import load_dotenv
# from datasets import load_dataset
from utils import load_hf_dataset # ,upload_to_hf_dataset, download_from_hf_dataset
# Load environment variables from .env file
# load_dotenv()
# Get the Hugging Face API token from the environment; either set in .env file or in the environment directly in GitHub
HF_TOKEN = os.getenv("HF_TOKEN")
# Get the name of the dataset for GuruFocus to read from
dataset_name_GuruFocus_input = os.getenv("dataset_name_GuruFocus_input")
@pn.cache()
def get_gurufocus(current_datetime):
# Load lastest GuruFocus DataSet from HuggingFace Dataset which is always GuruFocus_merged.csv
# daily_gurufocus_DF = load_dataset(dataset_name_GuruFocus_output , data_files="GuruFocus_merged.csv", split="train" , token=HF_TOKEN ).to_pandas()
return load_hf_dataset(
f"GuruFocus_merged_{current_datetime}.csv", HF_TOKEN, dataset_name_GuruFocus_input
)
todaydate = pn.widgets.DatePicker(
name="End Date", # value=datetime(2000, 1, 1),
value=date.today() - timedelta(days=1),
description="Select a Date",
end=date.today(), # date(2023, 9, 1)
)
todaydate_readcols = datetime.today().strftime("%Y-%m-%d")
df = get_gurufocus(todaydate_readcols)
selectedcol = pn.widgets.Select(
name="Select Ratio", value="PEG Ratio", options=list(df.columns)
)
selecteditem = pn.widgets.Select(
name="Select Item", value="Sector", options=["Industry", "Sector"]
)
selectedmethod = pn.widgets.Select(
name="Select Method", value="Mean", options=["Mean", "Min", "Max"]
)
ticker = pn.widgets.AutocompleteInput(
name="Ticker", options=list(df.Ticker), placeholder="Write Ticker here همین جا"
)
ticker.value = "AAPL"
selectedhover = "Ticker"
hv.extension("bokeh")
def create_plot(selectedcol, selecteditem, todaydate, selectedmethod, ticker):
df = get_gurufocus(todaydate)
if selectedmethod == "Mean":
group_them = df.groupby(selecteditem)[selectedcol].mean()
if selectedmethod == "Min":
group_them = df.groupby(selecteditem)[selectedcol].min()
if selectedmethod == "Max":
group_them = df.groupby(selecteditem)[selectedcol].max()
df2 = df.merge(
group_them,
left_on=selecteditem,
right_index=True,
suffixes=("", f"_{selecteditem}_{selectedmethod}"),
)
df3 = df.query("Ticker == @ticker")
return df2.hvplot.bar(
x=selecteditem,
y=f"{selectedcol}_{selecteditem}_{selectedmethod}",
hover_cols=selectedhover,
height=800,
width=1800,
).opts(xrotation=90, fontsize={"xticks": 10}).opts(show_grid=True) * df3.hvplot.bar(
x=selecteditem,
y=f"{selectedcol}",
hover_cols=selectedhover,
)
def create_alert(selectedcol):
text = f"### {selectedcol} \n {DescriptionDict[selectedcol]}"
return pn.pane.Alert(text, alert_type="warning")
bound_plot = pn.bind(
create_plot,
selectedcol=selectedcol,
selecteditem=selecteditem,
todaydate=todaydate,
selectedmethod=selectedmethod,
ticker=ticker,
)
bound_alert = pn.bind(create_alert, selectedcol=selectedcol)
pn.Column(
pn.Row(selectedcol, selecteditem, todaydate, selectedmethod, ticker),
bound_plot,
bound_alert,
).servable(title="Financial Sector Ratios Navigator")