graph TD;
subgraph step-create_data
create_data(create_data) ~~~ create_data_description[["""
        This method we create the dataset we are going use. In real use cases,
        you'll have to read from a source (csv, parquet, etc)

        For this example we create two dataframes for students ranked by marked scored
        for when they attempted the example on 1st January 2023 and 12th March 2023

        After creating the dataset we pass it to the next methods

        - transformation_function_1
        - transformation_function_2
        """]];
end;
step-create_data ==> step-transformation_function_1;
step-create_data ==> step-transformation_function_2;
subgraph step-transformation_function_1
transformation_function_1(transformation_function_1) ~~~ transformation_function_1_description[["""
        Here we add a snapshot_date to the input dataframe of 2023-03-12
        """]];
end;
step-transformation_function_1 ==> step-append_data;
subgraph step-transformation_function_2
transformation_function_2(transformation_function_2) ~~~ transformation_function_2_description[["""
        Here we add a snapshot_date to the input dataframe of 2023-01-01
        """]];
end;
step-transformation_function_2 ==> step-append_data;
subgraph step-append_data
append_data(append_data) ~~~ append_data_description[["""
        Here we append the two dataframe together
        """]];
end;
step-append_data ==> step-show_data;
subgraph step-show_data
show_data(show_data) ~~~ show_data_description[["""
        Here we show the new final dataframe of aggregated data. However in real use cases. It would
        be more likely to write the data to some final layer/format
        """]];
end;