Understanding GratingStim phase in frequency

According to the GratingStim documentation it is written:

NB phase has modulus 1 (rather than 360 or 2pi) This is a little unconventional but has the nice effect that setting phase=tn drifts a stimulus at n Hz

Key question: How to convert frequency into phase value?

I know incrementing higher value for phase would result in higher frequency, while lower will result in a slower animation. Can someone help me to understand how this phase is measured? In particular, I would like to have several stimuli on the screen, where each stimulus has different phase defined by a frequency value. For instance, defining 1 Hz would animate the stimulus to shift 1 cycle per second (2 Hz = 2 cycle per second). Note also that the size of each “section” is defined by the sf when declaring visual.GratingStim.

Sample code:

from psychopy import visual, core, event

mywin = visual.Window([800,600],monitor="testMonitor", units="deg",color='black', )
grating = visual.GratingStim(win=mywin, mask='circle', size=3, pos=[0,0], sf=1)

phase = 0.05 # <-- how to calculate the phase if desired to have 1hz or 10hz?

while True:
    grating.phase += phase
    grating.draw()
    mywin.flip()

    if len(event.getKeys())>0:
        break
    event.clearEvents()

mywin.close()
core.quit()