try this way (I don’t know if simple and efficient)
the scheme used here
using ShiftedArrays, DataFrames,RollingFunctions, Query
bigDf = DataFrame(i = 1:100, Growth = rand(100), Categories = rand(["a", "b", "c", "d", "f", "g"], 100))
TimedDfTest = @linq bigDf |>
groupby(:Categories) |>
transform(Trailing = running(prod, (:Growth .+1), 3).-1)
runshp(arr, sh) =cumprod(arr)./ShiftedArray(cumprod(arr),sh,default=1)
withOnlySA=transform(groupby(bigDf, :Categories),:Growth => (x -> runshp(x.+1, 3).-1) => :Trailing)
considera che
julia> withOnlySA.Trailing ≈ TimedDfTest.Trailing
true
julia> runshp([1,2,3,4],5)
4-element Vector{Float64}:
1.0
2.0
6.0
24.0