# Convolution in Python/v3

Learn how to perform convolution between two signals in Python.

See our Version 4 Migration Guide for information about how to upgrade.

#### New to Plotly?Â¶

You can set up Plotly to work in online or offline mode, or in jupyter notebooks.
We also have a quick-reference cheatsheet (new!) to help you get started!

#### ImportsÂ¶

The tutorial below imports NumPy, Pandas, SciPy and Plotly.

In [1]:
import plotly.plotly as py
import plotly.graph_objs as go
import plotly.figure_factory as ff

import numpy as np
import pandas as pd
import scipy

from scipy import signal


#### Import DataÂ¶

Let us import some stock data to apply convolution on.

In [2]:
stock_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/stockdata.csv')
df = stock_data[0:15]

table = ff.create_table(df)
py.iplot(table, filename='stockdata-peak-fitting')

Out[2]:

#### Convolve Two SignalsÂ¶

Convolution is a type of transform that takes two functions f and g and produces another function via an integration. In particular, the convolution $(f*g)(t)$ is defined as:

\begin{align*} \int_{-\infty}^{\infty} {f(\tau)g(t - \tau)d\tau} \end{align*}

We can use convolution in the discrete case between two n-dimensional arrays.

In [11]:
sample = range(15)
saw = signal.sawtooth(t=sample)

data_sample = list(stock_data['SBUX'][0:100])
data_sample2 = list(stock_data['AAPL'][0:100])
x = list(range(len(data_sample)))
y_convolve = signal.convolve(saw, data_sample2)
x_convolve = list(range(len(y_convolve)))

trace1 = go.Scatter(
x = x,
y = data_sample,
mode = 'lines',
name = 'SBUX'
)

trace2 = go.Scatter(
x = x,
y = data_sample2,
mode = 'lines',
name = 'AAPL'
)

trace3 = go.Scatter(
x = x_convolve,
y = y_convolve,
mode = 'lines',
name = 'Convolution'
)

data = [trace1, trace2, trace3]
py.iplot(data, filename='convolution-of-two-signals')

Out[11]: