Skip to content
Snippets Groups Projects
Commit cd51f6a0 authored by Radek Puš's avatar Radek Puš
Browse files

added counts, fully implemented graphs

parent 5fa29662
No related branches found
No related tags found
No related merge requests found
......@@ -9,7 +9,7 @@ export class HomeChartDefinitionsService {
}
 
//history
public Expenses: number[]; //weekBarChart
public Expenses: Array<{ name: string, y: number }>; //weekBarChart
public TrasactionPerSizeTypes: Array<{ name: string, y: number }>;
public TrasactionPerSymbolCategory: Array<{ name: string, y: number }>;
public TrasactionPerSymbolType: Array<{ name: string, y: number }>;
......@@ -95,7 +95,9 @@ export class HomeChartDefinitionsService {
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......@@ -110,14 +112,16 @@ export class HomeChartDefinitionsService {
type: 'pie'
},
title: {
text: 'Velikost transakcí'
text: 'celková velikost transakcí'
},
credits: {
enabled: false
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......@@ -139,7 +143,9 @@ export class HomeChartDefinitionsService {
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......@@ -161,7 +167,9 @@ export class HomeChartDefinitionsService {
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......@@ -176,7 +184,7 @@ export class HomeChartDefinitionsService {
type: 'pie'
},
title: {
text: 'Předpovídaná velikost transakcí'
text: 'Předpovídaná celková velikost transakcí'
},
credits: {
enabled: false
......@@ -198,14 +206,28 @@ export class HomeChartDefinitionsService {
type: 'line'
},
title: {
text: 'Vývoj velikosti transakcí na následující čtyři týdny'
text: 'Vývoj celkové velikosti transakcí na následující čtyři týdny'
},
credits: {
enabled: false
},
xAxis: {
labels: {
formatter: function () {
return this.value+1 + ' .den';
}
}
},
yAxis: {
labels: { format: '{value} Kč' },
title: { text: 'Výše útraty (Kč)' },
},
tooltip: {
headerFormat: '',
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z: .2f}'
},
series: [
{
......@@ -220,14 +242,16 @@ export class HomeChartDefinitionsService {
type: 'pie'
},
title: {
text: 'Pravděpodobná velikost transakcí v jednotlivých dnech'
text: 'Pravděpodobná celková velikost transakcí v jednotlivých dnech'
},
credits: {
enabled: false
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z: .2f}'
},
series: [
{
......@@ -249,7 +273,9 @@ export class HomeChartDefinitionsService {
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......@@ -264,14 +290,16 @@ export class HomeChartDefinitionsService {
type: 'pie'
},
title: {
text: 'Velikost výdajů na následující týden'
text: 'celková velikost výdajů na následující týden'
},
credits: {
enabled: false
},
tooltip: {
valueDecimals: 2,
valueSuffix: ''
valueSuffix: '',
pointFormat: 'celková velikost: {point.y}<br/>'
+ 'počet transakcí: {point.z}'
},
series: [
{
......
......@@ -27,7 +27,7 @@ export class HomeService {
if (res === null)
return;
 
this.HomeChartDefinitionsService.Expenses = res.expenses;
this.HomeChartDefinitionsService.Expenses = this.MakePieChartData(res.expenses);
this.HomeChartDefinitionsService.TrasactionPerSizeTypes = this.MakePieChartData(res.expensesPerSize);
this.HomeChartDefinitionsService.TrasactionPerSymbolCategory = this.MakePieChartData(res.expensesPerSymbolCategory);
this.HomeChartDefinitionsService.TrasactionPerSymbolType = this.MakePieChartData(res.expensesPerSymbolType);
......@@ -54,11 +54,13 @@ export class HomeService {
let continuousData: ITransaction[] = new Array();
for (let i: number = 0; i < res.averagePrediction.length; i++)
continuousData = continuousData.concat(res.averagePrediction[i]);
this.HomeChartDefinitionsService.ForecastAverageLineData = this.MakePieChartData(continuousData);
this.HomeChartDefinitionsService.ForecastAveragePieData = this.MakePieChartData(res.amountPrediction);
this.HomeChartDefinitionsService.ForecastAmountComparsionKindPieData = this.MakePieChartData(res.amountPrediction);
this.HomeChartDefinitionsService.ForecastAmountComparsionSizePieData = this.MakePieChartData(res.amountPrediction);
console.log("amountPredictionKinds", res.amountPredictionKinds);
console.log("amountPredictionSizeTypes", res.amountPredictionSizeTypes);
this.HomeChartDefinitionsService.ForecastAveragePieData = this.MakeAverageFromWeekDays(res.averagePrediction);
this.HomeChartDefinitionsService.ForecastAmountComparsionKindPieData = this.MakePieChartData(res.amountPredictionKinds);
this.HomeChartDefinitionsService.ForecastAmountComparsionSizePieData = this.MakePieChartData(res.amountPredictionSizeTypes);
 
this.HomeChartDefinitionsService.ReloadForecastChartSeries();
}, error => {
......@@ -66,17 +68,38 @@ export class HomeService {
});
}
 
private MakePieChartData(input: ITransaction[]): Array<{ name: string, y: number }> {
let pieData = new Array<{ name: string, y: number }>();
private MakePieChartData(input: ITransaction[]): Array<{ name: string, y: number, z: number }> {
let pieData = new Array<{ name: string, y: number, z: number }>();
 
for (let i: number = 0; i < input.length; i++) {
if (input[i].amount != 0)
pieData.push({ name: input[i].name, y: Math.abs(input[i].amount) });
pieData.push({ name: input[i].name, y: Math.abs(input[i].amount), z: input[i].count });
}
 
return pieData;
}
 
private MakeAverageFromWeekDays(input: ITransaction[][]): Array<{ name: string, y: number, z: number }> {
let weekDaysData: Array<{ amount: number, count: number, name: string }> = new Array(
{ amount: 0, count: 0, name: "pondělí" },
{ amount: 0, count: 0, name: "úterý" },
{ amount: 0, count: 0, name: "středa" },
{ amount: 0, count: 0, name: "čtvrtek" },
{ amount: 0, count: 0, name: "pátek" },
{ amount: 0, count: 0, name: "sobota" },
{ amount: 0, count: 0, name: "neděle" },
);
input.forEach(x => {
for (let i: number = 0; i < 7; i++) {
weekDaysData[i].amount += x[i].amount / 7.0;
weekDaysData[i].count += x[i].count;
}
});
return this.MakePieChartData(weekDaysData as ITransaction[]);
}
public GetHistoryWeeksBar(): Chart { return this.HomeChartDefinitionsService.HistoryWeeksBarChart; }
public GetHistoryPerSizePie(): Chart { return this.HomeChartDefinitionsService.HistoryPerSizePieChart; }
public GetHistorySymbolCategoryPieChart(): Chart { return this.HomeChartDefinitionsService.HistorySymbolCategoryPieChart; }
......
......@@ -2,6 +2,7 @@ import { ITransaction } from "./ITransaction";
 
export interface IForecastTransactionContainer {
averagePrediction: ITransaction[][];
amountPrediction: ITransaction[];
amountPredictionSizeTypes: ITransaction[];
amountPredictionKinds: ITransaction[];
neuralPrediction: ITransaction[];
}
import { ITransaction } from "./ITransaction";
 
export interface ITransactionSumsContainer {
expenses: number[];
expenses: ITransaction[];
expensesPerSymbolCategory: ITransaction[];
expensesPerSymbolType: ITransaction[];
expensesPerSize: ITransaction[];
......
......@@ -58,13 +58,17 @@ namespace Core.Controllers
var transactionSizes = GetTransactionTypes(customInterval);
 
//group transactions by weeks
List<double> expenses = new List<double>(5);
List<TransactionContainer> expenses = new List<TransactionContainer>(4);
while (upperbound <= maxDate)
{
IQueryable<Transaction> intervalTransactions = transactions
.Where(t => t.Amount < 0 && t.Date >= lowerbound && t.Date < upperbound);
 
expenses.Add((double)intervalTransactions.Sum(t => Math.Abs(t.Amount)));
expenses.Add(new TransactionContainer()
{
amount = (double)intervalTransactions.Sum(t => Math.Abs(t.Amount)),
count = intervalTransactions.Count()
});
 
lowerbound = lowerbound.AddDays(7);
upperbound = upperbound.AddDays(7);
......@@ -72,7 +76,7 @@ namespace Core.Controllers
 
return new TransactionSumsContainer(expenses, symbolCategories.PaymentCategories, symbolCategories.PaymentTypes, transactionSizes);
}
private bool IsInInterval(int low, int high, decimal value) => value > low && value <= high;
private TransactionContainer MakeTransactionContainer(IQueryable<Transaction> transactions, string name)
{
......
......@@ -17,7 +17,8 @@ namespace Core.Controllers.containers
/// one week prediction with fields for each day
/// each TransactionContainer contains only values: amount, kind (=name), repetitivness, sizeType
/// </summary>
public List<TransactionContainer> amountPrediction;
public List<TransactionContainer> amountPredictionSizeTypes;
public List<TransactionContainer> amountPredictionKinds;
 
/// <summary>
/// neural net prediction for next 4 weeks
......@@ -41,19 +42,60 @@ namespace Core.Controllers.containers
});
}
 
//converts amountPrediction tuples to list of transactions
this.amountPrediction = amountPrediction.ConvertAll(x => new TransactionContainer() {
amount = x.Item1,
name = x.Item2,
repetitive = x.Item3,
sizeType = GetTransactionTypes(Math.Abs(x.Item1))
});
FillAmountPredictionLists(amountPrediction);
 
this.neuralPrediction = neuralPrediction;
this.neuralPrediction.ForEach(c => c.sizeType = GetTransactionTypes(c.amount));
this.neuralPrediction.ForEach(c => c.sizeType = GetTransactionTypesName(c.amount));
}
 
private string GetTransactionTypes(double amount)
private void FillAmountPredictionLists(List<Tuple<double, string, bool>> amountPrediction)
{
amountPredictionSizeTypes = new List<TransactionContainer>()
{
new TransactionContainer(){ name="Drobné"},
new TransactionContainer(){ name="Malé"},
new TransactionContainer(){ name="Střední"},
new TransactionContainer(){ name="Velké"},
new TransactionContainer(){ name="Velmi velké"},
new TransactionContainer(){ name="Značně velké"}
};
foreach (var transaction in amountPrediction)
{
var targetType = amountPredictionSizeTypes[GetTransactionTypesID(Math.Abs(transaction.Item1))];
targetType.amount += transaction.Item1;
targetType.count++;
}
amountPredictionKinds = amountPrediction
.Where(t => t.Item3)
.GroupBy(t => t.Item2)
.Select(g => new TransactionContainer()
{
count = g.Count(),
amount = g.Sum(x => x.Item1),
name = g.First().Item2
})
.ToList();
}
private int GetTransactionTypesID(double amount)
{
if (amount < 500)
return 0;
if (amount < 5000)
return 1;
if (amount < 25000)
return 2;
if (amount < 50000)
return 3;
if (amount < 500000)
return 4;
return 5;
}
private string GetTransactionTypesName(double amount)
{
if (amount < 500)
return "Drobné";
......
......@@ -7,7 +7,7 @@ namespace Core.Controllers.containers
{
public class TransactionSumsContainer
{
public readonly List<double> expenses;
public readonly List<TransactionContainer> expenses;
 
//TransactionContainer.name = constant symbol
//TransactionContainer.amount = amount per selcted constant symbol
......@@ -18,7 +18,7 @@ namespace Core.Controllers.containers
//TransactionContainer.amount = amount per type
public readonly List<TransactionContainer> expensesPerSize;
 
public TransactionSumsContainer(List<double> expenses, List<TransactionContainer> expensesPerSymbolCategory, List<TransactionContainer> expensesPerSymbolType, List<TransactionContainer> expensesPerSize)
public TransactionSumsContainer(List<TransactionContainer> expenses, List<TransactionContainer> expensesPerSymbolCategory, List<TransactionContainer> expensesPerSymbolType, List<TransactionContainer> expensesPerSize)
{
this.expenses = expenses;
this.expensesPerSymbolCategory = expensesPerSymbolCategory;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment