Bring Drag & Drop to Dash with Dashboard Engine. 💫 Learn how at our next webinar!

ModuleNotFoundError: No module named 'redis'

at Tutorial Page Part 4. Interactive Graphing and Crossfiltering | Dash for Python Documentation | Plotly

Why this code below throw this exception, even if after I have use “conda install redis”
and I have verified

Name Version Build Channel

redis 3.2.100 h81e342f_0

Exception is

from redis import from_url as redis_from_url
ModuleNotFoundError: No module named ‘redis’

Source Code:
import os
import copy
import time
import datetime

import dash
import dash_core_components as dcc
import dash_html_components as html
import numpy as np
import pandas as pd
from dash.dependencies import Input, Output
from flask_caching import Cache

external_stylesheets = [
# Dash CSS’,
# Loading screen CSS’]

app = dash.Dash(name, external_stylesheets=external_stylesheets)
# try ‘filesystem’ if you don’t want to setup redis
‘CACHE_TYPE’: ‘redis’,
‘CACHE_REDIS_URL’: os.environ.get(‘REDIS_URL’, ‘redis://localhost:6379’)
cache = Cache()
cache.init_app(app.server, config=CACHE_CONFIG)

N = 100

df = pd.DataFrame({
‘category’: (
([‘apples’] * 5 * N) +
([‘oranges’] * 10 * N) +
([‘figs’] * 20 * N) +
([‘pineapples’] * 15 * N)
df[‘x’] = np.random.randn(len(df[‘category’]))
df[‘y’] = np.random.randn(len(df[‘category’]))

app.layout = html.Div([
options=[{‘label’: i, ‘value’: i} for i in df[‘category’].unique()],
html.Div(dcc.Graph(id=‘graph-1’), className=“six columns”),
html.Div(dcc.Graph(id=‘graph-2’), className=“six columns”),
], className=“row”),
html.Div(dcc.Graph(id=‘graph-3’), className=“six columns”),
html.Div(dcc.Graph(id=‘graph-4’), className=“six columns”),
], className=“row”),

# hidden signal value
html.Div(id='signal', style={'display': 'none'})


perform expensive computations in this “global store”

these computations are cached in a globally available

redis memory store which is available across processes

and for all time.

def global_store(value):
# simulate expensive query
print(‘Computing value with {}’.format(value))
return df[df[‘category’] == value]

def generate_figure(value, figure):
fig = copy.deepcopy(figure)
filtered_dataframe = global_store(value)
fig[‘data’][0][‘x’] = filtered_dataframe[‘x’]
fig[‘data’][0][‘y’] = filtered_dataframe[‘y’]
fig[‘layout’] = {‘margin’: {‘l’: 20, ‘r’: 10, ‘b’: 20, ‘t’: 10}}
return fig

@app.callback(Output(‘signal’, ‘children’), Input(‘dropdown’, ‘value’))
def compute_value(value):
# compute value and send a signal when done
return value

@app.callback(Output(‘graph-1’, ‘figure’), Input(‘signal’, ‘children’))
def update_graph_1(value):
# generate_figure gets data from global_store.
# the data in global_store has already been computed
# by the compute_value callback and the result is stored
# in the global redis cached
return generate_figure(value, {
‘data’: [{
‘type’: ‘scatter’,
‘mode’: ‘markers’,
‘marker’: {
‘opacity’: 0.5,
‘size’: 14,
‘line’: {‘border’: ‘thin darkgrey solid’}

@app.callback(Output(‘graph-2’, ‘figure’), Input(‘signal’, ‘children’))
def update_graph_2(value):
return generate_figure(value, {
‘data’: [{
‘type’: ‘scatter’,
‘mode’: ‘lines’,
‘line’: {‘shape’: ‘spline’, ‘width’: 0.5},

@app.callback(Output(‘graph-3’, ‘figure’), Input(‘signal’, ‘children’))
def update_graph_3(value):
return generate_figure(value, {
‘data’: [{
‘type’: ‘histogram2d’,

@app.callback(Output(‘graph-4’, ‘figure’), Input(‘signal’, ‘children’))
def update_graph_4(value):
return generate_figure(value, {
‘data’: [{
‘type’: ‘histogram2dcontour’,

if name == ‘main’:
app.run_server(debug=True, processes=6)

Hi @DataA,

Wellcome to the Dash Community.

I can find your code in the link you provided.

You can add code easily (to copy and paste) using this icon in the toolbar when you write your message: