| 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 utils import load_hf_dataset |
|
|
| |
| |
|
|
| |
| HF_TOKEN = os.getenv("HF_TOKEN") |
|
|
| |
| dataset_name_GuruFocus_input = os.getenv("dataset_name_GuruFocus_input") |
|
|
| @pn.cache() |
| def get_gurufocus(current_datetime): |
| |
| |
| return load_hf_dataset( |
| f"GuruFocus_merged_{current_datetime}.csv", HF_TOKEN, dataset_name_GuruFocus_input |
| ) |
|
|
| todaydate = pn.widgets.DatePicker( |
| name="End Date", |
| value=date.today() - timedelta(days=1), |
| description="Select a Date", |
| end=date.today(), |
| ) |
|
|
| 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") |
|
|