## Jupyter Snippet CB2nd 01_fourier

Jupyter Snippet CB2nd 01_fourier

# 10.1. Analyzing the frequency components of a signal with a Fast Fourier Transform

``````import datetime
import numpy as np
import scipy as sp
import scipy.fftpack
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
``````
``````df0 = pd.read_csv('https://github.com/ipython-books/'
'cookbook-2nd-data/blob/master/'
'weather.csv?raw=true',
na_values=(-9999),
parse_dates=['DATE'])
``````
``````df = df0[df0['DATE'] >= '19940101']
``````
``````df.head()
``````

``````df_avg = df.dropna().groupby('DATE').mean()
``````
``````df_avg.head()
``````

``````date = df_avg.index.to_datetime()
temp = (df_avg['TMAX'] + df_avg['TMIN']) / 20.
N = len(temp)
``````
``````fig, ax = plt.subplots(1, 1, figsize=(6, 3))
temp.plot(ax=ax, lw=.5)
ax.set_ylim(-10, 40)
ax.set_xlabel('Date')
ax.set_ylabel('Mean temperature')
``````

``````temp_fft = sp.fftpack.fft(temp)
``````
``````temp_psd = np.abs(temp_fft) ** 2
``````
``````fftfreq = sp.fftpack.fftfreq(len(temp_psd), 1. / 365)
``````
``````i = fftfreq > 0
``````
``````fig, ax = plt.subplots(1, 1, figsize=(8, 4))
ax.plot(fftfreq[i], 10 * np.log10(temp_psd[i]))
ax.set_xlim(0, 5)
ax.set_xlabel('Frequency (1/year)')
ax.set_ylabel('PSD (dB)')
``````

``````temp_fft_bis = temp_fft.copy()
temp_fft_bis[np.abs(fftfreq) > 1.1] = 0
``````
``````temp_slow = np.real(sp.fftpack.ifft(temp_fft_bis))
``````
``````fig, ax = plt.subplots(1, 1, figsize=(6, 3))
temp.plot(ax=ax, lw=.5)
ax.plot_date(date, temp_slow, '-')
ax.set_xlim(datetime.date(1994, 1, 1),
datetime.date(2000, 1, 1))
ax.set_ylim(-10, 40)
ax.set_xlabel('Date')
ax.set_ylabel('Mean temperature')
``````