Time series analysis (MSAP4-02)#

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import star_privateer as sp
import plato_msap4_demonstrator_datasets.plato_sim_dataset as plato_sim_dataset
sp.__version__
'1.3.0'

K2: Preprocessing#

This first part include preprocessing tasks that are not actually included in MSAP4-02 but are useful for the subsequent analysis.

t, s0, dt = sp.load_k2_example ()
fig, ax = plt.subplots (1, 1, figsize=(8,4))

ax.scatter (t[s0!=0]-t[0], s0[s0!=0], color='black',
            marker='o', s=1)

ax.set_xlabel ('Time (day)')
ax.set_ylabel ('Flux (ppm)')

fig.tight_layout ()

plt.savefig ('figures/k2_lc.png', dpi=300)
../../_images/timeseries_analysis_7_0.png
pcutoff = 60
pthresh = 60

K2: Rotation period analysis#

In the next step, we compute the ACF and the WPS. We also analyse the characteristic periodicities obtained from the function, considering only periods below \(P_\mathrm{cutoff}\).

p_acf, acf = sp.compute_acf (s0, dt, normalise=True)
(_, _, _, _,
prots, hacf, gacf,
acf_smooth) = sp.find_period_acf (p_acf, acf, pcutoff=pcutoff,
                                  return_smoothed_acf=True)
fig = sp.plot_acf (p_acf, acf, prot=prots,
                   acf_additional=acf_smooth,
                   color_additional="darkorange",
                   filename='figures/acf_k2.png')
../../_images/timeseries_analysis_11_0.png

We can take a look at the values we have extracted from the ACF. Most often, the rotation period can be linked to the first value of the prots array.

prots[0], hacf[0], gacf[0]
(2.6765510971308686, 1.219105626528322, 0.8085280511689089)

We now turn to the wavelet analysis

(periods, wps, gwps, _, _) = sp.compute_wps(s0, dt*86400, normalise=True)
(prot_ps, E_prot_ps,
 param_gauss) = sp.compute_prot_err_gaussian_fit (periods, gwps, n_profile=1)
fig = sp.plot_wps(t-t[0], periods, wps, gwps,
                  shading='auto', color_coi='darkgrey',
                  ylogscale=True, lw=1, normscale='log',
                  filename='figures/wps_k2.png', dpi=300,
                  figsize=(8,4), ylim=(1, 100),
                  show_contour=False,
                  param_gauss=param_gauss)
usage/timeseries_analysis/timeseries_analysis_files/timeseries_analysis_16_0.png

Let’s take a look at the result of the fit performed on the GPWS !

prot_ps, E_prot_ps
(2.6075837141864864, 0.3868209325802026)

Note that, due to the short length of this light curve, we do not show for this first case the analysis of long term modulations.

PLATO simulation: Preprocessing#

This first part include preprocessing tasks that are not actually included in MSAP4-02 but are useful for the subsequent analysis.

filename = sp.get_target_filename (plato_sim_dataset,
                                   '040', filetype='csv')
t, s0, dt = sp.load_resource (filename)
t, s0, dt = sp.rebin (t, 12), sp.rebin (s0, 12), dt*12
fig, ax = plt.subplots (1, 1, figsize=(8,4))

ax.scatter (t[s0!=0]-t[0], s0[s0!=0], color='black',
            marker='o', s=1)

ax.set_xlabel ('Time (day)')
ax.set_ylabel ('Flux (ppm)')

fig.tight_layout ()


plt.savefig ('figures/plato_lc.png', dpi=300)
usage/timeseries_analysis/timeseries_analysis_files/timeseries_analysis_23_0.png
s = sp.preprocess (t, s0, cut=60)
pcutoff = 60
pthresh = 60

PLATO simulation: Rotation period analysis#

This first part include preprocessing task that are not actually included in MSAP4-02 but are useful for the subsequent analysis.

fig, ax = plt.subplots (1, 1, figsize=(8,4))

ax.scatter (t[s!=0]-t[0], s[s!=0], color='black',
            marker='o', s=1)

ax.set_xlabel ('Time (day)')
ax.set_ylabel ('Flux (ppm)')

fig.tight_layout ()

plt.savefig ('figures/plato_lc_filtered.png', dpi=300)
usage/timeseries_analysis/timeseries_analysis_files/timeseries_analysis_27_0.png
p_acf, acf = sp.compute_acf (s, dt, normalise=True)
(_, _, _, _,
 prots, hacf, gacf,
 acf_smooth) = sp.find_period_acf (p_acf, acf, pcutoff=pcutoff,
                                   return_smoothed_acf=True)
fig = sp.plot_acf (p_acf, acf, prot=prots,
                   acf_additional=acf_smooth,
                   color_additional="darkorange",
                   filename='figures/acf_plato_short.png')
usage/timeseries_analysis/timeseries_analysis_files/timeseries_analysis_28_0.png
(periods, wps, gwps, _, _) = sp.compute_wps(s, dt*86400, normalise=True)
(prot_ps, E_prot_ps,
 param_gauss) = sp.compute_prot_err_gaussian_fit (periods, gwps, n_profile=1)
fig = sp.plot_wps(t-t[0], periods, wps, gwps,
                  shading='auto', color_coi='darkgrey',
                  ylogscale=True, lw=1, normscale='log',
                  filename='figures/wps_plato.png', dpi=300,
                  figsize=(8,4), ylim=(1, 100),
                  show_contour=False,
                  param_gauss=param_gauss)
../../_images/timeseries_analysis_29_0.png

Let’s take a look at the result of the fit performed on the GPWS !

PLATO simulation: Long term modulation analysis#

This time, we do not consider filtered out the data in order to consider long term modulations. We put a period threshold at 60 days to consider only long period in the postprocessing of our analysis. In the figure below, note that a Gaussian smoothing window is applied before looking for local maxima, shown in orange in the figure below.

s0 = sp.preprocess (t, s0, cut=60, desired=[1,1,0,0])
p_acf, acf = sp.compute_acf (s0, dt, normalise=True, pthresh=pthresh,
                            use_scipy_correlate=True, verbose=True)
(_, hacf, gacf, _,
pmods, hacf, gacf, acf_smooth) = sp.find_period_acf (p_acf, acf, pthresh=pthresh,
                                                     return_smoothed_acf=True)
fig = sp.plot_acf (p_acf, acf, prot=pmods,
                   acf_additional=acf_smooth,
                   color_additional="darkorange",
                   filename="figures/acf_plato_long.png")
usage/timeseries_analysis/timeseries_analysis_files/timeseries_analysis_33_0.png