DEV Community

Jesse Chong
Jesse Chong

Posted on • Originally published at Medium

Playing with a Stock API: A JavaScript/React Developer Learns Python



As someone new to Python, I recently embarked on a journey to explore its capabilities while working with a stock API. Along the way, I learned how to:

  • Set up a virtual environment
  • Manage packages
  • Use environment variables for sensitive data
  • Make HTTP requests and handle JSON
  • Implement error handling and string formatting
  • Work with Python’s dictionaries
  • Understand schemas provided by APIs

Here’s a breakdown of my learning experience and key takeaways!

1. Setting Up Python

Python’s virtual environments (venv) allow you to isolate your project’s dependencies, ensuring your packages don’t conflict with others. It’s great for professional development.

Steps to Create and Activate a Virtual Environment:Create a virtual environment

python -m venv venv

Activate it (Mac/Linux)

source venv/bin/activate

Activate it (Windows)

venv\Scripts\activate

This keeps your project’s packages separate from others.

Package ManagementUsing pip, Python’s package installer, I learned to manage dependencies:

Install packages

pip install requests python-dotenv

Save requirements

pip freeze > requirements.txt

Install from requirements

pip install -r requirements.txt

2. Environment Variables

To keep sensitive data secure, I used .env files for API keys and credentials:

 .env file

SCHWAB_CLIENT_ID=my_secret_id

SCHWAB_CLIENT_SECRET=my_secret_key

Python code

from dotenv import load_dotenv

import os

load_dotenv() # Load variables from .env

api_key = os.getenv(‘SCHWAB_CLIENT_ID’)

Important: Never commit .env files to Git. Use a .gitignore file to exclude them.

  • 3. Making HTTP Requests

I used the requests library to interact with APIs:

import requests

Make a GET request

response = requests.get(url, headers=headers, params=params)

Check if the request was successful

if response.status_code == 200:

data = response.json() # Convert response to JSON

4. Understanding Schemas

Before interacting with an API endpoint, I explored its schema. An API schema is like a blueprint that tells you:

  • Request Schema: What data you need to send, including required fields, data types, and constraints.
  • Response Schema: What data you can expect to receive, including structure, data types, and examples.

For example, if an API endpoint retrieves stock prices, the schema might look like this:

Request Schema:

{

“symbol”: “string”,

“date”: “string (YYYY-MM-DD)”,

“interval”: “string (e.g., ‘1d’, ‘1m’)”

}

Response Schema:

{

“symbol”: “string”,

“prices”: [

{

“date”: “string (YYYY-MM-DD)”,

“open”: “float”,

“close”: “float”,

“high”: “float”,

“low”: “float”,

“volume”: “integer”

}

]

}

Knowing the schema helps in two ways:

  1. Preparation: It ensures you structure your request correctly and know how to handle the response.
  2. Error Prevention: Adhering to schemas minimizes invalid requests or misinterpreted responses.

Schemas saved me time and made debugging much easier while working with the API.

5. Working with JSON

APIs often return data in JSON format. Here’s how I handled it in Python:

import json

Read JSON from a file

with open(‘tokens.json’, ‘r’) as f:

data = json.load(f)

Write JSON to a file

with open(‘tokens.json’, ‘w’) as f:

json.dump(data, f, indent=4)

6. Error Handling

Python’s try/except blocks helped me manage errors gracefully:

try:

response = requests.get(url)

data = response.json()

except Exception as e:

print(f”Error: {str(e)}”)

return None

7. String Formatting

Python’s f-strings and the .format() method make string formatting straightforward:

Using f-strings

print(f”Stock: {name}, Price: ${price:.2f}”)

Using .format()

print(“Stock: {}, Price: ${:.2f}”.format(name, price))

8. Dictionary Operations

Dictionaries in Python are powerful for handling nested API data:

Get value with default

price = data.get(‘price’, ‘N/A’)

Access nested dictionaries

stock = data[symbol]

quote = stock.get(‘quote’, {})

price = quote.get(‘lastPrice’, ‘N/A’)

9. Debugging Tips

Debugging in Python is simple and effective:

Print debugging

print(f”Debug: {variable}”)

Check variable types

print(f”Type: {type(data)}”)

Pretty print dictionaries

import json

print(json.dumps(data, indent=2))

10. Overcoming Authentication Challenges

One of the biggest hurdles I faced was getting authentication to work. I was stuck for a few days, trying different approaches without success. Eventually, I decided to reach out for support to understand why it wasn’t working.

It turned out that the issue was related to the type of account I was using. To authenticate successfully, I needed both a brokerage account and a developer account. I initially assumed that only a developer account was required, but the API also required credentials from an active brokerage account.

This experience taught me an important lesson: don’t hesitate to ask for help when needed. By putting my ego aside and seeking guidance, I gained a deeper understanding of the problem and solved it much faster than if I had continued struggling on my own

ConclusionPython is incredibly beginner-friendly! Here’s what I learned:

  • Virtual environments keep projects organized.
  • Environment variables protect sensitive data.
  • Libraries like requests simplify API calls.
  • Good error handling is crucial.
  • Clear function names and comments enhance readability.

Next Steps

  • Dive deeper into API authentication.
  • Explore data visualization.
  • Add more robust error handling.
  • Implement automated testing.

Final Thoughts
The best way to learn is by doing. Don’t be afraid to experiment and make mistakes — each challenge is an opportunity to grow!

Data analysis repo: https://github.com/Jesse-Chong/Schwab-Market-Analysis

Originally published at Medium

Top comments (0)