# How to Interpret Lomb Scargle periodogram

lomb scargle periodogram: import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from scipy import signal
from astropy.time import Time
from astropy.timeseries import LombScargle

date    sales
0  2011-01-29  32631.0
1  2011-01-30  31749.0
2  2011-01-31  23783.0
3  2011-02-01  25412.0
4  2011-02-02  19146.0

"""Converting dates to MJD """
tmp_str = m5_data.iloc[:,0].astype(pd.StringDtype())
t_date = np.array(tmp_str.values,dtype = 'str')
t_date = Time(t_date, format='isot', scale='utc')
t_date.format = 'mjd'

y = m5_data.iloc[:,1]
m5_ls = LombScargle(t_date, y)
m5_frequency, m5_power = m5_ls.autopower()
plt.plot(m5_frequency,m5_power)
plt.show()

1. What does the x axis represent? Is it frequencies in days or is it frequencies in 1/day?
2. So the spike at 2 does that mean there is a period of every two days or does it mean there is a period 1/2 days, which is a fractional day and I do not understand how I could get fractional days when I only have 1 observation per day.

The overall goal is to find if the data is periodic. Given this data is sales of a product from a store I would expect that if the data is periodic that the periods would be 7days(weekly), 30days(monthly), 182days(semi annually)

So the spike at 2 does not make sense to me.

• Maybe programming Stack Exchange? Feb 2, 2021 at 20:52
• @User123 the question is about an astronomical technique and is just fine here. Astronomers use computer programs as often as they use telescopes to learn about the universe.
– uhoh
Feb 3, 2021 at 0:00
• How can a frequency be measured in days? Feb 3, 2021 at 0:53
• @ProfRob The data is daily samples i.e. one sample/observation a day. I guess the frequency is not days, but the period would be days which is 1/frequency, is that correct? It is the period that I am looking for. Looking here and here and here it seems like they talk about days/hour only when they convert from frequency to period which is 1/freq or 24/freq(if sampled in minutes) Feb 3, 2021 at 11:49
• Please don't edit this question all willy nilly, the data.head() is very important for people to get an idea of the exact type of data being used. Feb 3, 2021 at 14:46

In your case, the x-axis looks linear, and the the code you present appears to be using something labelled as a frequency on the x-axis. Therefore I would assume (though I would read the documentation for the functions you are using) that the x-axis is frequency. The units will be based on whatever units are in your input. i.e. It is just the inverse of whatever you are giving it for the times - in this case, $$d^{-1}$$.
If your sampling rate is once per day, then you are getting no reliable information at all about frequencies $$>1$$ d$$^{-1}$$. The stuff you should be concentrating on lies between $$0\leq f < 1$$ d$$^{-1}$$. Even in this range you won't have good fidelity on signals with $$0.5 d$$^{-1}$$ because they are undersampled. You can also expect to get aliasing signals in the range $$0\leq f <1$$ that are caused by true signals (including those with higher frequencies) aliasing with the 1 d$$^{-1}$$ frequency of your sampling.
It looks to me, by eye, like you might have a genuine signal at $$1/7$$ d$$^{-1}$$, corresponding to a weekly variation. There may be a weaker signal at much lower frequencies that might correspond to a monthly signal. The 2 signals either side of 1 day look like aliases of the weekly signal with the sampling frequency.