Create A Weather Data Collection System Using Python In 7 Steps

Have you ever wondered how weather data is collected or analyzed?

In this article, you’ll learn how to create a weather data collection system using Python, Matplotlib, and AWS SDK for Python (boto3). This approach allows you to create and analyze weather data from multiple locations effectively at scale.

Prerequisites

Before you begin, make sure you have:

  • AWS Account: You can sign up for a free tier AWS account if you don’t have one. You’ll need this to create and access the S3 bucket storing your weather data.
  • AWS CLI: You can Install the AWS Command Line Interface to interact with AWS services. You’ll use it to configure your credentials and manage your S3 bucket.
  • IAM User Account: Create an IAM(Identity Access Management) user with full access and permissions to use the S3 service. You’ll need an IAM User instead of using your main account.
  • OpenWeather API Account – You can sign up for a free tier account here. You need an API key to request the weather information.
  • Python3.6 or higher
  • Basic understanding of Python

Step 1: Configure AWS Credentials in the command line (CLI)

After installing the AWS CLI, You need to configure your AWS CLI to enable you to connect and access your account. Run the following command to configure your AWS CLI:

aws configure
aws configure
aws configure

Enter fullscreen mode Exit fullscreen mode

Enter the following details:
AWS_ACCESS_KEY_ID=<your_aws_access_key>
AWS_SECRET_ACCESS_KEY=<your_aws_secret_access_key>
DEFAULT_REGION=<aws_region>

Step 2: Create a virtual environment

After configuring your AWS CLI, you need to create a virtual environment for Python to enable us to isolate all the packages we’ll use in this project in a separate Python environment.

Run the following command to create a virtual environment:

python <span>-m</span> venv <name-of-your-virtual-env-folder>
  python <span>-m</span> venv <name-of-your-virtual-env-folder>
python -m venv <name-of-your-virtual-env-folder>

Enter fullscreen mode Exit fullscreen mode

After creating your virtual environment, you need to activate your virtual environment before installing or using any packages in your virtual environment.

To activate the virtual environment on Windows (with Powershell) run the following command:

.<span>\v</span><span>env</span><span>\S</span>cript<span>\A</span>ctivate.ps1
.<span>\v</span><span>env</span><span>\S</span>cript<span>\A</span>ctivate.ps1
.\venv\Script\Activate.ps1

Enter fullscreen mode Exit fullscreen mode

On macOS/Linux:

<span>source </span>venv/bin/activate
<span>source </span>venv/bin/activate
source venv/bin/activate

Enter fullscreen mode Exit fullscreen mode

Step 3: Installing the packages and libraries

After activating the virtual environment. Run the following command to install the packages or library using the requirements.txt file. This file contains a list of all the tools (also called libraries or packages) you need for this project.

The requirements.txt file will contain the following libraries:

boto3==1.26.137
python-dotenv==1.0.0
requests==2.28.2
matplotlib

pip <span>install</span> <span>-r</span> requirements.txt
pip <span>install</span> <span>-r</span> requirements.txt
pip install -r requirements.txt

Enter fullscreen mode Exit fullscreen mode

Step 4: Configuring the environment variables

Create a .env file in the root directory and configure the following contents:

<span>OPENWEATHER_API_KEY</span><span>=</span>your_api_key
<span>AWS_BUCKET_NAME</span><span>=</span>your_bucket_name
<span>OPENWEATHER_API_KEY</span><span>=</span>your_api_key
<span>AWS_BUCKET_NAME</span><span>=</span>your_bucket_name
OPENWEATHER_API_KEY=your_api_key AWS_BUCKET_NAME=your_bucket_name

Enter fullscreen mode Exit fullscreen mode

Step 5: Creating a Python file

After configuring the environment variables. Create a Python file named weather-dashboard.py.
Our python file will contain the following:

1. Setting Up The WeatherDashboard Class

Let’s start by creating our class constructor that will:

  • Fetch weather data from OpenWeather.
  • Create a S3 bucket.
  • Save fetched data to S3
<span>class</span> <span>WeatherDashboard</span><span>:</span>
<span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
<span>self</span><span>.</span><span>api_key</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>OPENWEATHER_API_KEY</span><span>'</span><span>)</span>
<span>self</span><span>.</span><span>bucket_name</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>AWS_BUCKET_NAME</span><span>'</span><span>)</span>
<span>self</span><span>.</span><span>s3_client</span> <span>=</span> <span>boto3</span><span>.</span><span>client</span><span>(</span><span>'</span><span>s3</span><span>'</span><span>)</span>
<span>class</span> <span>WeatherDashboard</span><span>:</span>
    <span>def</span> <span>__init__</span><span>(</span><span>self</span><span>):</span>
        <span>self</span><span>.</span><span>api_key</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>OPENWEATHER_API_KEY</span><span>'</span><span>)</span>
        <span>self</span><span>.</span><span>bucket_name</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>AWS_BUCKET_NAME</span><span>'</span><span>)</span>
        <span>self</span><span>.</span><span>s3_client</span> <span>=</span> <span>boto3</span><span>.</span><span>client</span><span>(</span><span>'</span><span>s3</span><span>'</span><span>)</span>
class WeatherDashboard: def __init__(self): self.api_key = os.getenv('OPENWEATHER_API_KEY') self.bucket_name = os.getenv('AWS_BUCKET_NAME') self.s3_client = boto3.client('s3')

Enter fullscreen mode Exit fullscreen mode

This code creates a class constructor named WeatherDashboard and stores different methods with each task to be executed. The __init__ method takes a parameter self. self is a reference to the current instance of the class and is used to access variables that belong to the class.

The __init__ method creates various objects that store the self.api_key for the OpenWeather API, bucket_name for the s3 bucket name and self.s3_client initializes an s3 client using boto3

Fetch Weather Data From OpenWeather

<span>def</span> <span>fetch_weather</span><span>(</span><span>self</span><span>,</span> <span>city</span><span>):</span>
<span>"""</span><span>Fetch weather data from OpenWeather API</span><span>"""</span>
<span>base_url</span> <span>=</span> <span>"</span><span>http://api.openweathermap.org/data/2.5/forecast?</span><span>"</span>
<span>params</span> <span>=</span> <span>{</span>
<span>"</span><span>q</span><span>"</span><span>:</span> <span>city</span><span>,</span>
<span>"</span><span>appid</span><span>"</span><span>:</span> <span>self</span><span>.</span><span>api_key</span><span>,</span>
<span>"</span><span>units</span><span>"</span><span>:</span> <span>"</span><span>imperial</span><span>"</span>
<span>}</span>
<span># Fetch weather data from API and handle errors if any occur </span> <span>try</span><span>:</span>
<span>response</span> <span>=</span> <span>requests</span><span>.</span><span>get</span><span>(</span><span>base_url</span><span>,</span> <span>params</span><span>=</span><span>params</span><span>)</span>
<span>except</span> <span>requests</span><span>.</span><span>exceptions</span><span>.</span><span>RequestException</span> <span>as</span> <span>e</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Error fetching weather data: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
<span>return</span> <span>None</span>
<span>else</span><span>:</span>
<span>response</span><span>.</span><span>raise_for_status</span><span>()</span>
<span>return</span> <span>response</span><span>.</span><span>json</span><span>()</span>
<span>def</span> <span>fetch_weather</span><span>(</span><span>self</span><span>,</span> <span>city</span><span>):</span>
    <span>"""</span><span>Fetch weather data from OpenWeather API</span><span>"""</span>
    <span>base_url</span> <span>=</span> <span>"</span><span>http://api.openweathermap.org/data/2.5/forecast?</span><span>"</span>
    <span>params</span> <span>=</span> <span>{</span>
        <span>"</span><span>q</span><span>"</span><span>:</span> <span>city</span><span>,</span>
        <span>"</span><span>appid</span><span>"</span><span>:</span> <span>self</span><span>.</span><span>api_key</span><span>,</span>
        <span>"</span><span>units</span><span>"</span><span>:</span> <span>"</span><span>imperial</span><span>"</span>
    <span>}</span>

    <span># Fetch weather data from API and handle errors if any occur </span>    <span>try</span><span>:</span>
        <span>response</span> <span>=</span> <span>requests</span><span>.</span><span>get</span><span>(</span><span>base_url</span><span>,</span> <span>params</span><span>=</span><span>params</span><span>)</span>
    <span>except</span> <span>requests</span><span>.</span><span>exceptions</span><span>.</span><span>RequestException</span> <span>as</span> <span>e</span><span>:</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Error fetching weather data: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
        <span>return</span> <span>None</span>
    <span>else</span><span>:</span>
        <span>response</span><span>.</span><span>raise_for_status</span><span>()</span>
        <span>return</span> <span>response</span><span>.</span><span>json</span><span>()</span>
def fetch_weather(self, city): """Fetch weather data from OpenWeather API""" base_url = "http://api.openweathermap.org/data/2.5/forecast?" params = { "q": city, "appid": self.api_key, "units": "imperial" } # Fetch weather data from API and handle errors if any occur try: response = requests.get(base_url, params=params) except requests.exceptions.RequestException as e: print(f"Error fetching weather data: {e}") return None else: response.raise_for_status() return response.json()

Enter fullscreen mode Exit fullscreen mode

The function fetches weather data from the OpenWeather API, sends the request, and returns the JSON response. This function also includes error handling to manage any potential issues.

Create S3 Bucket

<span>def</span> <span>create_bucket_if_not_exists</span><span>(</span><span>self</span><span>):</span>
<span>"""</span><span>Create S3 bucket if it doesn</span><span>'</span><span>t exist</span><span>"""</span>
<span>try</span><span>:</span>
<span>self</span><span>.</span><span>s3_client</span><span>.</span><span>head_bucket</span><span>(</span><span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span> exists</span><span>"</span><span>)</span>
<span>except</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Creating bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>
<span>try</span><span>:</span>
<span># Simpler creation for us-east-1 region </span> <span>if</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>AWS_DEFAULT_REGION</span><span>'</span><span>)</span> <span>==</span> <span>'</span><span>us-east-1</span><span>'</span><span>:</span>
<span>self</span><span>.</span><span>s3_client</span><span>.</span><span>create_bucket</span><span>(</span><span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully created bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>
<span>else</span><span>:</span>
<span>self</span><span>.</span><span>s3_client</span><span>.</span><span>create_bucket</span><span>(</span>
<span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>,</span>
<span>CreateBucketConfiguration</span><span>=</span><span>{</span>
<span>'</span><span>LocationConstraint</span><span>'</span><span>:</span> <span>'</span><span>eu-north-1</span><span>'</span>
<span>}</span>
<span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully created bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>
<span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Error creating bucket: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
<span>def</span> <span>create_bucket_if_not_exists</span><span>(</span><span>self</span><span>):</span>
    <span>"""</span><span>Create S3 bucket if it doesn</span><span>'</span><span>t exist</span><span>"""</span>
    <span>try</span><span>:</span>
        <span>self</span><span>.</span><span>s3_client</span><span>.</span><span>head_bucket</span><span>(</span><span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>)</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span> exists</span><span>"</span><span>)</span>
    <span>except</span><span>:</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Creating bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>
    <span>try</span><span>:</span>
        <span># Simpler creation for us-east-1 region </span>        <span>if</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>'</span><span>AWS_DEFAULT_REGION</span><span>'</span><span>)</span> <span>==</span> <span>'</span><span>us-east-1</span><span>'</span><span>:</span>
            <span>self</span><span>.</span><span>s3_client</span><span>.</span><span>create_bucket</span><span>(</span><span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>)</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully created bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>
        <span>else</span><span>:</span>
            <span>self</span><span>.</span><span>s3_client</span><span>.</span><span>create_bucket</span><span>(</span>
                <span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>,</span>
                <span>CreateBucketConfiguration</span><span>=</span><span>{</span>
                    <span>'</span><span>LocationConstraint</span><span>'</span><span>:</span> <span>'</span><span>eu-north-1</span><span>'</span>
                <span>}</span>
            <span>)</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully created bucket </span><span>{</span><span>self</span><span>.</span><span>bucket_name</span><span>}</span><span>"</span><span>)</span>

    <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Error creating bucket: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
def create_bucket_if_not_exists(self): """Create S3 bucket if it doesn't exist""" try: self.s3_client.head_bucket(Bucket=self.bucket_name) print(f"Bucket {self.bucket_name} exists") except: print(f"Creating bucket {self.bucket_name}") try: # Simpler creation for us-east-1 region if os.getenv('AWS_DEFAULT_REGION') == 'us-east-1': self.s3_client.create_bucket(Bucket=self.bucket_name) print(f"Successfully created bucket {self.bucket_name}") else: self.s3_client.create_bucket( Bucket=self.bucket_name, CreateBucketConfiguration={ 'LocationConstraint': 'eu-north-1' } ) print(f"Successfully created bucket {self.bucket_name}") except Exception as e: print(f"Error creating bucket: {e}")

Enter fullscreen mode Exit fullscreen mode

This function checks if an S3 bucket with the specified name already exists. If the bucket is not found, it creates a new one. This function also includes error handling to manage any potential issues.

Save Fetched Data To S3

<span>def</span> <span>save_to_s3</span><span>(</span><span>self</span><span>,</span> <span>weather_data</span><span>,</span> <span>city</span><span>):</span>
<span>"""</span><span>Save weather data to S3 bucket</span><span>"""</span>
<span>if</span> <span>not</span> <span>weather_data</span><span>:</span>
<span>return</span> <span>False</span>
<span>timestamp</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>().</span><span>strftime</span><span>(</span><span>'</span><span>%Y%m%d-%H%M%S</span><span>'</span><span>)</span>
<span>file_name</span> <span>=</span> <span>f</span><span>"</span><span>weather-data/</span><span>{</span><span>city</span><span>}</span><span>-</span><span>{</span><span>timestamp</span><span>}</span><span>.json</span><span>"</span>
<span>try</span><span>:</span>
<span>"""</span><span>put weather data into S3 bucket</span><span>"""</span>
<span>weather_data</span><span>[</span><span>'</span><span>timestamp</span><span>'</span><span>]</span> <span>=</span> <span>timestamp</span>
<span>self</span><span>.</span><span>s3_client</span><span>.</span><span>put_object</span><span>(</span>
<span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>,</span>
<span>Key</span><span>=</span><span>file_name</span><span>,</span>
<span>Body</span><span>=</span><span>json</span><span>.</span><span>dumps</span><span>(</span><span>weather_data</span><span>),</span>
<span>ContentType</span><span>=</span><span>'</span><span>application/json</span><span>'</span>
<span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully saved data for </span><span>{</span><span>city</span><span>}</span><span> to S3</span><span>"</span><span>)</span>
<span>return</span> <span>True</span>
<span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Error saving to S3: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
<span>return</span> <span>False</span>
<span>def</span> <span>save_to_s3</span><span>(</span><span>self</span><span>,</span> <span>weather_data</span><span>,</span> <span>city</span><span>):</span>
    <span>"""</span><span>Save weather data to S3 bucket</span><span>"""</span>
    <span>if</span> <span>not</span> <span>weather_data</span><span>:</span>
        <span>return</span> <span>False</span>

    <span>timestamp</span> <span>=</span> <span>datetime</span><span>.</span><span>now</span><span>().</span><span>strftime</span><span>(</span><span>'</span><span>%Y%m%d-%H%M%S</span><span>'</span><span>)</span>
    <span>file_name</span> <span>=</span> <span>f</span><span>"</span><span>weather-data/</span><span>{</span><span>city</span><span>}</span><span>-</span><span>{</span><span>timestamp</span><span>}</span><span>.json</span><span>"</span>

    <span>try</span><span>:</span>
        <span>"""</span><span>put weather data into S3 bucket</span><span>"""</span>
        <span>weather_data</span><span>[</span><span>'</span><span>timestamp</span><span>'</span><span>]</span> <span>=</span> <span>timestamp</span>
        <span>self</span><span>.</span><span>s3_client</span><span>.</span><span>put_object</span><span>(</span>
            <span>Bucket</span><span>=</span><span>self</span><span>.</span><span>bucket_name</span><span>,</span>
            <span>Key</span><span>=</span><span>file_name</span><span>,</span>
            <span>Body</span><span>=</span><span>json</span><span>.</span><span>dumps</span><span>(</span><span>weather_data</span><span>),</span>
            <span>ContentType</span><span>=</span><span>'</span><span>application/json</span><span>'</span>
        <span>)</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Successfully saved data for </span><span>{</span><span>city</span><span>}</span><span> to S3</span><span>"</span><span>)</span>
        <span>return</span> <span>True</span>
    <span>except</span> <span>Exception</span> <span>as</span> <span>e</span><span>:</span>
        <span>print</span><span>(</span><span>f</span><span>"</span><span>Error saving to S3: </span><span>{</span><span>e</span><span>}</span><span>"</span><span>)</span>
        <span>return</span> <span>False</span>
def save_to_s3(self, weather_data, city): """Save weather data to S3 bucket""" if not weather_data: return False timestamp = datetime.now().strftime('%Y%m%d-%H%M%S') file_name = f"weather-data/{city}-{timestamp}.json" try: """put weather data into S3 bucket""" weather_data['timestamp'] = timestamp self.s3_client.put_object( Bucket=self.bucket_name, Key=file_name, Body=json.dumps(weather_data), ContentType='application/json' ) print(f"Successfully saved data for {city} to S3") return True except Exception as e: print(f"Error saving to S3: {e}") return False

Enter fullscreen mode Exit fullscreen mode

This function stores weather data as a JSON file in the S3 bucket. This function also includes error handling to manage any potential issues.
2. Visualize Weather Data Using Matplotlib

Next, Let’s create a function named visualize_weather_data outside our class constructor that:

Creates a bar chart to represent the weather data.
Adds city names on the x-axis and temperatures on the y-axis.
Annotates each bar with the weather conditions.

<span># create a function that takes three parameters for the cities, temperatures, and conditions </span>
<span>def</span> <span>visualize_weather_data</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>conditions</span><span>):</span>
<span># Visualize the weather data using matplotlib. </span> <span>axes</span> <span>=</span> <span>plt</span><span>.</span><span>subplots</span><span>()[</span><span>1</span><span>]</span> <span># create multiple subplots </span> <span># Create a bar chart </span> <span>axes</span><span>.</span><span>bar</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>color</span><span>=</span> <span>'</span><span>skyblue</span><span>'</span><span>)</span> <span># create a bar chart using the cities and temperature values </span> <span># Add labels and title </span> <span>axes</span><span>.</span><span>set_xlabel</span><span>(</span><span>'</span><span>City</span><span>'</span><span>)</span>
<span>axes</span><span>.</span><span>set_ylabel</span><span>(</span><span>'</span><span>Temperature (°F)</span><span>'</span><span>)</span>
<span>axes</span><span>.</span><span>set_title</span><span>(</span><span>f</span><span>"</span><span>Weather in </span><span>{</span><span>cities</span><span>}</span><span> - </span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>().</span><span>strftime</span><span>(</span><span>'</span><span>%Y-%m-%d %H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span>"</span><span>)</span>
<span># Annotate each bar chart with the weather conditions </span> <span>for</span> <span>i</span><span>,</span> <span>condition</span> <span>in</span> <span>enumerate</span><span>(</span><span>conditions</span><span>):</span>
<span>if</span> <span>i</span> <span><</span> <span>len</span><span>(</span><span>temperatures</span><span>):</span>
<span>axes</span><span>.</span><span>text</span><span>(</span><span>i</span><span>,</span> <span>temperatures</span><span>[</span><span>i</span><span>],</span> <span>condition</span><span>,</span> <span>ha</span><span>=</span><span>'</span><span>center</span><span>'</span><span>,</span> <span>va</span><span>=</span><span>'</span><span>bottom</span><span>'</span><span>)</span>
<span># Display the plot </span> <span>plt</span><span>.</span><span>show</span><span>()</span>
<span># create a function that takes three parameters for the cities, temperatures, and conditions </span>
<span>def</span> <span>visualize_weather_data</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>conditions</span><span>):</span>
    <span># Visualize the weather data using matplotlib. </span>    <span>axes</span> <span>=</span> <span>plt</span><span>.</span><span>subplots</span><span>()[</span><span>1</span><span>]</span> <span># create multiple subplots </span>    <span># Create a bar chart </span>    <span>axes</span><span>.</span><span>bar</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>color</span><span>=</span> <span>'</span><span>skyblue</span><span>'</span><span>)</span> <span># create a bar chart using the cities and temperature values </span>        <span># Add labels and title </span>    <span>axes</span><span>.</span><span>set_xlabel</span><span>(</span><span>'</span><span>City</span><span>'</span><span>)</span>
    <span>axes</span><span>.</span><span>set_ylabel</span><span>(</span><span>'</span><span>Temperature (°F)</span><span>'</span><span>)</span>
    <span>axes</span><span>.</span><span>set_title</span><span>(</span><span>f</span><span>"</span><span>Weather in </span><span>{</span><span>cities</span><span>}</span><span> - </span><span>{</span><span>datetime</span><span>.</span><span>now</span><span>().</span><span>strftime</span><span>(</span><span>'</span><span>%Y-%m-%d %H</span><span>:</span><span>%</span><span>M</span><span>:</span><span>%</span><span>S</span><span>'</span><span>)</span><span>}</span><span>"</span><span>)</span>

    <span># Annotate each bar chart with the weather conditions </span>    <span>for</span> <span>i</span><span>,</span> <span>condition</span> <span>in</span> <span>enumerate</span><span>(</span><span>conditions</span><span>):</span>
        <span>if</span> <span>i</span> <span><</span> <span>len</span><span>(</span><span>temperatures</span><span>):</span>
            <span>axes</span><span>.</span><span>text</span><span>(</span><span>i</span><span>,</span> <span>temperatures</span><span>[</span><span>i</span><span>],</span> <span>condition</span><span>,</span> <span>ha</span><span>=</span><span>'</span><span>center</span><span>'</span><span>,</span> <span>va</span><span>=</span><span>'</span><span>bottom</span><span>'</span><span>)</span>

    <span># Display the plot </span>    <span>plt</span><span>.</span><span>show</span><span>()</span>
# create a function that takes three parameters for the cities, temperatures, and conditions def visualize_weather_data(cities, temperatures, conditions): # Visualize the weather data using matplotlib. axes = plt.subplots()[1] # create multiple subplots # Create a bar chart axes.bar(cities, temperatures, color= 'skyblue') # create a bar chart using the cities and temperature values # Add labels and title axes.set_xlabel('City') axes.set_ylabel('Temperature (°F)') axes.set_title(f"Weather in {cities} - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") # Annotate each bar chart with the weather conditions for i, condition in enumerate(conditions): if i < len(temperatures): axes.text(i, temperatures[i], condition, ha='center', va='bottom') # Display the plot plt.show()

Enter fullscreen mode Exit fullscreen mode

3. Fetching And Storing The Weather Data In The Main Function

Next, Let’s create a function named main outside our class constructor that:

Creates an of Instance of our class constructor WeatherDashboard
Fetches the weather data for our predefined cities
Allows user to add more cities
Saves data to S3
Calls the visualization function

<span>def</span> <span>main</span><span>():</span>
<span>dashboard</span> <span>=</span> <span>WeatherDashboard</span><span>()</span>
<span># Create bucket if needed </span> <span>dashboard</span><span>.</span><span>create_bucket_if_not_exists</span><span>()</span>
<span>cities</span> <span>=</span> <span>[</span><span>"</span><span>Philadelphia</span><span>"</span><span>,</span> <span>"</span><span>Seattle</span><span>"</span><span>,</span> <span>"</span><span>New York</span><span>"</span><span>]</span>
<span>while</span> <span>True</span><span>:</span>
<span># create an input that prompt the user if he will like to add another cities and if yes, add the city to the cities list and if no, continue with the existing cities list </span> <span>add_more</span> <span>=</span> <span>input</span><span>(</span><span>f</span><span>"</span><span>Will you like to add another city to the list? (yes/no): </span><span>"</span><span>).</span><span>lower</span><span>()</span>
<span>if</span> <span>add_more</span> <span>==</span> <span>"</span><span>yes</span><span>"</span><span>:</span>
<span>city</span> <span>=</span> <span>input</span><span>(</span><span>"</span><span>Enter city name: </span><span>"</span><span>)</span>
<span>cities</span><span>.</span><span>append</span><span>(</span><span>city</span><span>)</span>
<span>break</span>
<span>elif</span> <span>add_more</span> <span>==</span> <span>"</span><span>no</span><span>"</span><span>:</span>
<span>break</span>
<span>else</span><span>:</span>
<span>print</span><span>(</span><span>"</span><span>Invalid input. Please enter </span><span>'</span><span>yes</span><span>'</span><span> or </span><span>'</span><span>no</span><span>'</span><span>.</span><span>"</span><span>)</span>
<span>#create an empty list for conditions </span> <span>conditions</span> <span>=</span> <span>[]</span>
<span># create an empty list for temperatures </span> <span>temperatures</span> <span>=</span> <span>[]</span>
<span>for</span> <span>city</span> <span>in</span> <span>cities</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>\n</span><span>Fetching weather for </span><span>{</span><span>city</span><span>}</span><span>...</span><span>"</span><span>)</span>
<span># create a variable to hold the weather data for the city and print the temperature, feels like, humidity and description </span> <span>weather_data</span> <span>=</span> <span>dashboard</span><span>.</span><span>fetch_weather</span><span>(</span><span>city</span><span>)</span>
<span>if</span> <span>weather_data</span><span>:</span>
<span>temp</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>temp</span><span>'</span><span>]</span>
<span>feels_like</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>feels_like</span><span>'</span><span>]</span>
<span>humidity</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>humidity</span><span>'</span><span>]</span>
<span>condition</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>weather</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>description</span><span>'</span><span>]</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Temperature: </span><span>{</span><span>temp</span><span>}</span><span>°F</span><span>"</span><span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Feels like: </span><span>{</span><span>feels_like</span><span>}</span><span>°F</span><span>"</span><span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Humidity: </span><span>{</span><span>humidity</span><span>}</span><span>%</span><span>"</span><span>)</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Conditions: </span><span>{</span><span>conditions</span><span>}</span><span>"</span><span>)</span>
<span># Add temperatures and conditions to respective lists </span> <span>temperatures</span><span>.</span><span>append</span><span>(</span><span>temp</span><span>)</span>
<span>conditions</span><span>.</span><span>append</span><span>(</span><span>condition</span><span>)</span>
<span># Save to S3 </span> <span>success</span> <span>=</span> <span>dashboard</span><span>.</span><span>save_to_s3</span><span>(</span><span>weather_data</span><span>,</span> <span>city</span><span>)</span>
<span>if</span> <span>success</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Weather data for </span><span>{</span><span>city</span><span>}</span><span> saved to S3!</span><span>"</span><span>)</span>
<span>else</span><span>:</span>
<span>print</span><span>(</span><span>f</span><span>"</span><span>Failed to fetch weather data for </span><span>{</span><span>city</span><span>}</span><span>"</span><span>)</span>
<span># calling the visualize_weather_data function </span> <span>visualize_weather_data</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>conditions</span><span>)</span>
<span>return</span> <span>"</span><span>Weather data collected successfully</span><span>"</span>
<span>If</span> <span>__name__</span> <span>==</span> <span></span><span>__main__</span><span></span><span>:</span>
<span>main</span><span>()</span>
<span>def</span> <span>main</span><span>():</span>
    <span>dashboard</span> <span>=</span> <span>WeatherDashboard</span><span>()</span>

    <span># Create bucket if needed </span>    <span>dashboard</span><span>.</span><span>create_bucket_if_not_exists</span><span>()</span>

    <span>cities</span> <span>=</span> <span>[</span><span>"</span><span>Philadelphia</span><span>"</span><span>,</span> <span>"</span><span>Seattle</span><span>"</span><span>,</span> <span>"</span><span>New York</span><span>"</span><span>]</span>

    <span>while</span> <span>True</span><span>:</span>
        <span># create an input that prompt the user if he will like to add another cities and if yes, add the city to the cities list and if no, continue with the existing cities list </span>        <span>add_more</span> <span>=</span> <span>input</span><span>(</span><span>f</span><span>"</span><span>Will you like to add another city to the list? (yes/no): </span><span>"</span><span>).</span><span>lower</span><span>()</span>
        <span>if</span> <span>add_more</span> <span>==</span> <span>"</span><span>yes</span><span>"</span><span>:</span>
            <span>city</span> <span>=</span> <span>input</span><span>(</span><span>"</span><span>Enter city name: </span><span>"</span><span>)</span>
            <span>cities</span><span>.</span><span>append</span><span>(</span><span>city</span><span>)</span>
            <span>break</span>
        <span>elif</span> <span>add_more</span> <span>==</span> <span>"</span><span>no</span><span>"</span><span>:</span>
            <span>break</span>
        <span>else</span><span>:</span>
                <span>print</span><span>(</span><span>"</span><span>Invalid input. Please enter </span><span>'</span><span>yes</span><span>'</span><span> or </span><span>'</span><span>no</span><span>'</span><span>.</span><span>"</span><span>)</span>

    <span>#create an empty list for conditions </span>    <span>conditions</span> <span>=</span> <span>[]</span>
    <span># create an empty list for temperatures </span>    <span>temperatures</span> <span>=</span> <span>[]</span>

    <span>for</span> <span>city</span> <span>in</span> <span>cities</span><span>:</span>

        <span>print</span><span>(</span><span>f</span><span>"</span><span>\n</span><span>Fetching weather for </span><span>{</span><span>city</span><span>}</span><span>...</span><span>"</span><span>)</span>

        <span># create a variable to hold the weather data for the city and print the temperature, feels like, humidity and description </span>        <span>weather_data</span> <span>=</span> <span>dashboard</span><span>.</span><span>fetch_weather</span><span>(</span><span>city</span><span>)</span>
        <span>if</span> <span>weather_data</span><span>:</span>
            <span>temp</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>temp</span><span>'</span><span>]</span>
            <span>feels_like</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>feels_like</span><span>'</span><span>]</span>
            <span>humidity</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>main</span><span>'</span><span>][</span><span>'</span><span>humidity</span><span>'</span><span>]</span>
            <span>condition</span> <span>=</span> <span>weather_data</span><span>[</span><span>'</span><span>list</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>weather</span><span>'</span><span>][</span><span>0</span><span>][</span><span>'</span><span>description</span><span>'</span><span>]</span>

            <span>print</span><span>(</span><span>f</span><span>"</span><span>Temperature: </span><span>{</span><span>temp</span><span>}</span><span>°F</span><span>"</span><span>)</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Feels like: </span><span>{</span><span>feels_like</span><span>}</span><span>°F</span><span>"</span><span>)</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Humidity: </span><span>{</span><span>humidity</span><span>}</span><span>%</span><span>"</span><span>)</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Conditions: </span><span>{</span><span>conditions</span><span>}</span><span>"</span><span>)</span>

            <span># Add temperatures and conditions to respective lists </span>            <span>temperatures</span><span>.</span><span>append</span><span>(</span><span>temp</span><span>)</span>
            <span>conditions</span><span>.</span><span>append</span><span>(</span><span>condition</span><span>)</span>

        <span># Save to S3 </span>        <span>success</span> <span>=</span> <span>dashboard</span><span>.</span><span>save_to_s3</span><span>(</span><span>weather_data</span><span>,</span> <span>city</span><span>)</span>
        <span>if</span> <span>success</span><span>:</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Weather data for </span><span>{</span><span>city</span><span>}</span><span> saved to S3!</span><span>"</span><span>)</span>
        <span>else</span><span>:</span>
            <span>print</span><span>(</span><span>f</span><span>"</span><span>Failed to fetch weather data for </span><span>{</span><span>city</span><span>}</span><span>"</span><span>)</span>

    <span># calling the visualize_weather_data function </span>    <span>visualize_weather_data</span><span>(</span><span>cities</span><span>,</span> <span>temperatures</span><span>,</span> <span>conditions</span><span>)</span>

    <span>return</span> <span>"</span><span>Weather data collected successfully</span><span>"</span>

<span>If</span> <span>__name__</span> <span>==</span> <span>“</span><span>__main__</span><span>”</span><span>:</span>
     <span>main</span><span>()</span>
def main(): dashboard = WeatherDashboard() # Create bucket if needed dashboard.create_bucket_if_not_exists() cities = ["Philadelphia", "Seattle", "New York"] while True: # create an input that prompt the user if he will like to add another cities and if yes, add the city to the cities list and if no, continue with the existing cities list add_more = input(f"Will you like to add another city to the list? (yes/no): ").lower() if add_more == "yes": city = input("Enter city name: ") cities.append(city) break elif add_more == "no": break else: print("Invalid input. Please enter 'yes' or 'no'.") #create an empty list for conditions conditions = [] # create an empty list for temperatures temperatures = [] for city in cities: print(f"\nFetching weather for {city}...") # create a variable to hold the weather data for the city and print the temperature, feels like, humidity and description weather_data = dashboard.fetch_weather(city) if weather_data: temp = weather_data['list'][0]['main']['temp'] feels_like = weather_data['list'][0]['main']['feels_like'] humidity = weather_data['list'][0]['main']['humidity'] condition = weather_data['list'][0]['weather'][0]['description'] print(f"Temperature: {temp}°F") print(f"Feels like: {feels_like}°F") print(f"Humidity: {humidity}%") print(f"Conditions: {conditions}") # Add temperatures and conditions to respective lists temperatures.append(temp) conditions.append(condition) # Save to S3 success = dashboard.save_to_s3(weather_data, city) if success: print(f"Weather data for {city} saved to S3!") else: print(f"Failed to fetch weather data for {city}") # calling the visualize_weather_data function visualize_weather_data(cities, temperatures, conditions) return "Weather data collected successfully" If __name__ == __main__: main()

Enter fullscreen mode Exit fullscreen mode

This function stores the instance of our class constructor in a variable name dashboard. The main function fetches the weather data for predefined cities, saves it to an S3 bucket, prints the status of the weather data, and visualizes the weather data using matplotlib.

STEP 6:

Run the following command to execute the application:

<span>python</span> <span>weather_dashboard</span><span>.</span><span>py</span>
<span>python</span> <span>weather_dashboard</span><span>.</span><span>py</span>
python weather_dashboard.py

Enter fullscreen mode Exit fullscreen mode

You should see the following output:

Step 7: Conclusion

Congratulations! You’ve successfully built a weather data collection system using Python, Matplotlib, and AWS SDK. This application fetches real-time weather data, stores it in an S3 bucket, and creates visual representations of the data. Also, you can further enhance the project by:

  • Adding automated data collection scheduling
  • Adding automated testing
  • Creating a web interface for your dashboard

GitHub Repositiory:

You can find the complete project files in this repository: Github

Resources for further learning:

Matplotlib

Matplotlib Subplot Documentation

OpenWeather API Documentation

AWS S3 Documentation

原文链接:Create A Weather Data Collection System Using Python In 7 Steps

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
Work hard in silence, let success make the noise.
在沉默中努力,让成功自己发声
评论 抢沙发

请登录后发表评论

    暂无评论内容