def WriteJsonToFile(self, directory: EJsonFolder, filename: str, jsonObject: dict): try: with open(f'{PathHelper.JsonRoot()}\\{directory.value}\\{filename.upper()}.json', 'w') as outfile: dump(jsonObject, outfile) Logger.LogInfo( f"Successful JSON file creation of {filename} in {directory.value}!") except: Logger.LogError(f"Failure JSON file creation of {filename}!")
def GenerateJsonSymbolOverviewRepository( self, eJsonFolder: EJsonFolder = EJsonFolder.NONE): Logger.LogInfo("Generating filtered symbols.") filteredSymbols = self.__symbolListGenerator__.CreateFilteredListOfSymbols( [EJsonFolder.OVERVIEW, eJsonFolder]) Logger.LogInfo("Passing filtered symbols to AlphaAPIHTTP.") self.__apiagent___.GetCompanyOverviewFromJsonAPIAndWriteToJSONFileBatch( filteredSymbols) Logger.LogInfo("Finished getting filter list from AlphaAPIHTTP.")
def GenerateJsonSymbolEarningsRepositories( self, eJsonFolder: EJsonFolder = EJsonFolder.NONE): Logger.LogInfo("Generating filtered symbols.") filteredSymbols = self.__symbolListGenerator__.CreateFilteredListOfSymbols( [EJsonFolder.QUARTERLYBALANCE, eJsonFolder]) Logger.LogInfo("Passing filtered symbols to AlphaAPIHTTP.") self.__apiagent___.GetEarningsDataFromJsonAPIAndWriteToJSONFileBatch( filteredSymbols) Logger.LogInfo("Finished getting filter list from AlphaAPIHTTP.")
def ExecuteSql(self, sql: str, preparedJsonTuple: tuple): if len(preparedJsonTuple) != 0: try: self.__cursor__.executemany(sql, preparedJsonTuple) self.__connection__.commit() Logger.LogInfo( f"Inserted {preparedJsonTuple}") except pyodbc.Error as ex: Logger.LogError( f"failed to insert {preparedJsonTuple} {ex}")
def GenerateJsonSymbolPriceRepository( self, eJsonFolder: EJsonFolder = EJsonFolder.NONE, payload: EPayload = EPayload.FULL): Logger.LogInfo("Generating filtered symbols.") filteredSymbols = self.__symbolListGenerator__.CreateFilteredListOfSymbols( [EJsonFolder.PRICES, eJsonFolder]) Logger.LogInfo("Passing filtered symbols to AlphaAPIHTTP.") self.__apiagent___.GetHistoricalPriceDataFromJsonAPIAndWriteToJSONFileBatch( filteredSymbols, payload) Logger.LogInfo("Finished getting filter list from AlphaAPIHTTP.")
def OpenJsonFile(self, directory: EJsonFolder, filename: str): self.__oldJsonFilePath__ = f"{PathHelper.JsonRoot()}\\{directory.value}\\{filename}" symbol = filename.replace('.json', "") try: with open(self.__oldJsonFilePath__) as jsonFile: jsonData = json.load(jsonFile) return [symbol, jsonData] except: Logger.LogError( f"Couldn't open file at {self.__oldJsonFilePath__}") return []
def FliterRedoList(self, listOfPersistedSymbols: list): jsonPath = f"{self.GetParentPath()}\{EJsonFolder.REDO.value}" filesInRedoFolder = self.GetListFromRedoDirectory() for file in listOfPersistedSymbols: if file in filesInRedoFolder: filesInRedoFolder.remove(file) Logger.LogInfo( f"Removed file {file}.json from {self.__parentDirectory__.value}\redo because it already exist in {self.__parentDirectory__.value}\done." ) os.remove(f"{jsonPath}\\{file}.json") return filesInRedoFolder
def InitializeJson(self): jsonList = self.__jsonIo__.ReadJsonFromFile( self.eJsonFolderContext) try: symbol = jsonList[0] jsonData = jsonList[1] except IndexError: symbol = '' jsonData = {"done": "done"} Logger.LogInfo( "Json Price Batch Job is Finished, because there was no file to be retrieved from the folder.") return [symbol, jsonData]
def GetHistoricalPriceDataFromJsonAPI(self, symbol: str, payload: EPayload): SYMBOL = symbol.upper() SIZE = payload.value ROUTE = f'function=TIME_SERIES_DAILY&symbol={SYMBOL}&outputsize={SIZE}&apikey={self.__APIKEY__}' URI = self.__BASEURL__ + ROUTE self.__response__ = requests.get(URI) try: if self.__response__.status_code == 200: Logger.LogInfo(f" {SYMBOL} : Success!") return self.__response__.json()['Time Series (Daily)'] Logger.LogError(f"Server error!") except KeyError: try: Logger.LogInfo( f" {SYMBOL} : {self.__response__.json()['Error Message']}") return self.__response__.json()['Error Message'] except: Logger.LogInfo( f" {SYMBOL} : {self.__response__.json()['Information']}") return self.__response__.json()['Information']
def GetHistoricalPriceDataFromJsonAPIAndWriteToJSONFileBatch(self, symbolList: List, payload: EPayload): for symbol in symbolList: jsonResponse = self.GetHistoricalPriceDataFromJsonAPI( symbol, payload) if r"https://www.alphavantage.co/premium/" in jsonResponse: Logger.LogInfo( f"You reached the daily request limit!") break self.__jsonIo__.WriteJsonToFile( EJsonFolder.PRICES, symbol, jsonResponse) sleep(self.__timeout__)
def MoveJsonFile(self, directory: EJsonFolder, subDirectory: EJsonFolder, filename: str): newJsonFilePath = f"{PathHelper.JsonRoot()}\\{directory.value}\\{subDirectory.value}\\{filename}" os.replace(self.__oldJsonFilePath__, newJsonFilePath) Logger.LogInfo( f" Moved file from {self.__oldJsonFilePath__} to {newJsonFilePath}")
def PrepareJsonForSQL(self, jsonData: dict, symbol: str, preparedJsonList: list): if self.eJsonFolderContext == EJsonFolder.OVERVIEW: try: Symbol = symbol Currency = jsonData['Currency'] AssetType = jsonData['AssetType'] Name = jsonData['Name'] Description = jsonData['Description'] Exchange = jsonData['Exchange'] Country = jsonData['Country'] Sector = jsonData['Sector'] Industry = jsonData['Industry'] preparedJsonList.extend( [Symbol, Currency, AssetType, Name, Description, Exchange, Country, Sector, Industry]) except TypeError: self.SwapFiles(symbol) Logger.LogError( f"Needs to be pulled again {symbol}.") except KeyError: self.SwapFiles(symbol) Logger.LogError( f"No info for {symbol}.") return [] if [tuple(preparedJsonList)] == [()] or [tuple(preparedJsonList)] == [[]] else [tuple(preparedJsonList)] if self.eJsonFolderContext == EJsonFolder.PRICES: for key in jsonData: try: Symbol = symbol Date = jsonData[key] OpenPrice = jsonData[key]["1. open"] HighPrice = jsonData[key]["2. high"] LowPrice = jsonData[key]["3. low"] ClosePrice = jsonData[key]["4. close"] Volume = jsonData[key]["5. volume"] preparedJsonList.append( [Symbol, Date, OpenPrice, HighPrice, LowPrice, ClosePrice, Volume]) except TypeError: self.SwapFiles(symbol) Logger.LogError( f"Needs to be pulled again {symbol}.") break if self.eJsonFolderContext == EJsonFolder.ANNUALINCOME or self.eJsonFolderContext == EJsonFolder.QUARTERLYINCOME: for key in jsonData: try: Symbol = symbol FilingType = "A" if "annual" in self.eJsonFolderContext.value else "Q" FiscalDateEnding = key['fiscalDateEnding'] ReportedCurrency = key['reportedCurrency'] Investments = key['investments'] ChangeInLiabilities = key['changeInLiabilities'] CashflowFromInvestment = key['cashflowFromInvestment'] OtherCashflowFromInvestment = key['otherCashflowFromInvestment'] NetBorrowings = key['netBorrowings'] CashflowFromFinancing = key['cashflowFromFinancing'] OtherCashflowFromFinancing = key['otherCashflowFromFinancing'] ChangeInOperatingActivities = key['changeInOperatingActivities'] NetIncome = key['netIncome'] ChangeInCash = key['changeInCash'] OperatingCashflow = key['operatingCashflow'] OtherOperatingCashflow = key['otherOperatingCashflow'] Depreciation = key['depreciation'] DividendPayout = key['dividendPayout'] StockSaleAndPurchase = key['stockSaleAndPurchase'] ChangeInInventory = key['changeInInventory'] ChangeInAccountReceivables = key['changeInAccountReceivables'] ChangeInNetIncome = key['changeInNetIncome'] CapitalExpenditures = key['capitalExpenditures'] ChangeInReceivables = key['changeInReceivables'] ChangeInExchangeRate = key['changeInExchangeRate'] ChangeInCashAndCashEquivalents = key['changeInCashAndCashEquivalents'] preparedJsonList.append([Symbol, FilingType, FiscalDateEnding, ReportedCurrency, Investments, ChangeInLiabilities, CashflowFromInvestment, OtherCashflowFromInvestment, NetBorrowings, CashflowFromFinancing, OtherCashflowFromFinancing, ChangeInOperatingActivities, NetIncome, ChangeInCash, OperatingCashflow, OtherOperatingCashflow, Depreciation, DividendPayout, StockSaleAndPurchase, ChangeInInventory, ChangeInAccountReceivables, ChangeInNetIncome, CapitalExpenditures, ChangeInReceivables, ChangeInExchangeRate, ChangeInCashAndCashEquivalents]) except TypeError: self.SwapFiles(symbol) Logger.LogError( f"Needs to be pulled again {symbol}.") break if self.eJsonFolderContext == EJsonFolder.ANNUALBALANCE or self.eJsonFolderContext == EJsonFolder.QUARTERLYBALANCE: for key in jsonData: try: Symbol = symbol FilingType = "A" if "annual" in self.eJsonFolderContext.value else "Q" FiscalDateEnding = key['fiscalDateEnding'] ReportedCurrency = key['reportedCurrency'] TotalAssets = key['totalAssets'] IntangibleAssets = key['intangibleAssets'] EarningAssets = key['earningAssets'] OtherCurrentAssets = key['otherCurrentAssets'] TotalLiabilities = key['totalLiabilities'] TotalShareholderEquity = key['totalShareholderEquity'] DeferredLongTermLiabilities = key['deferredLongTermLiabilities'] OtherCurrentLiabilities = key['otherCurrentLiabilities'] CommonStock = key['commonStock'] RetainedEarnings = key['retainedEarnings'] OtherLiabilities = key['otherLiabilities'] Goodwill = key['goodwill'] OtherAssets = key['otherAssets'] Cash = key['cash'] TotalCurrentLiabilities = key['totalCurrentLiabilities'] ShortTermDebt = key['shortTermDebt'] CurrentLongTermDebt = key['currentLongTermDebt'] OtherShareholderEquity = key['otherShareholderEquity'] PropertyPlantEquipment = key['propertyPlantEquipment'] TotalCurrentAssets = key['totalCurrentAssets'] LongTermInvestments = key['longTermInvestments'] NetTangibleAssets = key['netTangibleAssets'] ShortTermInvestments = key['shortTermInvestments'] NetReceivables = key['netReceivables'] LongTermDebt = key['longTermDebt'] Inventory = key['inventory'] AccountsPayable = key['accountsPayable'] TotalPermanentEquity = key['totalPermanentEquity'] AdditionalPaidInCapital = key['additionalPaidInCapital'] CommonStockTotalEquity = key['commonStockTotalEquity'] PreferredStockTotalEquity = key['preferredStockTotalEquity'] RetainedEarningsTotalEquity = key['retainedEarningsTotalEquity'] TreasuryStock = key['treasuryStock'] AccumulatedAmortization = key['accumulatedAmortization'] OtherNonCurrrentAssets = key['otherNonCurrrentAssets'] DeferredLongTermAssetCharges = key['deferredLongTermAssetCharges'] TotalNonCurrentAssets = key['totalNonCurrentAssets'] CapitalLeaseObligations = key['capitalLeaseObligations'] TotalLongTermDebt = key['totalLongTermDebt'] OtherNonCurrentLiabilities = key['otherNonCurrentLiabilities'] TotalNonCurrentLiabilities = key['totalNonCurrentLiabilities'] NegativeGoodwill = key['negativeGoodwill'] Warrants = key['warrants'] PreferredStockRedeemable = key['preferredStockRedeemable'] CapitalSurplus = key['capitalSurplus'] LiabilitiesAndShareholderEquity = key['liabilitiesAndShareholderEquity'] CashAndShortTermInvestments = key['cashAndShortTermInvestments'] AccumulatedDepreciation = key['accumulatedDepreciation'] CommonStockSharesOutstanding = key['commonStockSharesOutstanding'] preparedJsonList.append([Symbol, FilingType, FiscalDateEnding, ReportedCurrency, TotalAssets, IntangibleAssets, EarningAssets, OtherCurrentAssets, TotalLiabilities, TotalShareholderEquity, DeferredLongTermLiabilities, OtherCurrentLiabilities, CommonStock, RetainedEarnings, OtherLiabilities, Goodwill, OtherAssets, Cash, TotalCurrentLiabilities, ShortTermDebt, CurrentLongTermDebt, OtherShareholderEquity, PropertyPlantEquipment, TotalCurrentAssets, LongTermInvestments, NetTangibleAssets, ShortTermInvestments, NetReceivables, LongTermDebt, Inventory, AccountsPayable, TotalPermanentEquity, AdditionalPaidInCapital, CommonStockTotalEquity, PreferredStockTotalEquity, RetainedEarningsTotalEquity, TreasuryStock, AccumulatedAmortization, OtherNonCurrrentAssets, DeferredLongTermAssetCharges, TotalNonCurrentAssets, CapitalLeaseObligations, TotalLongTermDebt, OtherNonCurrentLiabilities, TotalNonCurrentLiabilities, NegativeGoodwill, Warrants, PreferredStockRedeemable, CapitalSurplus, LiabilitiesAndShareholderEquity, CashAndShortTermInvestments, AccumulatedDepreciation, CommonStockSharesOutstanding]) except TypeError: self.SwapFiles(symbol) Logger.LogError( f"Needs to be pulled again {symbol}.") break if self.eJsonFolderContext == EJsonFolder.ANNUALCASH or self.eJsonFolderContext == EJsonFolder.QUARTERLYCASH: for key in jsonData: try: Symbol = symbol FilingType = "A" if "annual" in self.eJsonFolderContext.value else "Q" FiscalDateEnding = key['fiscalDateEnding'] ReportedCurrency = key['reportedCurrency'] TotalRevenue = key['totalRevenue'] TotalOperatingExpense = key['totalOperatingExpense'] CostOfRevenue = key['costOfRevenue'] GrossProfit = key['grossProfit'] Ebit = key['ebit'] NetIncome = key['netIncome'] ResearchAndDevelopment = key['researchAndDevelopment'] EffectOfAccountingCharges = key['effectOfAccountingCharges'] IncomeBeforeTax = key['incomeBeforeTax'] MinorityInterest = key['minorityInterest'] SellingGeneralAdministrative = key['sellingGeneralAdministrative'] OtherNonOperatingIncome = key['otherNonOperatingIncome'] OperatingIncome = key['operatingIncome'] OtherOperatingExpense = key['otherOperatingExpense'] InterestExpense = key['interestExpense'] TaxProvision = key['taxProvision'] InterestIncome = key['interestIncome'] NetInterestIncome = key['netInterestIncome'] ExtraordinaryItems = key['extraordinaryItems'] NonRecurring = key['nonRecurring'] OtherItems = key['otherItems'] IncomeTaxExpense = key['incomeTaxExpense'] TotalOtherIncomeExpense = key['totalOtherIncomeExpense'] DiscontinuedOperations = key['discontinuedOperations'] NetIncomeFromContinuingOperations = key['netIncomeFromContinuingOperations'] NetIncomeApplicableToCommonShares = key['netIncomeApplicableToCommonShares'] PreferredStockAndOtherAdjustments = key['preferredStockAndOtherAdjustments'] preparedJsonList.append([Symbol, FilingType, FiscalDateEnding, ReportedCurrency, TotalRevenue, TotalOperatingExpense, CostOfRevenue, GrossProfit, Ebit, NetIncome, ResearchAndDevelopment, EffectOfAccountingCharges, IncomeBeforeTax, MinorityInterest, SellingGeneralAdministrative, OtherNonOperatingIncome, OperatingIncome, OtherOperatingExpense, InterestExpense, TaxProvision, InterestIncome, NetInterestIncome, ExtraordinaryItems, NonRecurring, OtherItems, IncomeTaxExpense, TotalOtherIncomeExpense, DiscontinuedOperations, NetIncomeFromContinuingOperations, NetIncomeApplicableToCommonShares, PreferredStockAndOtherAdjustments]) except TypeError: self.SwapFiles(symbol) Logger.LogError( f"Needs to be pulled again {symbol}.") break return self.TransformValues(preparedJsonList)