QuantumLearner commited on
Commit
f287e39
·
verified ·
1 Parent(s): 056acac

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +158 -167
app.py CHANGED
@@ -1,105 +1,133 @@
1
- import streamlit as st
2
  import datetime
3
  import requests
4
  import pandas as pd
 
5
  from streamlit_calendar import calendar
6
- import os
7
 
8
  API_KEY = os.getenv("FMP_API_KEY")
9
 
10
- def parse_time_field(date_str, time_str):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  """
12
- Convert a date string plus partial time info into date-time strings.
13
- Example: date='2023-08-17', time='pre market' -> '2023-08-17T07:00:00'
14
  """
15
- if time_str and ":" in time_str:
16
- return f"{date_str}T{time_str}:00", f"{date_str}T{time_str}:00"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  else:
 
18
  time_map = {
19
- "bmo": "06:00:00",
20
- "amc": "18:00:00",
21
- "pre market": "07:00:00",
22
- "post market": "16:00:00",
23
  "during market": "10:00:00",
24
  }
25
- chosen_time = time_map.get(time_str.lower(), "00:00:00")
26
- return f"{date_str}T{chosen_time}", f"{date_str}T{chosen_time}"
 
 
 
 
 
27
 
28
  def fetch_earnings(from_date, to_date, limit):
29
  url = (
30
- f"https://financialmodelingprep.com/api/v4/earning-calendar-confirmed"
31
- f"?from={from_date}&to={to_date}&limit={limit}&apikey={API_KEY}"
32
  )
33
- resp = requests.get(url)
34
- if resp.status_code == 200:
35
- return resp.json()
36
- return []
37
 
38
  def fetch_dividends(from_date, to_date):
39
  url = (
40
- f"https://financialmodelingprep.com/api/v3/stock_dividend_calendar"
41
- f"?from={from_date}&to={to_date}&apikey={API_KEY}"
42
  )
43
- resp = requests.get(url)
44
- if resp.status_code == 200:
45
- return resp.json()
46
- return []
47
 
48
  def fetch_splits(from_date, to_date):
49
  url = (
50
- f"https://financialmodelingprep.com/api/v3/stock_split_calendar"
51
- f"?from={from_date}&to={to_date}&apikey={API_KEY}"
52
  )
53
- resp = requests.get(url)
54
- if resp.status_code == 200:
55
- return resp.json()
56
- return []
57
 
58
  def fetch_earnings_ticker(symbol, limit):
59
  url = (
60
- f"https://financialmodelingprep.com/api/v3/historical/earning_calendar/"
61
- f"{symbol}?limit={limit}&apikey={API_KEY}"
62
  )
63
- resp = requests.get(url)
64
- if resp.status_code == 200:
65
- return resp.json()
66
- return []
67
 
68
  def fetch_dividends_ticker(symbol):
69
  url = (
70
- f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_dividend/"
71
  f"{symbol}?apikey={API_KEY}"
72
  )
73
- resp = requests.get(url)
74
- if resp.status_code == 200:
75
- return resp.json()
76
- return {}
77
 
78
  def fetch_splits_ticker(symbol):
79
  url = (
80
- f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_split/"
81
  f"{symbol}?apikey={API_KEY}"
82
  )
83
- resp = requests.get(url)
84
- if resp.status_code == 200:
85
- return resp.json()
86
- return {}
87
 
88
  def main():
89
- # Updated title to reflect more events
90
  st.set_page_config(page_title="Earnings, Dividends, and Splits Calendar", layout="wide")
91
 
92
- # Initialize session state
 
 
93
  if "general_data" not in st.session_state:
94
  st.session_state["general_data"] = []
95
  if "ticker_data" not in st.session_state:
96
  st.session_state["ticker_data"] = []
97
 
98
  st.title("Corporate Events Calendar")
99
- st.write("This calendar shows earnings, dividends, and stock splits. Set parameters and click run. ")
100
 
101
  st.sidebar.title("Input Parameters")
102
-
103
  with st.sidebar.expander("How to Use", expanded=False):
104
  st.write(
105
  """
@@ -113,77 +141,71 @@ def main():
113
  with st.sidebar.expander("", expanded=True):
114
  page_choice = st.radio("Page", ["General Calendar", "Ticker Calendar"])
115
 
116
- # Default date range
117
  today = datetime.date.today()
118
  one_month_later = today + datetime.timedelta(days=30)
119
 
120
  if page_choice == "General Calendar":
121
  with st.sidebar.expander("Event Type", expanded=True):
122
- include_earnings = st.checkbox("Include Earnings", value=True, help="If checked, will fetch earnings within the date range.")
123
- include_dividends = st.checkbox("Include Dividends", value=True, help="If checked, will fetch dividends within the date range.")
124
- include_splits = st.checkbox("Include Stock Splits", value=True, help="If checked, will fetch stock splits within the date range.")
125
 
126
  with st.sidebar.expander("Parameters", expanded=True):
127
- from_date = st.date_input("From Date", value=today, help="Start date range")
128
- to_date = st.date_input("To Date", value=one_month_later, help="End date range")
129
- limit_val = st.number_input("Limit", value=200, help="Number of earnings records to retrieve")
130
 
131
  if st.sidebar.button("Retrieve Calendar", key="fetch_general"):
132
- # Collect everything in one list
133
  all_events = []
134
 
135
  if include_earnings:
136
- earnings_data = fetch_earnings(from_date, to_date, limit_val)
137
- for item in earnings_data:
138
- date_str = item.get("date", "")
139
- time_str = item.get("time", "")
140
- start_dt, end_dt = parse_time_field(date_str, time_str)
 
 
 
141
  sym = item.get("symbol", "")
142
- event_title = f"[Earnings] {sym}"
143
- # Store entire item plus fields for the calendar
144
  event_entry = {
145
  "start": start_dt,
146
  "end": end_dt,
147
- "title": event_title,
148
  "color": "#3D9DF3",
149
- "eventType": "Earnings"
150
  }
151
- # Merge item fields directly
152
  event_entry.update(item)
153
  all_events.append(event_entry)
154
 
155
  if include_dividends:
156
- div_data = fetch_dividends(from_date, to_date)
157
- for item in div_data:
158
- date_str = item.get("date", "")
159
- start_dt = f"{date_str}T00:00:00"
160
- end_dt = f"{date_str}T23:59:59"
161
- sym = item.get("symbol", "")
162
- event_title = f"[Dividend] {sym}"
163
  event_entry = {
164
- "start": start_dt,
165
- "end": end_dt,
166
- "title": event_title,
167
  "color": "#80C080",
168
- "eventType": "Dividend"
169
  }
170
  event_entry.update(item)
171
  all_events.append(event_entry)
172
 
173
  if include_splits:
174
- split_data = fetch_splits(from_date, to_date)
175
- for item in split_data:
176
- date_str = item.get("date", "")
177
- start_dt = f"{date_str}T00:00:00"
178
- end_dt = f"{date_str}T23:59:59"
179
- sym = item.get("symbol", "")
180
- event_title = f"[Split] {sym}"
181
  event_entry = {
182
- "start": start_dt,
183
- "end": end_dt,
184
- "title": event_title,
185
  "color": "#FFC870",
186
- "eventType": "Split"
187
  }
188
  event_entry.update(item)
189
  all_events.append(event_entry)
@@ -191,20 +213,12 @@ def main():
191
  st.session_state["general_data"] = all_events
192
 
193
  st.subheader("General Calendar Results")
194
-
195
  data_general = st.session_state["general_data"]
196
  if data_general:
197
- # Prepare events for calendar
198
- calendar_events = []
199
- for ev in data_general:
200
- event_for_cal = {
201
- "title": ev["title"],
202
- "start": ev["start"],
203
- "end": ev["end"],
204
- "color": ev["color"],
205
- }
206
- calendar_events.append(event_for_cal)
207
-
208
  cal_options = {
209
  "initialView": "dayGridMonth",
210
  "headerToolbar": {
@@ -214,83 +228,72 @@ def main():
214
  },
215
  "navLinks": True,
216
  }
217
-
218
- # Show calendar
219
  calendar(events=calendar_events, options=cal_options, key="general_cal")
220
-
221
- # Show entire dataframe
222
  st.write("Data Table")
223
- df_g = pd.DataFrame(data_general)
224
- st.dataframe(df_g, use_container_width=True)
225
  else:
226
  st.write("No data retrieved. Select event types and click the button.")
227
 
228
  else:
229
-
230
  with st.sidebar.expander("Event Type", expanded=True):
231
- # Ticker Calendar
232
- include_earnings_t = st.checkbox("Include Earnings", value=True, help="If checked, will fetch historical earnings data.")
233
- include_dividends_t = st.checkbox("Include Dividends", value=True, help="If checked, will fetch historical dividends data.")
234
- include_splits_t = st.checkbox("Include Splits", value=True, help="If checked, will fetch historical stock splits data.")
235
-
236
  with st.sidebar.expander("Parameters", expanded=True):
237
- symbol = st.text_input("Symbol", value="AAPL", help="Enter a stock ticker")
238
- limit_val_ticker = st.number_input("Limit", value=50, help="Number of earnings records to retrieve")
239
 
240
  if st.sidebar.button("Retrieve Ticker Calendar", key="fetch_ticker"):
241
  ticker_events = []
242
 
243
  if include_earnings_t:
244
- data_earnings_t = fetch_earnings_ticker(symbol, limit_val_ticker)
245
- for item in data_earnings_t:
246
- date_str = item.get("date", "")
247
- time_str = item.get("time", "")
248
- start_dt, end_dt = parse_time_field(date_str, time_str)
249
- event_title = f"[Earnings] {symbol}"
 
 
250
  event_info = {
251
  "start": start_dt,
252
  "end": end_dt,
253
- "title": event_title,
254
  "color": "#3D9DF3",
255
- "eventType": "Earnings"
256
  }
257
  event_info.update(item)
258
  ticker_events.append(event_info)
259
 
260
  if include_dividends_t:
261
- data_div_t = fetch_dividends_ticker(symbol)
262
- # The response is a dict with keys like "symbol" and "historical"
263
- historical_divs = data_div_t.get("historical", [])
264
- for item in historical_divs:
265
- date_str = item.get("date", "")
266
- start_dt = f"{date_str}T00:00:00"
267
- end_dt = f"{date_str}T23:59:59"
268
- event_title = f"[Dividend] {symbol}"
269
  event_info = {
270
- "start": start_dt,
271
- "end": end_dt,
272
- "title": event_title,
273
  "color": "#80C080",
274
- "eventType": "Dividend"
275
  }
276
  event_info.update(item)
277
  ticker_events.append(event_info)
278
 
279
  if include_splits_t:
280
- data_split_t = fetch_splits_ticker(symbol)
281
- # The response is a dict with keys like "symbol" and "historical"
282
- historical_splits = data_split_t.get("historical", [])
283
- for item in historical_splits:
284
- date_str = item.get("date", "")
285
- start_dt = f"{date_str}T00:00:00"
286
- end_dt = f"{date_str}T23:59:59"
287
- event_title = f"[Split] {symbol}"
288
  event_info = {
289
- "start": start_dt,
290
- "end": end_dt,
291
- "title": event_title,
292
  "color": "#FFC870",
293
- "eventType": "Split"
294
  }
295
  event_info.update(item)
296
  ticker_events.append(event_info)
@@ -298,19 +301,12 @@ def main():
298
  st.session_state["ticker_data"] = ticker_events
299
 
300
  st.subheader("Ticker Calendar Results")
301
-
302
  data_ticker = st.session_state["ticker_data"]
303
  if data_ticker:
304
- # Prepare events
305
- calendar_events_t = []
306
- for ev in data_ticker:
307
- calendar_events_t.append({
308
- "title": ev["title"],
309
- "start": ev["start"],
310
- "end": ev["end"],
311
- "color": ev["color"]
312
- })
313
-
314
  cal_options_ticker = {
315
  "initialView": "dayGridMonth",
316
  "headerToolbar": {
@@ -320,20 +316,15 @@ def main():
320
  },
321
  "navLinks": True,
322
  }
323
-
324
  calendar(events=calendar_events_t, options=cal_options_ticker, key="ticker_cal")
325
-
326
  st.write("Data Table")
327
- df_t = pd.DataFrame(data_ticker)
328
- st.dataframe(df_t, use_container_width=True)
329
  else:
330
- #st.write("No data retrieved. Check your options and press the button.")
331
  st.write(" ")
332
 
333
  if __name__ == "__main__":
334
  main()
335
-
336
-
337
  hide_streamlit_style = """
338
  <style>
339
  #MainMenu {visibility: hidden;}
 
1
+ import os
2
  import datetime
3
  import requests
4
  import pandas as pd
5
+ import streamlit as st
6
  from streamlit_calendar import calendar
 
7
 
8
  API_KEY = os.getenv("FMP_API_KEY")
9
 
10
+ # ---------- Utilities ----------
11
+
12
+ def _normalize_date(date_val):
13
+ """Return YYYY-MM-DD or None if invalid."""
14
+ if isinstance(date_val, datetime.datetime):
15
+ return date_val.date().strftime("%Y-%m-%d")
16
+ if isinstance(date_val, datetime.date):
17
+ return date_val.strftime("%Y-%m-%d")
18
+ if isinstance(date_val, str):
19
+ s = date_val.strip()
20
+ if not s:
21
+ return None
22
+ # handle strings like "2025-08-18 00:00:00"
23
+ if len(s) >= 10:
24
+ return s[:10]
25
+ return None
26
+
27
+ def parse_time_field(date_val, time_val):
28
  """
29
+ Convert an input date plus a 'time' label into ISO start/end strings.
30
+ Handles None/missing time safely. Returns (start_iso, end_iso) or (None, None) if date invalid.
31
  """
32
+ date_str = _normalize_date(date_val)
33
+ if not date_str:
34
+ return None, None
35
+
36
+ t = (time_val or "").strip().lower()
37
+
38
+ # If a clock time is provided (e.g., "09:30" or "09:30:00")
39
+ if ":" in t:
40
+ # normalize to HH:MM:SS if we can
41
+ parts = t.split(":")
42
+ if len(parts) == 2:
43
+ t = f"{t}:00"
44
+ elif len(parts) >= 3:
45
+ t = ":".join(parts[:3])
46
+ else:
47
+ t = "00:00:00"
48
+ chosen = t
49
  else:
50
+ # Common labels from FMP (and synonyms)
51
  time_map = {
52
+ "bmo": "06:00:00", "before market": "06:00:00", "pre-market": "06:00:00",
53
+ "pre market": "07:00:00", # keep your original mapping too
54
+ "amc": "18:00:00", "after market": "18:00:00", "post-market": "18:00:00",
55
+ "post market": "16:00:00", # keep original
56
  "during market": "10:00:00",
57
  }
58
+ chosen = time_map.get(t, "00:00:00")
59
+
60
+ start_iso = f"{date_str}T{chosen}"
61
+ end_iso = f"{date_str}T{chosen}"
62
+ return start_iso, end_iso
63
+
64
+ # ---------- API calls ----------
65
 
66
  def fetch_earnings(from_date, to_date, limit):
67
  url = (
68
+ "https://financialmodelingprep.com/api/v4/earning-calendar-confirmed"
69
+ f"?from={_normalize_date(from_date)}&to={_normalize_date(to_date)}&limit={int(limit)}&apikey={API_KEY}"
70
  )
71
+ r = requests.get(url)
72
+ return r.json() if r.status_code == 200 else []
 
 
73
 
74
  def fetch_dividends(from_date, to_date):
75
  url = (
76
+ "https://financialmodelingprep.com/api/v3/stock_dividend_calendar"
77
+ f"?from={_normalize_date(from_date)}&to={_normalize_date(to_date)}&apikey={API_KEY}"
78
  )
79
+ r = requests.get(url)
80
+ return r.json() if r.status_code == 200 else []
 
 
81
 
82
  def fetch_splits(from_date, to_date):
83
  url = (
84
+ "https://financialmodelingprep.com/api/v3/stock_split_calendar"
85
+ f"?from={_normalize_date(from_date)}&to={_normalize_date(to_date)}&apikey={API_KEY}"
86
  )
87
+ r = requests.get(url)
88
+ return r.json() if r.status_code == 200 else []
 
 
89
 
90
  def fetch_earnings_ticker(symbol, limit):
91
  url = (
92
+ "https://financialmodelingprep.com/api/v3/historical/earning_calendar/"
93
+ f"{symbol}?limit={int(limit)}&apikey={API_KEY}"
94
  )
95
+ r = requests.get(url)
96
+ return r.json() if r.status_code == 200 else []
 
 
97
 
98
  def fetch_dividends_ticker(symbol):
99
  url = (
100
+ "https://financialmodelingprep.com/api/v3/historical-price-full/stock_dividend/"
101
  f"{symbol}?apikey={API_KEY}"
102
  )
103
+ r = requests.get(url)
104
+ return r.json() if r.status_code == 200 else {}
 
 
105
 
106
  def fetch_splits_ticker(symbol):
107
  url = (
108
+ "https://financialmodelingprep.com/api/v3/historical-price-full/stock_split/"
109
  f"{symbol}?apikey={API_KEY}"
110
  )
111
+ r = requests.get(url)
112
+ return r.json() if r.status_code == 200 else {}
113
+
114
+ # ---------- App ----------
115
 
116
  def main():
 
117
  st.set_page_config(page_title="Earnings, Dividends, and Splits Calendar", layout="wide")
118
 
119
+ if not API_KEY:
120
+ st.warning("FMP_API_KEY is not set. Please add it in your Space secrets.")
121
+
122
  if "general_data" not in st.session_state:
123
  st.session_state["general_data"] = []
124
  if "ticker_data" not in st.session_state:
125
  st.session_state["ticker_data"] = []
126
 
127
  st.title("Corporate Events Calendar")
128
+ st.write("This calendar shows earnings, dividends, and stock splits. Set parameters and click run.")
129
 
130
  st.sidebar.title("Input Parameters")
 
131
  with st.sidebar.expander("How to Use", expanded=False):
132
  st.write(
133
  """
 
141
  with st.sidebar.expander("", expanded=True):
142
  page_choice = st.radio("Page", ["General Calendar", "Ticker Calendar"])
143
 
 
144
  today = datetime.date.today()
145
  one_month_later = today + datetime.timedelta(days=30)
146
 
147
  if page_choice == "General Calendar":
148
  with st.sidebar.expander("Event Type", expanded=True):
149
+ include_earnings = st.checkbox("Include Earnings", value=True)
150
+ include_dividends = st.checkbox("Include Dividends", value=True)
151
+ include_splits = st.checkbox("Include Stock Splits", value=True)
152
 
153
  with st.sidebar.expander("Parameters", expanded=True):
154
+ from_date = st.date_input("From Date", value=today)
155
+ to_date = st.date_input("To Date", value=one_month_later)
156
+ limit_val = st.number_input("Limit", value=200, min_value=1)
157
 
158
  if st.sidebar.button("Retrieve Calendar", key="fetch_general"):
 
159
  all_events = []
160
 
161
  if include_earnings:
162
+ for item in fetch_earnings(from_date, to_date, limit_val):
163
+ date_raw = item.get("date")
164
+ if not _normalize_date(date_raw):
165
+ continue # skip invalid date
166
+ time_raw = item.get("time")
167
+ start_dt, end_dt = parse_time_field(date_raw, time_raw)
168
+ if not start_dt:
169
+ continue
170
  sym = item.get("symbol", "")
 
 
171
  event_entry = {
172
  "start": start_dt,
173
  "end": end_dt,
174
+ "title": f"[Earnings] {sym}",
175
  "color": "#3D9DF3",
176
+ "eventType": "Earnings",
177
  }
 
178
  event_entry.update(item)
179
  all_events.append(event_entry)
180
 
181
  if include_dividends:
182
+ for item in fetch_dividends(from_date, to_date):
183
+ date_raw = item.get("date")
184
+ d = _normalize_date(date_raw)
185
+ if not d:
186
+ continue
 
 
187
  event_entry = {
188
+ "start": f"{d}T00:00:00",
189
+ "end": f"{d}T23:59:59",
190
+ "title": f"[Dividend] {item.get('symbol','')}",
191
  "color": "#80C080",
192
+ "eventType": "Dividend",
193
  }
194
  event_entry.update(item)
195
  all_events.append(event_entry)
196
 
197
  if include_splits:
198
+ for item in fetch_splits(from_date, to_date):
199
+ date_raw = item.get("date")
200
+ d = _normalize_date(date_raw)
201
+ if not d:
202
+ continue
 
 
203
  event_entry = {
204
+ "start": f"{d}T00:00:00",
205
+ "end": f"{d}T23:59:59",
206
+ "title": f"[Split] {item.get('symbol','')}",
207
  "color": "#FFC870",
208
+ "eventType": "Split",
209
  }
210
  event_entry.update(item)
211
  all_events.append(event_entry)
 
213
  st.session_state["general_data"] = all_events
214
 
215
  st.subheader("General Calendar Results")
 
216
  data_general = st.session_state["general_data"]
217
  if data_general:
218
+ calendar_events = [
219
+ {"title": ev["title"], "start": ev["start"], "end": ev["end"], "color": ev["color"]}
220
+ for ev in data_general
221
+ ]
 
 
 
 
 
 
 
222
  cal_options = {
223
  "initialView": "dayGridMonth",
224
  "headerToolbar": {
 
228
  },
229
  "navLinks": True,
230
  }
 
 
231
  calendar(events=calendar_events, options=cal_options, key="general_cal")
 
 
232
  st.write("Data Table")
233
+ st.dataframe(pd.DataFrame(data_general), use_container_width=True)
 
234
  else:
235
  st.write("No data retrieved. Select event types and click the button.")
236
 
237
  else:
 
238
  with st.sidebar.expander("Event Type", expanded=True):
239
+ include_earnings_t = st.checkbox("Include Earnings", value=True)
240
+ include_dividends_t = st.checkbox("Include Dividends", value=True)
241
+ include_splits_t = st.checkbox("Include Splits", value=True)
242
+
 
243
  with st.sidebar.expander("Parameters", expanded=True):
244
+ symbol = st.text_input("Symbol", value="AAPL")
245
+ limit_val_ticker = st.number_input("Limit", value=50, min_value=1)
246
 
247
  if st.sidebar.button("Retrieve Ticker Calendar", key="fetch_ticker"):
248
  ticker_events = []
249
 
250
  if include_earnings_t:
251
+ for item in fetch_earnings_ticker(symbol, limit_val_ticker):
252
+ date_raw = item.get("date")
253
+ if not _normalize_date(date_raw):
254
+ continue
255
+ time_raw = item.get("time")
256
+ start_dt, end_dt = parse_time_field(date_raw, time_raw)
257
+ if not start_dt:
258
+ continue
259
  event_info = {
260
  "start": start_dt,
261
  "end": end_dt,
262
+ "title": f"[Earnings] {symbol}",
263
  "color": "#3D9DF3",
264
+ "eventType": "Earnings",
265
  }
266
  event_info.update(item)
267
  ticker_events.append(event_info)
268
 
269
  if include_dividends_t:
270
+ hist = fetch_dividends_ticker(symbol).get("historical", [])
271
+ for item in hist:
272
+ d = _normalize_date(item.get("date"))
273
+ if not d:
274
+ continue
 
 
 
275
  event_info = {
276
+ "start": f"{d}T00:00:00",
277
+ "end": f"{d}T23:59:59",
278
+ "title": f"[Dividend] {symbol}",
279
  "color": "#80C080",
280
+ "eventType": "Dividend",
281
  }
282
  event_info.update(item)
283
  ticker_events.append(event_info)
284
 
285
  if include_splits_t:
286
+ hist = fetch_splits_ticker(symbol).get("historical", [])
287
+ for item in hist:
288
+ d = _normalize_date(item.get("date"))
289
+ if not d:
290
+ continue
 
 
 
291
  event_info = {
292
+ "start": f"{d}T00:00:00",
293
+ "end": f"{d}T23:59:59",
294
+ "title": f"[Split] {symbol}",
295
  "color": "#FFC870",
296
+ "eventType": "Split",
297
  }
298
  event_info.update(item)
299
  ticker_events.append(event_info)
 
301
  st.session_state["ticker_data"] = ticker_events
302
 
303
  st.subheader("Ticker Calendar Results")
 
304
  data_ticker = st.session_state["ticker_data"]
305
  if data_ticker:
306
+ calendar_events_t = [
307
+ {"title": ev["title"], "start": ev["start"], "end": ev["end"], "color": ev["color"]}
308
+ for ev in data_ticker
309
+ ]
 
 
 
 
 
 
310
  cal_options_ticker = {
311
  "initialView": "dayGridMonth",
312
  "headerToolbar": {
 
316
  },
317
  "navLinks": True,
318
  }
 
319
  calendar(events=calendar_events_t, options=cal_options_ticker, key="ticker_cal")
 
320
  st.write("Data Table")
321
+ st.dataframe(pd.DataFrame(data_ticker), use_container_width=True)
 
322
  else:
 
323
  st.write(" ")
324
 
325
  if __name__ == "__main__":
326
  main()
327
+
 
328
  hide_streamlit_style = """
329
  <style>
330
  #MainMenu {visibility: hidden;}