diff --git a/app/create_institute_db.py b/app/create_institute_db.py index 0514d14..ba0dac9 100755 --- a/app/create_institute_db.py +++ b/app/create_institute_db.py @@ -116,9 +116,9 @@ class InstituteDatabase: async def save_portfolio_data(self, session, cik): try: urls = [ - f"https://financialmodelingprep.com/api/v4/institutional-ownership/industry/portfolio-holdings-summary?cik={cik}&date={quarter_date}&page=0&apikey={api_key}", + #f"https://financialmodelingprep.com/api/v4/institutional-ownership/industry/portfolio-holdings-summary?cik={cik}&date={quarter_date}&page=0&apikey={api_key}", f"https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings?cik={cik}&date={quarter_date}&page=0&apikey={api_key}", - f"https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings-summary?cik={cik}&date={quarter_date}&page=0&apikey={api_key}" + f"https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings-summary?cik={cik}&page=0&apikey={api_key}" ] portfolio_data = {} @@ -129,9 +129,11 @@ class InstituteDatabase: parsed_data = get_jsonparsed_data(data) try: + ''' if isinstance(parsed_data, list) and "industry/portfolio-holdings-summary" in url: # Handle list response, save as JSON object portfolio_data['industry'] = json.dumps(parsed_data) + ''' if isinstance(parsed_data, list) and "https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings?cik=" in url: # Handle list response, save as JSON object @@ -153,7 +155,11 @@ class InstituteDatabase: positive_performance_count = sum(1 for percentage in performance_percentages if percentage > 0) - win_rate = round(positive_performance_count / len(performance_percentages) * 100,2) + try: + win_rate = round(positive_performance_count / len(performance_percentages) * 100,2) + except: + win_rate = 0 + data_dict = { 'winRate': win_rate, 'numberOfStocks': number_of_stocks, @@ -162,23 +168,25 @@ class InstituteDatabase: portfolio_data.update(data_dict) - elif isinstance(parsed_data, list) and "https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings-summary" in url: + if isinstance(parsed_data, list) and "https://financialmodelingprep.com/api/v4/institutional-ownership/portfolio-holdings-summary" in url: # Handle list response, save as JSON object portfolio_data['summary'] = json.dumps(parsed_data) data_dict = { - #'numberOfStocks': parsed_data[0]['portfolioSize'], + 'numberOfStocks': parsed_data[0]['portfolioSize'], 'marketValue': parsed_data[0]['marketValue'], 'averageHoldingPeriod': parsed_data[0]['averageHoldingPeriod'], 'turnover': parsed_data[0]['turnover'], + 'performancePercentage': parsed_data[0]['performancePercentage'], 'performancePercentage3year': parsed_data[0]['performancePercentage3year'], - #'performancePercentage': parsed_data[0]['performancePercentage'] + 'performancePercentage5year': parsed_data[0]['performancePercentage5year'], + 'performanceSinceInceptionPercentage': parsed_data[0]['performanceSinceInceptionPercentage'] } portfolio_data.update(data_dict) - except: - pass + except Exception as e: + print(e) # Check if columns already exist in the table self.cursor.execute("PRAGMA table_info(institutes)") @@ -190,7 +198,8 @@ class InstituteDatabase: symbols_not_in_list = not any(symbol in total_symbols for symbol in symbols_to_check) - if symbols_not_in_list or 'industry' not in portfolio_data or len(json.loads(portfolio_data['industry'])) == 0: + #if symbols_not_in_list or 'industry' not in portfolio_data or len(json.loads(portfolio_data['industry'])) == 0: + if symbols_not_in_list: # If 'industry' is not a list, delete the row and return #print(f"Deleting row for cik {cik} because 'industry' is not a list.") self.cursor.execute("DELETE FROM institutes WHERE cik = ?", (cik,)) @@ -256,7 +265,7 @@ class InstituteDatabase: tasks.append(self.save_portfolio_data(session, cik)) i += 1 - if i % 700 == 0: + if i % 1000 == 0: await asyncio.gather(*tasks) tasks = [] print('sleeping mode: ', i) diff --git a/app/main.py b/app/main.py index eb14037..6f00059 100755 --- a/app/main.py +++ b/app/main.py @@ -1410,7 +1410,7 @@ async def get_hedge_funds_data(data: GetCIKData): cursor = con_inst.cursor() # Execute a SQL query to select the top 10 best performing cik entries by winRate - cursor.execute("SELECT cik, name, numberOfStocks, performancePercentage3year, averageHoldingPeriod, turnover, marketValue, winRate, holdings FROM institutes WHERE cik = ?", (cik,)) + cursor.execute("SELECT cik, name, numberOfStocks, performancePercentage3year, averageHoldingPeriod, turnover, marketValue, winRate, holdings, summary FROM institutes WHERE cik = ?", (cik,)) cik_data = cursor.fetchall() res = [{ 'cik': row[0], @@ -1422,9 +1422,10 @@ async def get_hedge_funds_data(data: GetCIKData): 'marketValue': row[6], 'winRate': row[7], 'holdings': ujson.loads(row[8]), + 'summary': ujson.loads(row[9]), } for row in cik_data] - res_json = ujson.dumps(res).encode('utf-8') + res_json = ujson.dumps(res[0]).encode('utf-8') compressed_data = gzip.compress(res_json) redis_client.set(cache_key, compressed_data)