Skip to content

finalfirevectors module

Module to project fire and ignition points to hexagon network. 1. user confirm whether there are multiple fires in each iteration: if yes, using spatialjoin_fire_iteration else, using spatialjoin_fire

  1. user confirm whether is processing spreading by day data: if yes, using module dailyfirevectors else, current module suffices

generate_fire_vectors(fireshp, ignition, hexagons, threshold=0, loopBy='fire', **kwargs)

Generate fire spreading vectors from final fire spread perimeters

Parameters:

Name Type Description Default
fireshp GeoDataFrame

fire perimeter dataset with fire ID (and iteration ID) and geometry

required
ignition GeoDataFrame

ignition point shapes with fire ID field in attributes

required
hexagons GeoDataFrame

geometry of hexagonal patches with ID field

required
threshold float

Value between 0 and 1. The proportion for classifying hexagon as intersecting with shp0. Defaults to 0.

0
loopBy str

loop by 'fire' of 'iteration'. Defaults to "fire".

'fire'

Returns:

Type Description
DataFrame

a dataframe table containing fire starting hexagon ID (i), destination hexagon ID (j), fire ID, and ignition hexagon ID

Source code in postbp/finalfirevectors.py
def generate_fire_vectors(fireshp, ignition, hexagons, threshold = 0, loopBy = "fire", **kwargs):
    """Generate fire spreading vectors from final fire spread perimeters

    Args:
        fireshp (GeoDataFrame): fire perimeter dataset with fire ID (and iteration ID) and geometry
        ignition (GeoDataFrame): ignition point shapes with fire ID field in attributes
        hexagons (GeoDataFrame): geometry of hexagonal patches with ID field
        threshold (float, optional): Value between 0 and 1. The proportion for classifying hexagon as intersecting with shp0. Defaults to 0.
        loopBy (str, optional): loop by 'fire' of 'iteration'. Defaults to "fire".

    Returns:
        DataFrame: a dataframe table containing fire starting hexagon ID (i), destination hexagon ID (j), fire ID, and ignition hexagon ID 
    """    
    hexagon = hexagons.copy()
    if 'Node_ID' in kwargs:
        hexagon = hexagon.rename(columns={kwargs["Node_ID"]: 'Node_ID'})

    if loopBy == "iteration":
        fire_vectors = _spatial_join(fireshp, ignition, hexagon, threshold, iteration=True)

    if loopBy == "fire":
        fire_vectors = _spatial_join(fireshp, ignition, hexagon, threshold, iteration=False)

    fire_vectors = fire_vectors.reset_index(drop = True)
    fire_vectors.drop(fire_vectors[fire_vectors['Node_ID_y'].isna()].index, inplace = True)                    

    fire_vectors['Node_ID_x'] = fire_vectors['Node_ID_x'].astype(int)
    fire_vectors['Node_ID_y'] = fire_vectors['Node_ID_y'].astype(int)

    fire_vectors.columns = ['Node_ID_x', 'Node_ID_y', 'fire', 'iteration']
    fire_vectors.rename(columns={'Node_ID_x':'column_j', 'Node_ID_y':'column_i'}, inplace=True)
    return fire_vectors

pij_from_vectors(vectors, iterations)

Group vector pair by i, j and calculate probability by dividing number of occurrence by number of iterations

Parameters:

Name Type Description Default
vectors dataframe

outputs from generate_fire_vectors function

required
iterations int

number of iterations

required

Returns:

Type Description
GeoDataFrame

return a geodataframe with probability values for pairs of i, j on the landscape

Source code in postbp/finalfirevectors.py
def pij_from_vectors(vectors, iterations):
    """Group vector pair by i, j and calculate probability by dividing number of occurrence by number of iterations

    Args:
        vectors (dataframe): outputs from generate_fire_vectors function
        iterations (int): number of iterations

    Returns:
        GeoDataFrame: return a geodataframe with probability values for pairs of i, j on the landscape
    """    

    fire_pij = vectors.groupby(['column_j', 'column_i'])[['fire']].count()
    fire_pij.reset_index(inplace = True)
    fire_pij = fire_pij.drop(fire_pij[fire_pij['column_j'] == fire_pij['column_i']].index)
    fire_pij['pij'] = fire_pij['fire'] / iterations
    fire_pij['pij'] = fire_pij['pij'].round(7)
    fire_pij['pij'] = fire_pij['pij'].apply(lambda x: '%.7f' % x)
    fire_pij.rename(columns={'fire':'firecounts'},inplace=True)
    fire_pij.sort_values(by = ['column_i', 'column_j'], inplace = True)
    fire_pij.reset_index(drop=True, inplace=True)
    return fire_pij