From a688d231584b7fd4a6898d3c3d403ddaff4497b1 Mon Sep 17 00:00:00 2001 From: Bergant <darko.bergant@adacta.si> Date: Tue, 31 Mar 2015 05:38:28 +0200 Subject: [PATCH] readme readme --- .Rbuildignore | 3 +- README.Rmd | 15 +- img/README-graph1-1.png | Bin 0 -> 7024 bytes img/README-graph2-1.png | Bin 0 -> 7023 bytes img/README-graph3-1.png | Bin 0 -> 7059 bytes readme.md | 459 +++++++++++++++++----------------------- 6 files changed, 206 insertions(+), 271 deletions(-) create mode 100644 img/README-graph1-1.png create mode 100644 img/README-graph2-1.png create mode 100644 img/README-graph3-1.png diff --git a/.Rbuildignore b/.Rbuildignore index 88c8dac..2fdf8c7 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,4 +1,5 @@ ^.*\.Rproj$ ^\.Rproj\.user$ ^README\.Rmd$ -^README\.html$ \ No newline at end of file +^README\.html$ +^IMG$ diff --git a/README.Rmd b/README.Rmd index 9147d8a..7f822c4 100644 --- a/README.Rmd +++ b/README.Rmd @@ -1,10 +1,17 @@ --- -title: finstr - Financial Statements in R +title: "finstr - Financial Statements in R" output: - html_document: - keep_md: yes + md_document: + variant: markdown_github --- +```{r, echo = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "IMG/README-" +) +``` ```{r, echo=FALSE, results='hide', message=FALSE } library(dplyr) @@ -289,7 +296,7 @@ balance_sheet %>% ## See the difference We can use the same custom hierarchy on lagged differences. -```{r graph3, fig.width=7.3} +```{r graph3, fig.width=8} balance_sheet %>% diff() %>% diff --git a/img/README-graph1-1.png b/img/README-graph1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d9484b4b0e71eee7e5d94711ee3ab6e4dc70557 GIT binary patch literal 7024 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 literal 0 HcmV?d00001 diff --git a/img/README-graph2-1.png b/img/README-graph2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8178b56845c36c50694f591c9dfb9396c7df3f0e GIT binary patch literal 7023 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 literal 0 HcmV?d00001 diff --git a/img/README-graph3-1.png b/img/README-graph3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1d865dbabd1589a5b674a10bebb63f7091f093f1 GIT binary patch literal 7059 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index f1bd89b..54ab757 100644 --- a/readme.md +++ b/readme.md @@ -1,30 +1,20 @@ -# finstr - Financial Statements in R +**Warning: finstr package is in development. Please use with caution.** +The purpose of finstr package is to use financial statements data in more structured form and process. For now it is offering: +1. Data structure for financial statements in tidy and usable format +2. Validate statement calculations +3. Function to merge two reporting periods into single object +4. Calculations on statements data and lagged difference calculation +The idea in long term is to create an environment for reproducible financial statement analysis. With existing packages like XBRL for XBRL parsing, dplyr for data manipulation and knitr for reproducible research, this shouldn't be a long journey. -**Warning: finstr package is in development. -Please use with caution.** +Get data +-------- -The purpose of finstr package is to use financial statements -data in more structured form and process. -For now it is offering: - -1. Data structure for financial statements in tidy and usable format -2. Validate statement calculations -3. Function to merge two reporting periods into single object -4. Calculations on statements data and lagged difference calculation - -The idea in long term is to create an environment for reproducible financial -statement analysis. With existing packages like XBRL for XBRL parsing, -dplyr for data manipulation and knitr for reproducible research, this -shouldn't be a long journey. - - -## Get data Use XBRL package to parse XBRL files. For example: -```r +``` {.r} library(XBRL) # parse XBRL (Apple 10-K report) xbrl_url2014 <- @@ -35,177 +25,148 @@ xbrl_data_aapl2014 <- xbrlDoAll(xbrl_url2014) xbrl_data_aapl2013 <- xbrlDoAll(xbrl_url2013) ``` -## Prepare statements -With `xbrl_get_statements` convert XBRL data to *statements* object. +Prepare statements +------------------ -```r +With `xbrl_get_statements` convert XBRL data to *statements* object. + +``` {.r} library(finstr) st2013 <- xbrl_get_statements(xbrl_data_aapl2013) st2014 <- xbrl_get_statements(xbrl_data_aapl2014) st2014 +#> Financial statements repository +#> From To Rows Columns +#> StatementOfIncome 2012-09-29 2014-09-27 3 15 +#> StatementOfOtherComprehensiveIncome 2012-09-29 2014-09-27 3 14 +#> StatementOfFinancialPositionClassified 2013-09-28 2014-09-27 2 33 +#> StatementOfCashFlowsIndirect 2012-09-29 2014-09-27 3 33 ``` -``` -## Financial statements repository -## From To Rows Columns -## StatementOfIncome 2012-09-29 2014-09-27 3 15 -## StatementOfOtherComprehensiveIncome 2012-09-29 2014-09-27 3 14 -## StatementOfFinancialPositionClassified 2013-09-28 2014-09-27 2 33 -## StatementOfCashFlowsIndirect 2012-09-29 2014-09-27 3 33 -``` - -Statements object is a list of -several statement objects (ballance sheets, income and cash -flow statements) which are data frames with elements as columns and periods -as rows. -To get a single *statement* use *statements* object as a regular R list: +Statements object is a list of several statement objects (ballance sheets, income and cash flow statements) which are data frames with elements as columns and periods as rows. To get a single *statement* use *statements* object as a regular R list: -```r +``` {.r} balance_sheet2013 <- st2013$StatementOfFinancialPositionClassified balance_sheet2014 <- st2014$StatementOfFinancialPositionClassified income2013 <- st2013$StatementOfIncome income2014 <- st2014$StatementOfIncome balance_sheet2014 -``` - -``` -## Financial statement: 2 observations from 2013-09-28 to 2014-09-27 -## Numbers in 000000 -## 2014-09-27 2013-09-28 -## Assets = 231839 207000 -## + AssetsCurrent = 68531 73286 -## + CashAndCashEquivalentsAtCarryingValue 13844 14259 -## + AvailableForSaleSecuritiesCurrent 11233 26287 -## + AccountsReceivableNetCurrent 17460 13102 -## + InventoryNet 2111 1764 -## + DeferredTaxAssetsNetCurrent 4318 3453 -## + NontradeReceivablesCurrent 9759 7539 -## + OtherAssetsCurrent 9806 6882 -## + AvailableForSaleSecuritiesNoncurrent 130162 106215 -## + PropertyPlantAndEquipmentNet 20624 16597 -## + Goodwill 4616 1577 -## + IntangibleAssetsNetExcludingGoodwill 4142 4179 -## + OtherAssetsNoncurrent 3764 5146 -## LiabilitiesAndStockholdersEquity = 231839 207000 -## + Liabilities = 120292 83451 -## + LiabilitiesCurrent = 63448 43658 -## + AccountsPayableCurrent 30196 22367 -## + AccruedLiabilitiesCurrent 18453 13856 -## + DeferredRevenueCurrent 8491 7435 -## + CommercialPaper 6308 0 -## + DeferredRevenueNoncurrent 3031 2625 -## + LongTermDebt 28987 16960 -## + OtherLiabilitiesNoncurrent 24826 20208 -## + CommitmentsAndContingencies 0 0 -## + StockholdersEquity = 111547 123549 -## + CommonStocksIncludingAdditionalPaidInCapital 23313 19764 -## + RetainedEarningsAccumulatedDeficit 87152 104256 -## + AccumulatedOtherComprehensiveIncomeLossNetOfTa 1082 -471 -``` - -```r +#> Financial statement: 2 observations from 2013-09-28 to 2014-09-27 +#> Numbers in 000000 +#> 2014-09-27 2013-09-28 +#> Assets = 231839 207000 +#> + AssetsCurrent = 68531 73286 +#> + CashAndCashEquivalentsAtCarryingValue 13844 14259 +#> + AvailableForSaleSecuritiesCurrent 11233 26287 +#> + AccountsReceivableNetCurrent 17460 13102 +#> + InventoryNet 2111 1764 +#> + DeferredTaxAssetsNetCurrent 4318 3453 +#> + NontradeReceivablesCurrent 9759 7539 +#> + OtherAssetsCurrent 9806 6882 +#> + AvailableForSaleSecuritiesNoncurrent 130162 106215 +#> + PropertyPlantAndEquipmentNet 20624 16597 +#> + Goodwill 4616 1577 +#> + IntangibleAssetsNetExcludingGoodwill 4142 4179 +#> + OtherAssetsNoncurrent 3764 5146 +#> LiabilitiesAndStockholdersEquity = 231839 207000 +#> + Liabilities = 120292 83451 +#> + LiabilitiesCurrent = 63448 43658 +#> + AccountsPayableCurrent 30196 22367 +#> + AccruedLiabilitiesCurrent 18453 13856 +#> + DeferredRevenueCurrent 8491 7435 +#> + CommercialPaper 6308 0 +#> + DeferredRevenueNoncurrent 3031 2625 +#> + LongTermDebt 28987 16960 +#> + OtherLiabilitiesNoncurrent 24826 20208 +#> + CommitmentsAndContingencies 0 0 +#> + StockholdersEquity = 111547 123549 +#> + CommonStocksIncludingAdditionalPaidInCapital 23313 19764 +#> + RetainedEarningsAccumulatedDeficit 87152 104256 +#> + AccumulatedOtherComprehensiveIncomeLossNetOfTa 1082 -471 tail(income2014, 2) -``` - -``` -## Financial statement: 2 observations from 2013-09-28 to 2014-09-27 -## Numbers in 000000 -## 2014-09-27 2013-09-28 -## NetIncomeLoss = 39510 37037 -## + IncomeLossFromContinuingOperationsBeforeIncomeTa 53483 50155 -## + OperatingIncomeLoss = 52503 48999 -## + GrossProfit = 70537 64304 -## + SalesRevenueNet 182795 170910 -## - CostOfGoodsAndServicesSold 112258 106606 -## - OperatingExpenses = 18034 15305 -## + ResearchAndDevelopmentExpense 6041 4475 -## + SellingGeneralAndAdministrativeExpense 11993 10830 -## + NonoperatingIncomeExpense 980 1156 -## - IncomeTaxExpenseBenefitNA 13973 13118 -``` - - -Information about hierarchical structure of elements (concepts) is stored -as an attribute to the statement object. - -To get more data about the concepts used in the statement call `get_elements`: - -```r +#> Financial statement: 2 observations from 2013-09-28 to 2014-09-27 +#> Numbers in 000000 +#> 2014-09-27 2013-09-28 +#> NetIncomeLoss = 39510 37037 +#> + IncomeLossFromContinuingOperationsBeforeIncomeTa 53483 50155 +#> + OperatingIncomeLoss = 52503 48999 +#> + GrossProfit = 70537 64304 +#> + SalesRevenueNet 182795 170910 +#> - CostOfGoodsAndServicesSold 112258 106606 +#> - OperatingExpenses = 18034 15305 +#> + ResearchAndDevelopmentExpense 6041 4475 +#> + SellingGeneralAndAdministrativeExpense 11993 10830 +#> + NonoperatingIncomeExpense 980 1156 +#> - IncomeTaxExpenseBenefitNA 13973 13118 +``` + +Information about hierarchical structure of elements (concepts) is stored as an attribute to the statement object. + +To get more data about the concepts used in the statement call `get_elements`: + +``` {.r} bs_els <- get_elements(balance_sheet2014) ``` -Elements store concept descriptions, balance attribute (debit/credit) and -parent/child relationships between concepts. +Elements store concept descriptions, balance attribute (debit/credit) and parent/child relationships between concepts. -## Validate statement calculation hierarchy -Recalculate higher order concepts from basic values and check for errors. +Validate statement calculation hierarchy +---------------------------------------- +Recalculate higher order concepts from basic values and check for errors. -```r +``` {.r} errors <- check_statement(balance_sheet2014) errors +#> Number of errors: 0 +#> Number of elements in errors: 0 ``` -``` -## Number of errors: 0 -## Number of elements in errors: 0 -``` - +Merge statements from different periods +--------------------------------------- -## Merge statements from different periods -Use `merge` function to create single financial statement data from two -statements. +Use `merge` function to create single financial statement data from two statements. -```r +``` {.r} balance_sheet <- merge( balance_sheet2013, balance_sheet2014 ) ``` -The structure of merged balance sheets may differ if XBRL -taxonomy changed. -Function `merge` takes care of it by expanding the elements -hierarchy to fit both statements. -The values of any missing elements is set to 0. +The structure of merged balance sheets may differ if XBRL taxonomy changed. Function `merge` takes care of it by expanding the elements hierarchy to fit both statements. The values of any missing elements is set to 0. To merge all statements from *statements* object use merge on statements objects: -```r +``` {.r} # merge all statements st_all <- merge( st2013, st2014 ) # check if blance sheets are merged: balance_sheet <- st_all$StatementOfFinancialPositionClassified ``` -## Calculate new values and ratios -Statement object (in our case `balance_sheet`) is also a data frame object. -With elements (or concepts) as columns and time periods as rows. -It is possible then to use statement as a data frame. +Calculate new values and ratios +------------------------------- -Lets calculate current ratio which is defined by +Statement object (in our case `balance_sheet`) is also a data frame object. With elements (or concepts) as columns and time periods as rows. It is possible then to use statement as a data frame. -$$ Current Ratio = \frac{Current Assets}{Current Liabilities} $$ +Lets calculate current ratio which is defined by +\[ Current Ratio = \frac{Current Assets}{Current Liabilities} \] -```r +``` {.r} library(dplyr) balance_sheet %>% mutate(CurrentRatio = AssetsCurrent / LiabilitiesCurrent) %>% select(endDate, CurrentRatio) +#> endDate CurrentRatio +#> 1 2012-09-29 1.495849 +#> 2 2013-09-28 1.678639 +#> 3 2014-09-27 1.080113 ``` -``` -## endDate CurrentRatio -## 1 2012-09-29 1.495849 -## 2 2013-09-28 1.678639 -## 3 2014-09-27 1.080113 -``` - -By using `calculate` function we can achieve the same result with -less verbose language. Lets calculate now two ratios: - +By using `calculate` function we can achieve the same result with less verbose language. Lets calculate now two ratios: -```r +``` {.r} library(dplyr) balance_sheet %>% calculate( @@ -219,30 +180,22 @@ balance_sheet %>% calculate( ) / LiabilitiesCurrent ) +#> date Current_Ratio Quick_Ratio +#> 1 2012-09-29 1.495849e-06 1.039360e-06 +#> 2 2013-09-28 1.678639e-06 1.228824e-06 +#> 3 2014-09-27 1.080113e-06 6.704230e-07 ``` -``` -## date Current_Ratio Quick_Ratio -## 1 2012-09-29 1.495849e-06 1.039360e-06 -## 2 2013-09-28 1.678639e-06 1.228824e-06 -## 3 2014-09-27 1.080113e-06 6.704230e-07 -``` - - -If we need a period average value we can use a `lag` function. -For example, to calculate *DSO* (days sales outstanding) over longer periods -the average of account receivable is compared to net sales. +If we need a period average value we can use a `lag` function. For example, to calculate *DSO* (days sales outstanding) over longer periods the average of account receivable is compared to net sales. We will use the formula for yearly preiods: -$$ DSO = \frac{Average Accounts Receivable}{Sales Revenue} \times 365 $$ +\[ DSO = \frac{Average Accounts Receivable}{Sales Revenue} \times 365 \] -In this case we need to connect two type of statements: balance sheets and -income statements. With matching reporting periods it can be accomplished -with joining two data frames: +In this case we need to connect two type of statements: balance sheets and income statements. With matching reporting periods it can be accomplished with joining two data frames: +``` {.r} -```r balance_sheet %>% inner_join( st_all$StatementOfIncome, by = "endDate") %>% calculate( @@ -250,27 +203,21 @@ balance_sheet %>% .AccountReceivableAvg = (.AccountReceivableLast + AccountsReceivableNetCurrent)/2, DaysSalesOutstanding = .AccountReceivableAvg / SalesRevenueNet * 365 ) +#> Warning in min(x[["decimals"]], na.rm = TRUE): no non-missing arguments to +#> min; returning Inf +#> date DaysSalesOutstanding +#> 1 2012-09-29 NA +#> 2 2013-09-28 Inf +#> 3 2014-09-27 Inf ``` -``` -## Warning in min(x[["decimals"]], na.rm = TRUE): no non-missing arguments to -## min; returning Inf -``` - -``` -## date DaysSalesOutstanding -## 1 2012-09-29 NA -## 2 2013-09-28 Inf -## 3 2014-09-27 Inf -``` - -The leading dot instructs the calculate function to hide the value. In our case -only DaysSalesOutstanding is selected in final result. +The leading dot instructs the calculate function to hide the value. In our case only DaysSalesOutstanding is selected in final result. Use digits parameter to control rounding: +``` {.r} + -```r st_all$StatementOfIncome %>% calculate( digits = 2, Gross_Margin = @@ -283,20 +230,16 @@ st_all$StatementOfIncome %>% calculate( digits = 2, NetIncomeLoss / SalesRevenueNet ) +#> date Gross_Margin Operating_Margin Net_Margin +#> 1 2011-09-24 4.0e-07 3.1e-07 2.4e-07 +#> 2 2012-09-29 4.4e-07 3.5e-07 2.7e-07 +#> 3 2013-09-28 3.8e-07 2.9e-07 2.2e-07 +#> 4 2014-09-27 3.9e-07 2.9e-07 2.2e-07 ``` -``` -## date Gross_Margin Operating_Margin Net_Margin -## 1 2011-09-24 4.0e-07 3.1e-07 2.4e-07 -## 2 2012-09-29 4.4e-07 3.5e-07 2.7e-07 -## 3 2013-09-28 3.8e-07 2.9e-07 2.2e-07 -## 4 2014-09-27 3.9e-07 2.9e-07 2.2e-07 -``` - -When running same calculation for different statements, store the -calculation with `calculation` and run with `do_calculation`: +When running same calculation for different statements, store the calculation with `calculation` and run with `do_calculation`: -```r +``` {.r} # define calculation profit_margins <- calculation( @@ -314,85 +257,70 @@ profit_margins <- calculation( # run profit margins for two different statements income2013 %>% do_calculation(profit_margins) -``` - -``` -## date Gross_Margin Operating_Margin Net_Margin -## 1 2011-09-24 4.05e-07 3.12e-07 2.39e-07 -## 2 2012-09-29 4.39e-07 3.53e-07 2.67e-07 -## 3 2013-09-28 3.76e-07 2.87e-07 2.17e-07 -``` - -```r +#> date Gross_Margin Operating_Margin Net_Margin +#> 1 2011-09-24 4.05e-07 3.12e-07 2.39e-07 +#> 2 2012-09-29 4.39e-07 3.53e-07 2.67e-07 +#> 3 2013-09-28 3.76e-07 2.87e-07 2.17e-07 income2014 %>% do_calculation(profit_margins) +#> date Gross_Margin Operating_Margin Net_Margin +#> 1 2012-09-29 4.39e-07 3.53e-07 2.67e-07 +#> 2 2013-09-28 3.76e-07 2.87e-07 2.17e-07 +#> 3 2014-09-27 3.86e-07 2.87e-07 2.16e-07 ``` -``` -## date Gross_Margin Operating_Margin Net_Margin -## 1 2012-09-29 4.39e-07 3.53e-07 2.67e-07 -## 2 2013-09-28 3.76e-07 2.87e-07 2.17e-07 -## 3 2014-09-27 3.86e-07 2.87e-07 2.16e-07 -``` - +Lagged difference +----------------- -##Lagged difference -To calculate lagged difference for entire statement use `diff` function. -The result is statement of changes between successive years: +To calculate lagged difference for entire statement use `diff` function. The result is statement of changes between successive years: +``` {.r} -```r balance_sheet %>% diff() -``` +#> Financial statement: 2 observations from 2013-09-28 to 2014-09-27 +#> Numbers in 000000 +#> 2014-09-27 2013-09-28 +#> Assets = 24839 30936 +#> + AssetsCurrent = -4755 15633 +#> + CashAndCashEquivalentsAtCarryingValue -415 3513 +#> + AvailableForSaleSecuritiesCurrent -15054 7904 +#> + AccountsReceivableNetCurrent 4358 2172 +#> + InventoryNet 347 973 +#> + DeferredTaxAssetsNetCurrent 865 870 +#> + NontradeReceivablesCurrent 2220 -223 +#> + OtherAssetsCurrent 2924 424 +#> + AvailableForSaleSecuritiesNoncurrent 23947 14093 +#> + PropertyPlantAndEquipmentNet 4027 1145 +#> + Goodwill 3039 442 +#> + IntangibleAssetsNetExcludingGoodwill -37 -45 +#> + OtherAssetsNoncurrent -1382 -332 +#> LiabilitiesAndStockholdersEquity = 24839 30936 +#> + Liabilities = 36841 25597 +#> + LiabilitiesCurrent = 19790 5116 +#> + AccountsPayableCurrent 7829 1192 +#> + AccruedLiabilitiesCurrent 4597 2442 +#> + DeferredRevenueCurrent 1056 1482 +#> + CommercialPaper 6308 0 +#> + DeferredRevenueNoncurrent 406 -23 +#> + LongTermDebt 12027 16960 +#> + OtherLiabilitiesNoncurrent 4618 3544 +#> + CommitmentsAndContingencies 0 0 +#> + StockholdersEquity = -12002 5339 +#> + CommonStockValue 0 -16422 +#> + RetainedEarningsAccumulatedDeficit -17104 2967 +#> + AccumulatedOtherComprehensiveIncomeLossNetOfTa 1553 -970 +#> + CommonStocksIncludingAdditionalPaidInCapitalNA 3549 19764 +``` + +Balance sheet visualization +=========================== + +Prepare custom calculation hierarchy +------------------------------------ + +There is no human readable way to plot every number of the balance sheet in one graph. The only way to plot a balance sheet is to plot it several times. Each graph should have a limited number of highlited features. The first step is to break a balance sheet to a small number of pieces. We can use calculations to specify these groups of elements. + +``` {.r} -``` -## Financial statement: 2 observations from 2013-09-28 to 2014-09-27 -## Numbers in 000000 -## 2014-09-27 2013-09-28 -## Assets = 24839 30936 -## + AssetsCurrent = -4755 15633 -## + CashAndCashEquivalentsAtCarryingValue -415 3513 -## + AvailableForSaleSecuritiesCurrent -15054 7904 -## + AccountsReceivableNetCurrent 4358 2172 -## + InventoryNet 347 973 -## + DeferredTaxAssetsNetCurrent 865 870 -## + NontradeReceivablesCurrent 2220 -223 -## + OtherAssetsCurrent 2924 424 -## + AvailableForSaleSecuritiesNoncurrent 23947 14093 -## + PropertyPlantAndEquipmentNet 4027 1145 -## + Goodwill 3039 442 -## + IntangibleAssetsNetExcludingGoodwill -37 -45 -## + OtherAssetsNoncurrent -1382 -332 -## LiabilitiesAndStockholdersEquity = 24839 30936 -## + Liabilities = 36841 25597 -## + LiabilitiesCurrent = 19790 5116 -## + AccountsPayableCurrent 7829 1192 -## + AccruedLiabilitiesCurrent 4597 2442 -## + DeferredRevenueCurrent 1056 1482 -## + CommercialPaper 6308 0 -## + DeferredRevenueNoncurrent 406 -23 -## + LongTermDebt 12027 16960 -## + OtherLiabilitiesNoncurrent 4618 3544 -## + CommitmentsAndContingencies 0 0 -## + StockholdersEquity = -12002 5339 -## + CommonStockValue 0 -16422 -## + RetainedEarningsAccumulatedDeficit -17104 2967 -## + AccumulatedOtherComprehensiveIncomeLossNetOfTa 1553 -970 -## + CommonStocksIncludingAdditionalPaidInCapitalNA 3549 19764 -``` - - -# Balance sheet visualization - -## Prepare custom calculation hierarchy -There is no human readable way to plot every number of the balance sheet in -one graph. -The only way to plot a balance sheet is to plot it several times. -Each graph should have a limited number of highlited features. -The first step is to break a balance sheet to a small number of pieces. -We can use calculations to specify these groups of elements. - - -```r two_sided_bs_calculation <- list( "Assets" = calculation( @@ -409,38 +337,37 @@ two_sided_bs_calculation <- ) ``` -We divided balance sheet to **Assets** and **Liabilities and Equity**. -Both main groups are divided to only 3 smaller chunks (based on liquidity). +We divided balance sheet to **Assets** and **Liabilities and Equity**. Both main groups are divided to only 3 smaller chunks (based on liquidity). -To plot the result we need to run the calculations on a balance sheet and call -graph plotting function: +To plot the result we need to run the calculations on a balance sheet and call graph plotting function: +``` {.r} -```r balance_sheet %>% do_calculation(two_sided_bs_calculation) %>% plot_double_stacked_bar() ``` - + -Another option is to group by date and see assets close to liabilities for -every year: +Another option is to group by date and see assets close to liabilities for every year: +``` {.r} -```r balance_sheet %>% do_calculation(two_sided_bs_calculation) %>% plot_double_stacked_bar(by_date = TRUE) ``` - + + +See the difference +------------------ -## See the difference We can use the same custom hierarchy on lagged differences. +``` {.r} -```r balance_sheet %>% diff() %>% do_calculation(two_sided_bs_calculation) %>% @@ -449,4 +376,4 @@ balance_sheet %>% dif_labels = c("Money\nconsumption","Money\nsupply")) ``` - + -- GitLab