diff --git a/app/create_stock_db.py b/app/create_stock_db.py index aaa6857..530011a 100755 --- a/app/create_stock_db.py +++ b/app/create_stock_db.py @@ -100,17 +100,17 @@ class StockDatabase: urls = [ f"https://financialmodelingprep.com/api/v3/profile/{symbol}?apikey={api_key}", f"https://financialmodelingprep.com/api/v3/quote/{symbol}?apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/income-statement/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/income-statement-growth/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v4/esg-environmental-social-governance-data-ratings?symbol={symbol}&apikey={api_key}", - f"https://financialmodelingprep.com/api/v4/esg-environmental-social-governance-data?symbol={symbol}&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/income-statement/{symbol}?period=annual&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/income-statement-growth/{symbol}?period=annual&apikey={api_key}", + #f"https://financialmodelingprep.com/api/v4/esg-environmental-social-governance-data-ratings?symbol={symbol}&apikey={api_key}", + #f"https://financialmodelingprep.com/api/v4/esg-environmental-social-governance-data?symbol={symbol}&apikey={api_key}", f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_dividend/{symbol}?limit=400&apikey={api_key}", f"https://financialmodelingprep.com/api/v4/historical/employee_count?symbol={symbol}&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/balance-sheet-statement/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/balance-sheet-statement-growth/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/cash-flow-statement/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/cash-flow-statement-growth/{symbol}?period=quarter&apikey={api_key}", - f"https://financialmodelingprep.com/api/v3/ratios/{symbol}?period=quarter&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/balance-sheet-statement/{symbol}?period=annual&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/balance-sheet-statement-growth/{symbol}?period=annual&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/cash-flow-statement/{symbol}?period=annual&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/cash-flow-statement-growth/{symbol}?period=annual&apikey={api_key}", + f"https://financialmodelingprep.com/api/v3/ratios/{symbol}?period=annual&apikey={api_key}", f"https://financialmodelingprep.com/api/v3/historical-price-full/stock_split/{symbol}?apikey={api_key}", f"https://financialmodelingprep.com/api/v4/stock_peers?symbol={symbol}&apikey={api_key}", f"https://financialmodelingprep.com/api/v4/institutional-ownership/institutional-holders/symbol-ownership-percent?date={quarter_date}&symbol={symbol}&page=0&apikey={api_key}", @@ -124,7 +124,7 @@ class StockDatabase: # Check if 'income' and 'income_growth' data already exist for the symbol try: - self.cursor.execute("SELECT income, income_growth, balance, balance_growth, cashflow, cashflow_growth, ratios, stock_peers, esg_data, esg_ratings FROM stocks WHERE symbol = ?", (symbol,)) + self.cursor.execute("SELECT income, income_growth, balance, balance_growth, cashflow, cashflow_growth, ratios, stock_peersFROM stocks WHERE symbol = ?", (symbol,)) existing_data = self.cursor.fetchone() income_exists = existing_data and existing_data[0] is not None income_growth_exists = existing_data and existing_data[1] is not None @@ -176,12 +176,7 @@ class StockDatabase: elif 'stock_peers/' in url and stock_peers_exists: print(f"Skipping stock_peers for {symbol} as it already exists.") continue - elif 'esg-environmental-social-governance-data' in url and esg_data_exists: - print(f"Skipping esg_data for {symbol} as it already exists.") - continue - elif 'esg-environmental-social-governance-data-ratings?' in url and esg_ratings_exists: - print(f"Skipping esg_ratings for {symbol} as it already exists.") - continue + async with session.get(url) as response: @@ -284,16 +279,7 @@ class StockDatabase: elif isinstance(parsed_data, list) and "cash-flow-statement-growth/" in url: # Handle list response, save as JSON object fundamental_data['cashflow_growth'] = ujson.dumps(parsed_data) - elif isinstance(parsed_data, list) and "esg-environmental-social-governance-data?" in url: - # Handle list response, save as JSON object - fundamental_data['esg_data'] = ujson.dumps(parsed_data[0]) - data_dict = {'ESGScore': parsed_data[0]['ESGScore']} - fundamental_data.update(data_dict) - - elif isinstance(parsed_data, list) and "esg-environmental-social-governance-data-ratings?" in url: - # Handle list response, save as JSON object - fundamental_data['esg_ratings'] = ujson.dumps(parsed_data[0]) - + elif "stock_dividend" in url: # Handle list response, save as JSON object fundamental_data['stock_dividend'] = ujson.dumps(parsed_data) diff --git a/app/cron_stockdeck.py b/app/cron_stockdeck.py index 290a0c2..ed8564a 100755 --- a/app/cron_stockdeck.py +++ b/app/cron_stockdeck.py @@ -58,16 +58,6 @@ async def get_data(ticker): except: forward_pe = None - if data['esg_data'] == None: - company_esg_score = {'ESGScore': 'n/a', 'socialScore': 'n/a', 'environmentalScore': 'n/a', 'governanceScore': 'n/a'} - company_esg_rating = {'ESGRiskRating': 'n/a', 'industry': 'n/a'} - else: - company_esg_score = ujson.loads(data['esg_data']) - if data['esg_ratings'] == None: - company_esg_rating = {'ESGRiskRating': 'n/a', 'industry': 'n/a'} - else: - company_esg_rating = ujson.loads(data['esg_ratings']) - if data['stock_split'] == None: company_stock_split = [] else: @@ -92,28 +82,12 @@ async def get_data(ticker): 'previousClose': company_quote['price'], #This is true because I update my db before the market opens hence the price will be the previousClose price. 'website': company_profile[0]['website'], 'description': company_profile[0]['description'], - 'esgScore': company_esg_score['ESGScore'], - 'socialScore': company_esg_score['socialScore'], - 'environmentalScore': company_esg_score['environmentalScore'], - 'governanceScore': company_esg_score['governanceScore'], - 'esgRiskRating': company_esg_rating['ESGRiskRating'], 'fullTimeEmployees': company_profile[0]['fullTimeEmployees'], 'stockSplits': company_stock_split, } ] - if data['esg_data'] == None: - company_esg_score = {'ESGScore': 'n/a', 'socialScore': 'n/a', 'environmentalScore': 'n/a', 'governanceScore': 'n/a'} - company_esg_rating = {'ESGRiskRating': 'n/a', 'industry': 'n/a'} - else: - company_esg_score = ujson.loads(data['esg_data']) - if data['esg_ratings'] == None: - company_esg_rating = {'ESGRiskRating': 'n/a', 'industry': 'n/a'} - else: - company_esg_rating = ujson.loads(data['esg_ratings']) - - final_res = {k: v for d in [res_profile] for dict in d for k, v in dict.items()} return final_res diff --git a/app/restart_json.py b/app/restart_json.py index a7ce1fb..f5a7fd1 100755 --- a/app/restart_json.py +++ b/app/restart_json.py @@ -56,7 +56,7 @@ async def get_stock_screener(con,symbols): #Stock Screener Data - cursor.execute("SELECT symbol, name, avgVolume, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_50, sma_200, ema_50, ema_200, rsi, atr, stoch_rsi, mfi, cci, priceToSalesRatio, priceToBookRatio, eps, pe, ESGScore, marketCap, revenue, netIncome, grossProfit, costOfRevenue, costAndExpenses, interestIncome, interestExpense, researchAndDevelopmentExpenses, ebitda, operatingExpenses, operatingIncome, growthRevenue, growthNetIncome, growthGrossProfit, growthCostOfRevenue, growthCostAndExpenses, growthInterestExpense, growthResearchAndDevelopmentExpenses, growthEBITDA, growthEPS, growthOperatingExpenses, growthOperatingIncome, beta FROM stocks WHERE eps IS NOT NULL AND revenue IS NOT NULL AND marketCap IS NOT NULL AND beta IS NOT NULL") + cursor.execute("SELECT symbol, name, avgVolume, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_50, sma_200, ema_50, ema_200, rsi, atr, stoch_rsi, mfi, cci, priceToSalesRatio, priceToBookRatio, eps, pe, marketCap, revenue, netIncome, grossProfit, costOfRevenue, costAndExpenses, interestIncome, interestExpense, researchAndDevelopmentExpenses, ebitda, operatingExpenses, operatingIncome, growthRevenue, growthNetIncome, growthGrossProfit, growthCostOfRevenue, growthCostAndExpenses, growthInterestExpense, growthResearchAndDevelopmentExpenses, growthEBITDA, growthEPS, growthOperatingExpenses, growthOperatingIncome, beta FROM stocks WHERE eps IS NOT NULL AND revenue IS NOT NULL AND marketCap IS NOT NULL AND beta IS NOT NULL") raw_data = cursor.fetchall() stock_screener_data = [{ 'symbol': symbol, @@ -81,7 +81,6 @@ async def get_stock_screener(con,symbols): 'priceToBookRatio': priceToBookRatio, 'eps': eps, 'pe': pe, - 'esgScore': ESGScore, 'marketCap': marketCap, 'revenue': revenue, 'netIncome': netIncome, @@ -106,7 +105,7 @@ async def get_stock_screener(con,symbols): 'growthOperatingExpenses': growthOperatingExpenses, 'growthOperatingIncome': growthOperatingIncome, 'beta': beta, - } for (symbol, name, avgVolume, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_50, sma_200, ema_50, ema_200, rsi, atr, stoch_rsi, mfi, cci, priceToSalesRatio, priceToBookRatio, eps, pe, ESGScore, marketCap, revenue, netIncome, grossProfit,costOfRevenue, costAndExpenses, interestIncome, interestExpense, researchAndDevelopmentExpenses, ebitda, operatingExpenses, operatingIncome, growthRevenue, growthNetIncome, growthGrossProfit, growthCostOfRevenue, growthCostAndExpenses, growthInterestExpense, growthResearchAndDevelopmentExpenses, growthEBITDA, growthEPS, growthOperatingExpenses, growthOperatingIncome, beta) in raw_data] + } for (symbol, name, avgVolume, change_1W, change_1M, change_3M, change_6M, change_1Y, change_3Y, sma_50, sma_200, ema_50, ema_200, rsi, atr, stoch_rsi, mfi, cci, priceToSalesRatio, priceToBookRatio, eps, pe, marketCap, revenue, netIncome, grossProfit,costOfRevenue, costAndExpenses, interestIncome, interestExpense, researchAndDevelopmentExpenses, ebitda, operatingExpenses, operatingIncome, growthRevenue, growthNetIncome, growthGrossProfit, growthCostOfRevenue, growthCostAndExpenses, growthInterestExpense, growthResearchAndDevelopmentExpenses, growthEBITDA, growthEPS, growthOperatingExpenses, growthOperatingIncome, beta) in raw_data] stock_screener_data = [{k: round(v, 2) if isinstance(v, (int, float)) else v for k, v in entry.items()} for entry in stock_screener_data] @@ -203,6 +202,9 @@ async def get_stock_screener(con,symbols): item['debtEquityRatio'] = round(float(res['debtEquityRatio']),2) item['quickRatio'] = round(float(res['quickRatio']),2) item['currentRatio'] = round(float(res['currentRatio']),2) + item['freeCashFlowPerShare'] = round(float(res['freeCashFlowPerShare']),2) + item['cashPerShare'] = round(float(res['cashPerShare']),2) + item['priceToFreeCashFlowsRatio'] = round(float(res['priceToFreeCashFlowsRatio']),2) except: item['returnOnAssets'] = None @@ -211,6 +213,9 @@ async def get_stock_screener(con,symbols): item['debtEquityRatio'] = None item['quickRatio'] = None item['currentRatio'] = None + item['freeCashFlowPerShare'] = None + item['cashPerShare'] = None + item['priceToFreeCashFlowsRatio'] = None return stock_screener_data