Ok, so to this Julia code I need station capacity. If the station is overwrlhmed 3 bikes go to 3 most empty stations. I need to know in logs if that event occurs and at which station:

using StatsBase
using Random
using DataStructures
using DataFrames
using Distributions
using Plots
     

# Definiowanie parametrów Uwaga kod jest pisany na kolenie wiec lepiej zawsze przed odpaleniem
# sim na nowo zdefiniowac zmienne
liczba_rowerow_na_stacji = [10,10,10,10,10]
brak_roweru = [0,0,0,0,0]
prawdopodobienstwo_stacji = [0.3, 0.3, 0.2, 0.1, 0.1]
wynik_sim_init = [liczba_rowerow_na_stacji,brak_roweru]
     
2-element Vector{Vector{Int64}}:
 [10, 10, 10, 10, 10]
 [0, 0, 0, 0, 0]

# Pojedyncze wyporzyczenie i oddanie roweru
function single_sim(wynik_sim=wynik_sim_init,
                    prawdopodobienstwo_stacji= prawdopodobienstwo_stacji)
    stacja_odebrania = rand(Categorical(prawdopodobienstwo_stacji))
    stacja_oddania = rand(Categorical(prawdopodobienstwo_stacji))
    while (stacja_odebrania == stacja_oddania)
        stacja_odebrania = rand(Categorical(prawdopodobienstwo_stacji))
        stacja_oddania = rand(Categorical(prawdopodobienstwo_stacji)) 
    end
    if wynik_sim[1][stacja_odebrania] >= 1
        wynik_sim[1][stacja_odebrania] -= 1
        wynik_sim[1][stacja_oddania] += 1
    else
        wynik_sim[2][stacja_odebrania] += 1
    end
    return wynik_sim
end

# x razy single_sim
function run_day(liczba_dzienna,
                    wynik_sim = wynik_sim_init,
                    prawdopodobienstwo_stacji=prawdopodobienstwo_stacji)
    wynik_sim_init = deepcopy(wynik_sim)
    for i in range(1,liczba_dzienna)
        wynik_sim = single_sim(wynik_sim_init, prawdopodobienstwo_stacji)
    end
    return wynik_sim
end

# x razy single_sim, ale zapamietuje wyniki z konca symulacji
function run_day_cum(liczba_dzienna,
                    wynik_sim = wynik_sim_init,
                    prawdopodobienstwo_stacji=prawdopodobienstwo_stacji)
    for i in range(1,liczba_dzienna)
        wynik_sim = single_sim(wynik_sim, prawdopodobienstwo_stacji)
    end
    return wynik_sim
end

# x razy single_sim, ale kazdy "dzien" liczony od nowa
function run_sims(liczba_sim = 30,
                    liczba_dzienna = 40,
                    wynik_sim = wynik_sim_init,
                    prawdopodobienstwo_stacji = prawdopodobienstwo_stacji)
    wynik_sim_init = deepcopy(wynik_sim)
    wyniki_okresu = DataFrame(dzien = Int[], nr_stacji = Int[], liczba_na_koniec_dnia = Int[], braki_na_koniec_dnia = Int[])
    for i in range(1,liczba_sim)
        wynik_dnia = run_day(liczba_dzienna, wynik_sim, prawdopodobienstwo_stacji)
        temp_df = DataFrame(dzien = [i,i,i,i,i], nr_stacji = repeat(1:5,1),liczba_na_koniec_dnia = wynik_dnia[1], braki_na_koniec_dnia = wynik_dnia[2])
        wyniki_okresu = vcat(wyniki_okresu, temp_df)
        wynik_sim = wynik_sim_init
    end
    wynik_sim = wynik_sim_init
    return wyniki_okresu
end

# x razy single_sim, ale dni są "połączone" ze sobą
function run_sims_cum(liczba_sim = 30,
                    liczba_dzienna = 40,
                    wynik_sim = wynik_sim_init,
                    prawdopodobienstwo_stacji = prawdopodobienstwo_stacji)
    wyniki_okresu = DataFrame(dzien = Int[], nr_stacji = Int[], liczba_na_koniec_dnia = Int[], braki_na_koniec_dnia = Int[])
    for i in range(1,liczba_sim)
        wynik_dnia = run_day_cum(liczba_dzienna, wynik_sim_init, prawdopodobienstwo_stacji)
        temp_df = DataFrame(dzien = [i,i,i,i,i], nr_stacji = repeat(1:5,1),liczba_na_koniec_dnia = wynik_dnia[1], braki_na_koniec_dnia = wynik_dnia[2])
        wyniki_okresu = vcat(wyniki_okresu, temp_df)
    end
    wynik_sim = wynik_sim_init
    return wyniki_okresu
end
     
run_sims_cum (generic function with 5 methods)

# Wyniki skumulowanych wyników
liczba_rowerow_na_stacji = [5,5,5,5,5]
brak_roweru = [0,0,0,0,0]
prawdopodobienstwo_stacji = [0.3, 0.3, 0.2, 0.1, 0.1]
wynik_sim_init = [deepcopy(liczba_rowerow_na_stacji), deepcopy(brak_roweru)]
wyniki_okresu_cum = run_sims_cum()
     
150×4 DataFrame125 rows omitted
Row	dzien	nr_stacji	liczba_na_koniec_dnia	braki_na_koniec_dnia
Int64	Int64	Int64	Int64
1	1	1	6	0
2	1	2	0	1
3	1	3	7	0
4	1	4	9	0
5	1	5	3	0
6	2	1	5	0
7	2	2	1	7
8	2	3	3	0
9	2	4	13	0
10	2	5	3	0
11	3	1	10	0
12	3	2	1	7
13	3	3	3	0
&vellip;	&vellip;	&vellip;	&vellip;	&vellip;
139	28	4	11	0
140	28	5	1	20
141	29	1	2	16
142	29	2	9	72
143	29	3	8	12
144	29	4	4	0
145	29	5	2	22
146	30	1	4	16
147	30	2	8	72
148	30	3	3	12
149	30	4	9	0
150	30	5	1	24

# Wyniki nieskumulowanych wyników
liczba_rowerow_na_stacji = [5,5,5,5,5]
brak_roweru = [0,0,0,0,0]
prawdopodobienstwo_stacji = [0.3, 0.3, 0.2, 0.1, 0.1]
wynik_sim_init = [deepcopy(liczba_rowerow_na_stacji), deepcopy(brak_roweru)]
wyniki_okresu = run_sims()
     
150×4 DataFrame125 rows omitted
Row	dzien	nr_stacji	liczba_na_koniec_dnia	braki_na_koniec_dnia
Int64	Int64	Int64	Int64
1	1	1	0	5
2	1	2	8	0
3	1	3	5	0
4	1	4	9	0
5	1	5	3	0
6	2	1	8	0
7	2	2	2	1
8	2	3	3	0
9	2	4	6	0
10	2	5	6	0
11	3	1	1	0
12	3	2	12	0
13	3	3	2	6
&vellip;	&vellip;	&vellip;	&vellip;	&vellip;
139	28	4	6	0
140	28	5	3	0
141	29	1	1	0
142	29	2	2	0
143	29	3	8	0
144	29	4	8	0
145	29	5	6	0
146	30	1	10	0
147	30	2	0	2
148	30	3	8	0
149	30	4	4	0
150	30	5	3	0

# wykres 1
wyfiltrowane = filter(row -> row.braki_na_koniec_dnia > 0, wyniki_okresu)
bar(wyfiltrowane[:,1], wyfiltrowane[:,4], alpha = 0.7, group = wyfiltrowane[:,2])
title!("Braki rowerów na stacjach w poszczególnych dniach")
xlabel!("Dzień")
ylabel!("Niezrealizowane zamówienie")
     
b'\n

# suma brakow z NIESKUMULOWANYCH symulacji
braki_30_dni = combine(groupby(wyfiltrowane, :nr_stacji), :braki_na_koniec_dnia => sum)
     
4×2 DataFrame
Row	nr_stacji	braki_na_koniec_dnia_sum
Int64	Int64
1	1	21
2	2	33
3	3	11
4	4	1

# wykres 2
bar(braki_30_dni[:,1], braki_30_dni[:,2])
title!("Skumulowana liczba braków realizacji zamówienia")
xaxis!("Numer stacji")
     
b'\n

print("Zrealizowane zamówienia : ", round(sum(braki_30_dni[:,2])/(40*30), digits=3), "%") # ilosc dni * srednia dzienna
     
Zrealizowane zamówienia : 0.055%