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.")
예제 #4
0
    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
예제 #8
0
    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}")
예제 #12
0
    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)