Arrechenash commited on
Commit
816b723
·
1 Parent(s): 7666743

Support filtering by date range

Browse files
Files changed (3) hide show
  1. src/datasource.py +7 -0
  2. src/main.py +24 -20
  3. src/pages/chart.py +7 -3
src/datasource.py CHANGED
@@ -23,6 +23,13 @@ if not ALPACA_API_KEY or not ALPACA_SECRET_KEY:
23
  requests_cache.install_cache("alpaca_api_cache", expire_after=120)
24
 
25
 
 
 
 
 
 
 
 
26
  @st.cache_data
27
  def load_symbols(dataset):
28
  return (
 
23
  requests_cache.install_cache("alpaca_api_cache", expire_after=120)
24
 
25
 
26
+ def get_dataset_path(dataset_name="alpaca"):
27
+ if os.getenv("APP_ENV") == "development":
28
+ return f"{dataset_name}.parquet"
29
+ else:
30
+ return f"hf://datasets/Arrechenash/stocks/{dataset_name}.parquet"
31
+
32
+
33
  @st.cache_data
34
  def load_symbols(dataset):
35
  return (
src/main.py CHANGED
@@ -1,16 +1,9 @@
1
  import os
 
2
 
3
  import streamlit as st
4
 
5
- from datasource import get_data, load_symbols
6
-
7
-
8
- def get_dataset_path(dataset_name):
9
- if os.getenv("APP_ENV") == "development":
10
- return f"{dataset_name}.parquet"
11
- else:
12
- return f"hf://datasets/Arrechenash/stocks/{dataset_name}.parquet"
13
-
14
 
15
  st.set_page_config(layout="wide")
16
 
@@ -40,19 +33,26 @@ with st.sidebar:
40
  get_dataset_path("yahoo"),
41
  ),
42
  )
43
- st.session_state.date = st.date_input("Date", value=None)
 
 
 
 
 
 
 
 
 
 
 
44
  st.session_state.symbols = st.multiselect(
45
  "Symbols", load_symbols(st.session_state.dataset)
46
  )
47
  st.session_state.min_open = st.number_input(
48
  "Min open", value=st.session_state.min_open
49
  )
50
- st.session_state.min_gap = st.number_input(
51
- "Min gap %", value=st.session_state.min_gap
52
- )
53
- st.session_state.min_run = st.number_input(
54
- "Min run %", value=st.session_state.min_run
55
- )
56
  st.session_state.min_vol = st.number_input(
57
  "Min volume", value=st.session_state.min_vol
58
  )
@@ -60,12 +60,16 @@ with st.sidebar:
60
  "Min rel volume", value=st.session_state.min_relvol
61
  )
62
 
63
- results_placeholder = st.empty()
64
 
65
  f = st.session_state
66
  filters = []
67
- if f.date:
68
- filters.append(f"date = '{f.date.strftime('%Y-%m-%d')}'")
 
 
 
 
69
  if f.symbols:
70
  filters.append(f"symbol IN {tuple(f.symbols)}")
71
  if f.min_open:
@@ -86,7 +90,7 @@ with results_placeholder:
86
  st.markdown(f"**Results: {len(df)}**")
87
 
88
  if df.empty:
89
- st.info("No data found with current filters")
90
  else:
91
  numeric_cols = df.select_dtypes("number").columns.tolist()
92
 
 
1
  import os
2
+ from datetime import date
3
 
4
  import streamlit as st
5
 
6
+ from datasource import get_data, get_dataset_path, load_symbols
 
 
 
 
 
 
 
 
7
 
8
  st.set_page_config(layout="wide")
9
 
 
33
  get_dataset_path("yahoo"),
34
  ),
35
  )
36
+
37
+ use_date_filter = st.checkbox("Filter by date range", value=False)
38
+ if use_date_filter:
39
+ start_default = date.today().replace(day=1)
40
+ end_default = date.today()
41
+ st.session_state.date = st.date_input(
42
+ "Date range",
43
+ value=(start_default, end_default),
44
+ )
45
+ else:
46
+ st.session_state.date = None
47
+
48
  st.session_state.symbols = st.multiselect(
49
  "Symbols", load_symbols(st.session_state.dataset)
50
  )
51
  st.session_state.min_open = st.number_input(
52
  "Min open", value=st.session_state.min_open
53
  )
54
+ st.session_state.min_gap = st.number_input("Min gap %", value=None)
55
+ st.session_state.min_run = st.number_input("Min run %", value=None)
 
 
 
 
56
  st.session_state.min_vol = st.number_input(
57
  "Min volume", value=st.session_state.min_vol
58
  )
 
60
  "Min rel volume", value=st.session_state.min_relvol
61
  )
62
 
63
+ results_placeholder = st.empty()
64
 
65
  f = st.session_state
66
  filters = []
67
+ if f.date and isinstance(f.date, tuple) and len(f.date) == 2:
68
+ start_date, end_date = f.date
69
+ filters.append(
70
+ f"date >= '{start_date.strftime('%Y-%m-%d')}' AND date <= '{end_date.strftime('%Y-%m-%d')}'"
71
+ )
72
+
73
  if f.symbols:
74
  filters.append(f"symbol IN {tuple(f.symbols)}")
75
  if f.min_open:
 
90
  st.markdown(f"**Results: {len(df)}**")
91
 
92
  if df.empty:
93
+ st.info("No data found with current filters.")
94
  else:
95
  numeric_cols = df.select_dtypes("number").columns.tolist()
96
 
src/pages/chart.py CHANGED
@@ -1,4 +1,4 @@
1
- from datetime import timedelta
2
 
3
  import pandas as pd
4
  import plotly.graph_objs as go
@@ -10,8 +10,12 @@ st.set_page_config(layout="wide")
10
  st.title("Candlestick Chart")
11
  st.sidebar.title("Filters")
12
 
13
- symbol = st.sidebar.text_input("Ticker symbol", value="HTOO").upper()
14
- date_start = st.sidebar.date_input("Start date", pd.Timestamp("2025-07-22"))
 
 
 
 
15
  timeframe = st.sidebar.selectbox("Timeframe", options=["1", "5", "15"], index=2)
16
 
17
  try:
 
1
+ from datetime import datetime, timedelta
2
 
3
  import pandas as pd
4
  import plotly.graph_objs as go
 
10
  st.title("Candlestick Chart")
11
  st.sidebar.title("Filters")
12
 
13
+ symbol = st.sidebar.text_input("Ticker symbol", value="TSLA").upper()
14
+ date_start = st.sidebar.date_input(
15
+ "Start date",
16
+ datetime.today() - timedelta(days=1),
17
+ max_value=datetime.today() - timedelta(days=1),
18
+ )
19
  timeframe = st.sidebar.selectbox("Timeframe", options=["1", "5", "15"], index=2)
20
 
21
  try: