|
1 | 1 | """api.py"""
|
| 2 | + |
2 | 3 | from fastapi import FastAPI
|
3 | 4 | from datetime import datetime
|
4 | 5 | import pandas as pd
|
5 |
| -import pandas_datareader as pdr |
6 |
| -import json |
7 |
| -import yfinance as yf |
8 |
| - |
9 |
| -app = FastAPI() |
10 |
| - |
11 |
| -@app.get("/") |
12 |
| -async def root(): |
13 |
| - return {"message": "Hello World"} |
14 |
| - |
15 |
| - |
16 |
| -async def get_econ_data(): |
17 |
| - # FIXME: This is not working |
18 |
| - start = datetime(1960, 1, 1) |
19 |
| - end = datetime(2024, 4, 22) |
20 |
| - |
21 |
| - # Retrieve the data for each feature |
22 |
| - data_gdp = pdr.DataReader("GDP", "fred", start, end)["GDP"] |
23 |
| - data_gdp.index = pd.to_datetime(data_gdp.index) |
24 |
| - |
25 |
| - data_cpi = pdr.DataReader("CPIAUCSL", "fred", start, end)["CPIAUCSL"] |
26 |
| - data_cpi.index = pd.to_datetime(data_cpi.index) |
27 |
| - |
28 |
| - data_stock = pdr.DataReader("SPASTT01USM661N", "fred", start, end)[ |
29 |
| - "SPASTT01USM661N" |
30 |
| - ] |
31 |
| - data_stock.index = pd.to_datetime(data_stock.index) |
32 |
| - |
33 |
| - data_pce = pdr.DataReader("PCE", "fred", start, end)["PCE"] |
34 |
| - data_pce.index = pd.to_datetime(data_pce.index) |
35 | 6 |
|
36 |
| - data_govs = pdr.DataReader("FGEXPND", "fred", start, end)["FGEXPND"] |
37 |
| - data_govs.index = pd.to_datetime(data_govs.index) |
| 7 | +# import pandas_datareader as pdr |
| 8 | +import json |
| 9 | +import os |
38 | 10 |
|
39 |
| - data_binv = pdr.DataReader("W987RC1Q027SBEA", "fred", start, end)["W987RC1Q027SBEA"] |
40 |
| - data_binv.index = pd.to_datetime(data_binv.index) |
| 11 | +# import yfinance as yf |
41 | 12 |
|
42 |
| - data_em = pdr.DataReader("PAYEMS", "fred", start, end)["PAYEMS"] |
43 |
| - data_em.index = pd.to_datetime(data_em.index) |
| 13 | +app = FastAPI() |
44 | 14 |
|
45 |
| - data_unem = pdr.DataReader("ICSA", "fred", start, end)["ICSA"] |
46 |
| - data_unem.index = pd.to_datetime(data_unem.index) |
| 15 | +DATA_DIR = os.getenv("DATA_DIR", "/data") |
47 | 16 |
|
48 |
| - # Combine the features into a single DataFrame |
49 |
| - data = pd.DataFrame( |
50 |
| - { |
51 |
| - "data_gdp": data_gdp, |
52 |
| - "data_cpi": data_cpi, |
53 |
| - "data_stock": data_stock, |
54 |
| - "data_pce": data_pce, |
55 |
| - "data_govs": data_govs, |
56 |
| - "data_binv": data_binv, |
57 |
| - "data_em": data_em, |
58 |
| - "data_unem": data_unem, |
59 |
| - } |
60 |
| - ) |
61 | 17 |
|
62 |
| - # Remove rows with missing values |
63 |
| - data = data.dropna() |
| 18 | +@app.get("/") |
| 19 | +async def root(): |
| 20 | + return {"message": "OK"} |
64 | 21 |
|
65 |
| - return data |
66 | 22 |
|
67 | 23 | @app.get("/ticker/{ticker}")
|
68 | 24 | async def get_ticker(ticker):
|
69 | 25 | print(f"Getting stock data for {ticker}")
|
70 | 26 |
|
71 | 27 | # IF DATA FOUND - RETURN THIS
|
72 | 28 | try:
|
73 |
| - with open(f"data/{ticker}.json", "w") as file: |
| 29 | + with open(f"{DATA_DIR}/{ticker}.json", "w") as file: |
74 | 30 | file.write(json.dumps(data))
|
75 | 31 |
|
76 | 32 | return data
|
77 | 33 | except:
|
78 |
| - logger.info('No ticker found - downloading data...') |
79 |
| - |
80 |
| - data = {} |
81 |
| - try: |
82 |
| - stock_ticker = yf.Ticker(ticker) |
83 |
| - except Exception as err: |
84 |
| - print("Error: %s", err) |
85 |
| - |
86 |
| - # get all stock info |
87 |
| - try: |
88 |
| - data["info"] = stock_ticker.info |
89 |
| - except Exception as err: |
90 |
| - print("Error: %s", err) |
91 |
| - |
92 |
| - try: |
93 |
| - # get historical market data |
94 |
| - mo1 = stock_ticker.history(period="1mo") |
95 |
| - data["1mo_hist"] = pd.DataFrame(mo1).to_json() |
96 |
| - except Exception as err: |
97 |
| - print("Error: %s", err) |
98 |
| - |
99 |
| - try: |
100 |
| - # show meta information about the history (requires history() to be called first) |
101 |
| - data["history_metadata"] = stock_ticker.history_metadata |
102 |
| - except Exception as err: |
103 |
| - print("Error: %s", err) |
104 |
| - |
105 |
| - try: |
106 |
| - # show actions (dividends, splits, capital gains) |
107 |
| - data["actions"] = pd.DataFrame(stock_ticker.actions).to_json() |
108 |
| - data["dividends"] = pd.DataFrame(stock_ticker.dividends).to_json() |
109 |
| - data["splits"] = pd.DataFrame(stock_ticker.splits).to_json() |
110 |
| - except Exception as err: |
111 |
| - print("Error: %s", err) |
112 |
| - try: |
113 |
| - data["capital_gains"] = pd.DataFrame( |
114 |
| - stock_ticker.capital_gains |
115 |
| - ).to_json() # only for mutual funds & etfs |
116 |
| - except Exception as err: |
117 |
| - print("Error: %s", err) |
118 |
| - |
119 |
| - try: |
120 |
| - # show share count |
121 |
| - get_shares_full = stock_ticker.get_shares_full(start="2022-01-01", end=None) |
122 |
| - df = pd.DataFrame(get_shares_full) |
123 |
| - df.reset_index(inplace=True) |
124 |
| - data["get_shares_full"] = pd.DataFrame(df).to_json() |
125 |
| - except Exception as err: |
126 |
| - print("Error: %s", err) |
127 |
| - |
128 |
| - # show financials: |
129 |
| - # - income statement |
130 |
| - |
131 |
| - try: |
132 |
| - income_stmt = stock_ticker.income_stmt |
133 |
| - data["income_stmt"] = pd.DataFrame(income_stmt).to_json() |
134 |
| - |
135 |
| - data["quarterly_income_stmt"] = pd.DataFrame( |
136 |
| - stock_ticker.quarterly_income_stmt |
137 |
| - ).to_json() |
138 |
| - # - balance sheet |
139 |
| - data["balance_sheet"] = pd.DataFrame(stock_ticker.balance_sheet).to_json() |
140 |
| - data["quarterly_balance_sheet"] = pd.DataFrame( |
141 |
| - stock_ticker.quarterly_balance_sheet |
142 |
| - ).to_json() |
143 |
| - # - cash flow statement |
144 |
| - data["cashflow"] = pd.DataFrame(stock_ticker.cashflow).to_json() |
145 |
| - data["quarterly_cashflow"] = pd.DataFrame( |
146 |
| - stock_ticker.quarterly_cashflow |
147 |
| - ).to_json() |
148 |
| - # see `Ticker.get_income_stmt()` for more options |
149 |
| - except Exception as err: |
150 |
| - print("Error: %s", err) |
151 |
| - |
152 |
| - try: |
153 |
| - # show holders |
154 |
| - data["major_holders"] = pd.DataFrame(stock_ticker.major_holders).to_json() |
155 |
| - data["institutional_holders"] = pd.DataFrame( |
156 |
| - stock_ticker.institutional_holders |
157 |
| - ).to_json() |
158 |
| - data["mutualfund_holders"] = pd.DataFrame( |
159 |
| - stock_ticker.mutualfund_holders |
160 |
| - ).to_json() |
161 |
| - data["insider_transactions"] = pd.DataFrame( |
162 |
| - stock_ticker.insider_transactions |
163 |
| - ).to_json() |
164 |
| - data["insider_purchases"] = pd.DataFrame( |
165 |
| - stock_ticker.insider_purchases |
166 |
| - ).to_json() |
167 |
| - data["insider_roster_holders"] = pd.DataFrame( |
168 |
| - stock_ticker.insider_roster_holders |
169 |
| - ).to_json() |
170 |
| - except Exception as err: |
171 |
| - print("Error: %s", err) |
172 |
| - |
173 |
| - try: |
174 |
| - # show recommendations |
175 |
| - data["recommendations"] = pd.DataFrame(stock_ticker.recommendations).to_json() |
176 |
| - data["recommendations_summary"] = pd.DataFrame( |
177 |
| - stock_ticker.recommendations_summary |
178 |
| - ).to_json() |
179 |
| - data["upgrades_downgrades"] = pd.DataFrame( |
180 |
| - stock_ticker.upgrades_downgrades |
181 |
| - ).to_json() |
182 |
| - except Exception as err: |
183 |
| - print("Error: %s", err) |
184 |
| - |
185 |
| - # Show future and historic earnings dates, returns at most next 4 quarters and last 8 quarters by default. |
186 |
| - # Note: If more are needed use stock_ticker.get_earnings_dates(limit=XX) with increased limit argument. |
187 |
| - # data['earnings_dates'] = pd.DataFrame(stock_ticker.earnings_dates).to_json() |
188 |
| - |
189 |
| - # show ISIN code - *experimental* |
190 |
| - # ISIN = International Securities Identification Number |
191 |
| - try: |
192 |
| - data["isin"] = stock_ticker.isin |
193 |
| - except Exception as err: |
194 |
| - print("Error: %s", err) |
195 |
| - |
196 |
| - try: |
197 |
| - # show options expirations |
198 |
| - data["options"] = stock_ticker.options |
199 |
| - |
200 |
| - # FIXME: Get the options data into the json dict so we can publish to mongo |
201 |
| - # data['options_data'] = {} |
202 |
| - # for opt in data['options']: |
203 |
| - # print(f'Getting options for {opt}') |
204 |
| - # # data['options_data'][opt] = stock_ticker.option_chain(opt) |
205 |
| - # # data['options_data'][opt] = stock_ticker.option_chain(opt) |
206 |
| - # data['options_data'][f'{opt}_calls'] = pd.DataFrame(stock_ticker.option_chain(opt)).to_json() |
207 |
| - # data['options_data'][f'{opt}_puts'] = pd.DataFrame(stock_ticker.option_chain(opt)).to_json() |
208 |
| - except Exception as err: |
209 |
| - print("Error: %s", err) |
210 |
| - |
211 |
| - try: |
212 |
| - # show news |
213 |
| - data["news"] = stock_ticker.news |
214 |
| - except Exception as err: |
215 |
| - print("Error: %s", err) |
216 |
| - |
217 |
| - # TODO: This is only used when debuggins Json not Serializable errors |
218 |
| - # with open(f'data/{symbol}.txt', 'w') as f: |
219 |
| - # print(data, file=f) |
220 |
| - |
221 |
| - with open(f"data/{ticker}.json", "w") as file: |
222 |
| - file.write(json.dumps(data)) |
223 |
| - |
224 |
| - return data |
| 34 | + logger.info("No ticker found") |
0 commit comments