🖋️
Labs DS Guide
  • Labs DS guide
  • Process
    • Labs for DS
    • Sprints
    • New Tech
    • How to get help
  • Tech
    • Structure
    • Architecture
    • Data wrangling
    • FastAPI
Powered by GitBook
On this page
  • Learn
  • Example: Data visualization
  • Example: Machine learning

Was this helpful?

  1. Tech

FastAPI

PreviousData wrangling

Last updated 2 years ago

Was this helpful?

Learn

  • Read (10 minutes)

  • Watch by FastAPI’s creator. Live coding starts at 4:55, ends at 50:20. (25 minutes at 2x speed)

Example: Data visualization

Labs projects can use , a popular visualization library for both Python & JavaScript.

Follow the instructions.

Edit app/main.py to add your API title and description.

app = FastAPI(
    title='World Metrics DS API',
    description='Visualize world metrics from Gapminder data',
    docs_url='/'
)

Prototype your visualization in a notebook.

import plotly.express as px

dataframe = px.data.gapminder().rename(columns={
    'year': 'Year', 
    'lifeExp': 'Life Expectancy', 
    'pop': 'Population', 
    'gdpPercap': 'GDP Per Capita'
})

country = 'United States'
metric = 'Population'
subset = dataframe[dataframe.country == country]
fig = px.line(subset, x='Year', y=metric, title=f'{metric} in {country}')
fig.show()

Define a function for your visualization. End with return fig.to_json()

Then edit app/viz.py to add your code.

import plotly.express as px

dataframe = px.data.gapminder().rename(columns={
    'year': 'Year', 
    'lifeExp': 'Life Expectancy', 
    'pop': 'Population', 
    'gdpPercap': 'GDP Per Capita'
})


@router.get('/worldviz')
async def worldviz(metric, country):
    """
    Visualize world metrics from Gapminder data

    ### Query Parameters
    - `metric`: 'Life Expectancy', 'Population', or 'GDP Per Capita'
    - `country`: [country name](https://www.gapminder.org/data/geo/), case sensitive

    ### Response
    JSON string to render with react-plotly.js
    """
    subset = dataframe[dataframe.country == country]
    fig = px.line(subset, x='Year', y=metric, title=f'{metric} in {country}')
    return fig.to_json()

Install plotly and test locally.

Plotly Python docs

Plotly JavaScript docs

Example: Machine learning

Edit app/main.py to add your API title and description.

app = FastAPI(
    title='House Price DS API',
    description='Predict house prices in California',
    docs_url='/'
)

Edit app/ml.py to add a predict function that returns a naive baseline.

@router.post('/predict')
async def predict(item: Item):
    """Predict house prices in California."""
    y_pred = 200000
    return {'predicted_price': y_pred}

In a notebook, explore your data. Make an educated guess of what features you'll use.

import pandas as pd
from sklearn.datasets import fetch_california_housing

# Load data
california = fetch_california_housing()
print(california.DESCR)
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target

# Rename columns
X.columns = X.columns.str.lower()
X = X.rename(columns={'avebedrms': 'bedrooms', 'averooms': 'total_rooms', 'houseage': 'house_age'})

# Explore descriptive stats
X.describe()
# Use these 3 features
features = ['bedrooms', 'total_rooms', 'house_age']

Add a class in app/ml.py to use your features.

import pandas as pd
from pydantic import BaseModel


class House(BaseModel):
    """Data model to parse the request body JSON."""
    bedrooms: int
    total_rooms: float
    house_age: float

    def to_df(self):
        """Convert pydantic object to pandas dataframe with 1 row."""
        return pd.DataFrame([vars(self)])


@router.post('/predict')
async def predict(house: House):
    """Predict house prices in California."""
    X_new = house.to_df()
    y_pred = 200000
    return {'predicted_price': y_pred}

Install pandas if you haven't already.

Test locally. Now your web teammates can make POST requests to your API endpoint.

In a notebook, train your pipeline and pickle it. See these docs:

Get version numbers for every package you used in your pipeline. Install the exact versions of these packages in your virtual environment.

Edit app/ml.py to deserialize your model and use it in your predict function.

Now you are ready to re-deploy! 🚀

Your web teammates will re-use the . The web app will call the DS API to get the data, then use react-plotly.js to render the visualization.

BloomTech

Follow the instructions.

data viz code & docs in our labs-spa-starter repo
Example gallery
Setting Graph Size
Styling Plotly Express Figures
Text and font styling
Theming and templates
labs-spa-starter data viz code & docs
Example gallery
Fundamentals
react-plotly.js
Scikit-learn docs - Model persistence
“FastAPI for Flask Users”
“Build a machine learning API from scratch”
Plotly
getting started
getting started