mirror of
https://github.com/PR0M3TH3AN/python_charts.git
synced 2026-10-27 08:50:39 +00:00
Refactor README and scripts for Lagged Oil-Unemployment Chart
Update README.md to reflect new project focus on lagged oil and unemployment charting. Revise installation instructions, quickstart guide, and repository structure. Modify scripts for data fetching and plotting, and add a new SQLite database for storing FRED data. Introduce a startup script to streamline setup and execution.
This commit is contained in:
1 parent
6b3ffe0b6a
commit
8797ef1d04
5 files changed
+266
-293
No files matched your search
@@ -1,190 +1,138 @@
|
||||
# RePrompt – Repository-Context Generator
|
||||
# Lagged Oil–Unemployment Chart
|
||||
|
||||
**RePrompt** creates a single `repo-context.txt` file that gives AI coding assistants
|
||||
(e.g. ChatGPT) a concise, opinionated snapshot of your repository.
|
||||
It combines an overview, directory tree, highlighted file contents, and optional static
|
||||
sections such as to-do lists—all configurable through a Streamlit UI.
|
||||
A self-contained toolkit that:
|
||||
|
||||
> **Works great with**
|
||||
> [mckaywrigley’s XML parser](https://github.com/mckaywrigley/o1-xml-parser/tree/main).
|
||||
* Fetches U.S. unemployment rate (UNRATE) and WTI crude oil price (DCOILWTICO) from FRED
|
||||
* Stores the series in a local SQLite database (`data/fred.db`)
|
||||
* Produces a dual-axis plot of unemployment vs. lagged oil price, with customizable lag, date range, and styling
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## ✨ Features
|
||||
|
||||
| Category | What it does |
|
||||
|----------|--------------|
|
||||
| **Streamlit UI** | Choose a target repo, set include/exclude rules, and generate the context file in one screen. |
|
||||
| **Context builder** | Produces `repo-context.txt` tailored for AI assistants. |
|
||||
| **Configurable tree** | Exclude or include directories/files interactively (defaults skip noisy folders like `node_modules`, `.git`, etc.). |
|
||||
| **File highlights** | Embeds syntax-highlighted contents of “important” files you pick. |
|
||||
| **Static sections** | Auto-appends `overview.txt`, `to-do_list.txt`, or any custom text snippets. |
|
||||
| **Save & load config** | Persist your include/exclude selections for future sessions. |
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Prerequisites
|
||||
|
||||
* **Python 3.7 +** – [download](https://www.python.org/downloads/)
|
||||
* **Git** – [download](https://git-scm.com/downloads)
|
||||
|
||||
---
|
||||
|
||||
## 🗂 Directory layout
|
||||
|
||||
```
|
||||
|
||||
RePrompt/
|
||||
├── src/
|
||||
│ ├── app.py # Streamlit entry-point
|
||||
│ ├── generate\_repo\_context.py # Core context-builder
|
||||
│ ├── config.yaml # Default config (auto-generated if absent)
|
||||
│ ├── index.html # Single-page static explanation
|
||||
│ └── requirements.txt # Python dependencies
|
||||
└── README.md
|
||||
|
||||
````
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
### 1 Clone the repo
|
||||
## 🚀 Quickstart
|
||||
|
||||
```bash
|
||||
git clone https://github.com/PR0M3TH3AN/RePrompt.git
|
||||
cd RePrompt
|
||||
````
|
||||
# Clone the repo
|
||||
git clone https://github.com/your-org/python_charts.git
|
||||
cd python_charts
|
||||
|
||||
### 2 Create & activate a virtual-environment
|
||||
|
||||
<details>
|
||||
<summary>Windows (PowerShell)</summary>
|
||||
|
||||
```powershell
|
||||
python -m venv venv
|
||||
venv\Scripts\Activate.ps1
|
||||
# One-command: install deps, download data, and plot
|
||||
./startup.sh python scripts/lagged_oil_unrate_chart_styled.py \
|
||||
--offset 12 --end 2025-05-31 --extend-years 5
|
||||
```
|
||||
|
||||
</details>
|
||||
This will:
|
||||
|
||||
<details>
|
||||
<summary>macOS / Linux</summary>
|
||||
1. Create (or reuse) a Python 3 virtual environment (`venv/`)
|
||||
2. Upgrade `pip` & `setuptools` (providing `distutils` support)
|
||||
3. Install required packages (offline wheelhouse first, PyPI fallback)
|
||||
4. Download UNRATE & DCOILWTICO into `data/fred.db` if missing
|
||||
5. Generate the chart with a 12-month oil lead, extending the x-axis by 5 years
|
||||
|
||||
---
|
||||
|
||||
## 📁 Repository Structure
|
||||
|
||||
```bash
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### 3 Install dependencies
|
||||
|
||||
```bash
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r src/requirements.txt
|
||||
```
|
||||
|
||||
`requirements.txt` contains only three packages:
|
||||
|
||||
```text
|
||||
streamlit
|
||||
PyYAML
|
||||
pyperclip
|
||||
python_charts/
|
||||
├── data/
|
||||
│ └── fred.db # Local FRED snapshot (SQLite)
|
||||
├── scripts/
|
||||
│ ├── refresh_data.py # Download and store FRED series
|
||||
│ ├── lagged_oil_unrate_chart_styled.py # Plotting script
|
||||
│ └── pyproject.toml # Packaging metadata
|
||||
├── startup.sh # Bootstraps venv, deps, data, and runs commands
|
||||
├── requirements.txt # Python dependencies
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ▶️ Running the app
|
||||
## 🛠️ Installation & Setup
|
||||
|
||||
```bash
|
||||
streamlit run src/app.py
|
||||
```
|
||||
1. **Ensure** you have Python 3.8+ installed on your system.
|
||||
2. **Clone** and navigate into the project:
|
||||
|
||||
The UI opens at **[http://localhost:8501](http://localhost:8501)**.
|
||||
```bash
|
||||
git clone https://github.com/your-org/python_charts.git
|
||||
cd python_charts
|
||||
```
|
||||
3. **Make** the startup script executable:
|
||||
|
||||
---
|
||||
|
||||
## 📝 Usage walk-through
|
||||
|
||||
1. **Config file**
|
||||
A starter `config.yaml` is created in `src/`:
|
||||
|
||||
```yaml
|
||||
exclude_dirs:
|
||||
- node_modules
|
||||
- venv
|
||||
- __pycache__
|
||||
- .git
|
||||
- dist
|
||||
- build
|
||||
- logs
|
||||
- .idea
|
||||
- .vscode
|
||||
|
||||
important_files: []
|
||||
custom_sections: []
|
||||
```bash
|
||||
chmod +x startup.sh
|
||||
```
|
||||
|
||||
2. **Select repo**
|
||||
Click **“Choose Folder”** in the sidebar, navigate to the repository you
|
||||
want to summarise, and select it.
|
||||
|
||||
3. **Fine-tune files**
|
||||
|
||||
* Tick directories to *include* in the rendered tree.
|
||||
* Exclude noisy or irrelevant files.
|
||||
* Review the final list.
|
||||
|
||||
4. **Generate**
|
||||
Hit **“Generate Context File”**.
|
||||
Download or copy the result; optionally save the configuration for later.
|
||||
> On first run, `startup.sh` will build the environment, install dependencies, and pull data.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Customisation tips
|
||||
## ⚙️ Usage
|
||||
|
||||
### Change default exclusions
|
||||
|
||||
Edit these constants in `src/app.py`:
|
||||
|
||||
```python
|
||||
DEFAULT_EXCLUDED_DIRS = [
|
||||
"node_modules", "venv", "__pycache__", ".git",
|
||||
"dist", "build", "logs", ".idea", ".vscode"
|
||||
]
|
||||
DEFAULT_EXCLUDED_FILES = ["repo-context.txt"]
|
||||
```
|
||||
|
||||
### Different port
|
||||
|
||||
If port 8501 is busy:
|
||||
### Refresh FRED data
|
||||
|
||||
```bash
|
||||
streamlit run src/app.py --server.port 8502
|
||||
./startup.sh python scripts/refresh_data.py
|
||||
```
|
||||
|
||||
---
|
||||
Downloads the full UNRATE and WTI series (from 1948 to today) into `data/fred.db`.
|
||||
|
||||
## ❓ Troubleshooting
|
||||
### Generate the chart
|
||||
|
||||
| Problem | Fix |
|
||||
| -------------------------------------- | ------------------------------------------------------------- |
|
||||
| `Tcl_AsyncDelete` warning | Harmless—ignore it. |
|
||||
| “Permission denied” when creating dirs | Run your terminal as admin or check folder write permissions. |
|
||||
| Packages won’t install | `python -m pip install --upgrade pip` then reinstall. |
|
||||
| Port already in use | Kill other Streamlit processes or use `--server.port`. |
|
||||
```bash
|
||||
# Default 18-month lag
|
||||
./startup.sh
|
||||
|
||||
# Custom lag, range, and extension
|
||||
./startup.sh python scripts/lagged_oil_unrate_chart_styled.py \
|
||||
--offset 6 --start 1980-01-01 --end 2025-05-31 --extend-years 2
|
||||
```
|
||||
|
||||
| Option | Description |
|
||||
| ---------------- | --------------------------------------------------------- |
|
||||
| `--offset` | Lag in months (positive = oil leads; negative = oil lags) |
|
||||
| `--start` | Start date (YYYY-MM-DD) |
|
||||
| `--end` | End date (YYYY-MM-DD) |
|
||||
| `--extend-years` | Years to extend the x-axis beyond the end date |
|
||||
|
||||
---
|
||||
|
||||
## 🤝 Contributing
|
||||
## 📝 Details
|
||||
|
||||
1. Fork → create a feature branch
|
||||
2. Commit & push your changes
|
||||
3. Open a Pull Request
|
||||
* **Data storage**: `data/fred.db` (SQLite) holds two tables: `UNRATE` and `DCOILWTICO`.
|
||||
* **Plot styling**:
|
||||
|
||||
* Left y-axis: unemployment rate (%) from 3 to 15%, ticks every 2%.
|
||||
* Right y-axis: log scale oil price (USD), doubling ticks from \$3 upward.
|
||||
* X-axis: years, major tick every 5 years, minor tick every year.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Dependencies
|
||||
|
||||
Listed in `requirements.txt`:
|
||||
|
||||
```text
|
||||
pandas>=1.5.0
|
||||
pandas_datareader>=0.10.0
|
||||
matplotlib>=3.5.0
|
||||
lxml>=4.6.0
|
||||
python-dateutil>=2.8.1
|
||||
```
|
||||
|
||||
`startup.sh` also upgrades `pip` & `setuptools` to ensure `distutils` is available.
|
||||
|
||||
---
|
||||
|
||||
## 🛡️ Troubleshooting
|
||||
|
||||
* **ModuleNotFoundError: distutils**: resolved automatically by upgrading `setuptools` in `startup.sh`.
|
||||
* **Database not found**: run `./startup.sh python scripts/refresh_data.py` to populate `data/fred.db`.
|
||||
* **Virtual-env issues**: delete `venv/` and re-run `startup.sh`.
|
||||
|
||||
---
|
||||
|
||||
## 📄 License
|
||||
|
||||
Distributed under the **MIT License** – see `LICENSE` for details.
|
||||
This project is released under the MIT License. See [LICENSE](LICENSE) for details.
|
||||
Binary file not shown.
+89
-132
@@ -6,6 +6,8 @@ Generated on: 2025-05-30
|
||||
|
||||
```
|
||||
.
|
||||
├── data/
|
||||
├── fred.db
|
||||
├── scripts/
|
||||
├── lagged_oil_unrate_chart_styled.py
|
||||
├── pyproject.toml
|
||||
@@ -19,126 +21,8 @@ Generated on: 2025-05-30
|
||||
|
||||
## python_charts/README.md
|
||||
```markdown
|
||||
# Lagged Oil vs. Unemployment Charting
|
||||
|
||||
This repository provides two Python scripts to fetch the latest US Unemployment Rate (UNRATE) and WTI crude oil price (DCOILWTICO) from FRED, apply a configurable lag or lead to the oil series, and generate polished dual‑axis charts.
|
||||
|
||||
## Files
|
||||
|
||||
* **`lagged_oil_unrate_chart.py`**
|
||||
A lightweight script that:
|
||||
|
||||
1. Downloads monthly UNRATE and averages daily WTI to monthly.
|
||||
2. Shifts the oil series by `N` months (default = 18).
|
||||
3. Plots both series on a dual‑axis Matplotlib chart.
|
||||
|
||||
* **`lagged_oil_unrate_chart_styled.py`**
|
||||
A more polished version that adds:
|
||||
|
||||
* Title, subtitle, footnote with date range and source.
|
||||
* Clean dual‑axis styling with percentage and dollar‑format ticks.
|
||||
* Customizable date range and extended x‑axis (e.g., 1973–2028).
|
||||
* CLI flags for offset, start/end dates, and axis extension.
|
||||
|
||||
* **`requirements.txt`**
|
||||
Lists all Python dependencies for both scripts.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
* Python 3.7 or later
|
||||
* Internet connection (to fetch data from FRED)
|
||||
|
||||
## Setup
|
||||
|
||||
Clone or download this repository:
|
||||
|
||||
```bash
|
||||
git clone https://your-repo-url.git
|
||||
cd your-repo-folder
|
||||
```
|
||||
|
||||
### Create a Virtual Environment & Install Dependencies
|
||||
|
||||
#### On Linux / macOS
|
||||
|
||||
```bash
|
||||
# 1. Create a venv
|
||||
python3 -m venv venv
|
||||
|
||||
# 2. Activate it
|
||||
source venv/bin/activate
|
||||
|
||||
# 3. Upgrade pip and install requirements
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
#### On Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
# 1. Create a venv
|
||||
python -m venv venv
|
||||
|
||||
# 2. Activate it
|
||||
venv\Scripts\Activate.ps1
|
||||
|
||||
# 3. Upgrade pip and install requirements
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
> **Note:** If you get execution policy errors on Windows, you may need to run:
|
||||
>
|
||||
> ```powershell
|
||||
> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
> ```
|
||||
|
||||
## Usage
|
||||
|
||||
Once the virtual environment is active and dependencies are installed, run either script from the project root.
|
||||
|
||||
### 1. Basic Lag Script
|
||||
|
||||
```bash
|
||||
# Default: oil lags unemployment by 18 months (~1.5 years)
|
||||
python lagged_oil_unrate_chart.py
|
||||
|
||||
# Other offsets (in months)
|
||||
python lagged_oil_unrate_chart.py --offset 6 # 6‑month lag
|
||||
python lagged_oil_unrate_chart.py --offset -12 # 12‑month lead
|
||||
```
|
||||
|
||||
### 2. Styled & Configurable Chart
|
||||
|
||||
```bash
|
||||
python lagged_oil_unrate_chart_styled.py \
|
||||
--offset 18 \
|
||||
--start 1973-01-01 \
|
||||
--end 2025-05-31 \
|
||||
--extend-years 3
|
||||
```
|
||||
|
||||
| Flag | Description |
|
||||
| ------------------ | -------------------------------------------------------------- |
|
||||
| `--offset N` | Lag (positive) or lead (negative) in months (default = 18) |
|
||||
| `--start DATE` | Series start date (`YYYY-MM-DD`, default = `1973-01-01`) |
|
||||
| `--end DATE` | Series end date (`YYYY-MM-DD`, default = today) |
|
||||
| `--extend-years M` | How many years beyond `end` to extend the x‑axis (default = 3) |
|
||||
|
||||
## Customization
|
||||
|
||||
* **Normalization**: Insert a normalization step (e.g., percent change from a base date).
|
||||
* **Export**: Modify the script to save figures with `plt.savefig('chart.png', dpi=300)`.
|
||||
* **Statistics**: Add `ta.correl()` or use Pandas to compute rolling correlations.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* **"ModuleNotFoundError"**: Ensure your venv is activated, then reinstall dependencies.
|
||||
* **SSL/DataReader errors**: Upgrade `pandas_datareader` or switch to an alternate data source.
|
||||
|
||||
## License
|
||||
|
||||
This project is released under the MIT License.
|
||||
./startup.sh python scripts/lagged_oil_unrate_chart_styled.py \
|
||||
--offset 12 --end 2025-05-31 --extend-years 5
|
||||
|
||||
```
|
||||
|
||||
@@ -155,15 +39,66 @@ python-dateutil>=2.8.1
|
||||
## python_charts/startup.sh
|
||||
```
|
||||
#!/usr/bin/env bash
|
||||
# -------------------------------------------------------------------
|
||||
# startup.sh — prepare Python env, ensure dependencies, FRED data,
|
||||
# and run a command inside the venv
|
||||
# Usage:
|
||||
# ./startup.sh [command…]
|
||||
# Automatically:
|
||||
# - Upgrades pip & setuptools (ensuring distutils on Python 3.12+)
|
||||
# - Creates venv if missing
|
||||
# - Installs requirements
|
||||
# - Downloads data/fred.db if missing
|
||||
# -------------------------------------------------------------------
|
||||
set -euo pipefail
|
||||
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
VENV_DIR="venv"
|
||||
REQ_FILE="requirements.txt"
|
||||
WHEELHOUSE="wheelhouse"
|
||||
DATA_DB="data/fred.db"
|
||||
|
||||
pip install --no-index --find-links=wheelhouse -r requirements.txt
|
||||
# 1) Create or reuse venv
|
||||
if [[ ! -d "$VENV_DIR" ]]; then
|
||||
echo "🔧 Creating virtual-env…"
|
||||
python3 -m venv "$VENV_DIR"
|
||||
fi
|
||||
# Activate
|
||||
# shellcheck disable=SC1090
|
||||
source "$VENV_DIR/bin/activate"
|
||||
|
||||
echo "✅ Virtual-env ready (offline install)."
|
||||
# 2) Upgrade pip & setuptools (to provide distutils on Py3.12+)
|
||||
echo "🛠 Upgrading pip & setuptools…"
|
||||
pip install --upgrade pip setuptools
|
||||
|
||||
# 3) Install project dependencies
|
||||
PIP_OPTS=(install --upgrade --no-input)
|
||||
if [[ -d "$WHEELHOUSE" ]]; then
|
||||
echo "📦 Installing from wheelhouse…"
|
||||
pip "${PIP_OPTS[@]}" --no-index --find-links="$WHEELHOUSE" -r "$REQ_FILE" \
|
||||
|| { echo "⚠️ Wheelhouse failed—falling back to PyPI…"; \
|
||||
pip "${PIP_OPTS[@]}" -r "$REQ_FILE"; }
|
||||
else
|
||||
echo "🌐 Installing from PyPI…"
|
||||
pip "${PIP_OPTS[@]}" -r "$REQ_FILE"
|
||||
fi
|
||||
|
||||
echo "✅ Virtual-env ready ($(python -V))"
|
||||
|
||||
# 4) Ensure data/fred.db exists
|
||||
if [[ ! -f "$DATA_DB" ]]; then
|
||||
echo "🔄 $DATA_DB not found—downloading FRED series…"
|
||||
python scripts/refresh_data.py
|
||||
fi
|
||||
|
||||
# 5) Decide what to run
|
||||
if [[ $# -gt 0 ]]; then
|
||||
CMD=("$@")
|
||||
else
|
||||
CMD=(python scripts/lagged_oil_unrate_chart_styled.py --offset 18)
|
||||
fi
|
||||
|
||||
echo "🚀 Executing: ${CMD[*]}"
|
||||
exec "${CMD[@]}"
|
||||
```
|
||||
|
||||
## scripts/refresh_data.py
|
||||
@@ -253,6 +188,8 @@ from pathlib import Path
|
||||
|
||||
import matplotlib.dates as mdates
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.ticker as mticker
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import sqlite3
|
||||
@@ -313,7 +250,7 @@ def plot_lagged(
|
||||
end_date: datetime,
|
||||
extend_years: int,
|
||||
) -> None:
|
||||
"""Render the dual-axis chart."""
|
||||
"""Render the dual-axis chart with fixed scales and log ticks on oil."""
|
||||
oil_shifted = oil.shift(offset_months)
|
||||
|
||||
fig, ax1 = plt.subplots(figsize=(14, 7))
|
||||
@@ -333,11 +270,12 @@ def plot_lagged(
|
||||
color="#1f77b4",
|
||||
)
|
||||
ax1.set_ylabel("Unemployment rate (%)", fontsize=12)
|
||||
ax1.set_ylim(0, unrate["value"].max() * 1.1)
|
||||
ax1.set_ylim(3, 15)
|
||||
ax1.yaxis.set_major_locator(mticker.MultipleLocator(2))
|
||||
ax1.yaxis.set_major_formatter("{x:.0f}%")
|
||||
ax1.grid(axis="y", linestyle="--", alpha=0.4)
|
||||
|
||||
# Right axis – shifted oil
|
||||
# Right axis – shifted oil (log scale)
|
||||
ax2 = ax1.twinx()
|
||||
ax2.plot(
|
||||
oil_shifted.index,
|
||||
@@ -349,10 +287,23 @@ def plot_lagged(
|
||||
color="#FF9900",
|
||||
)
|
||||
ax2.set_ylabel("Oil price (USD)", fontsize=12)
|
||||
ax2.set_ylim(0, oil_shifted["value"].max() * 1.1)
|
||||
ax2.yaxis.set_major_formatter("${x:,.0f}")
|
||||
|
||||
# X-axis
|
||||
# Build doubling ticks from $3 upward
|
||||
min_tick = 3
|
||||
max_val = oil_shifted["value"].max() * 1.1
|
||||
ticks = []
|
||||
i = 0
|
||||
while min_tick * 2**i < max_val:
|
||||
ticks.append(min_tick * 2**i)
|
||||
i += 1
|
||||
ticks.append(min_tick * 2**i)
|
||||
|
||||
ax2.set_yscale("log")
|
||||
ax2.set_ylim(min_tick, ticks[-1])
|
||||
ax2.set_yticks(ticks)
|
||||
ax2.yaxis.set_major_formatter("${x:.0f}")
|
||||
|
||||
# X-axis formatting
|
||||
ax1.set_xlim(start_date, end_date + relativedelta(years=extend_years))
|
||||
ax1.xaxis.set_major_locator(mdates.YearLocator(base=5))
|
||||
ax1.xaxis.set_minor_locator(mdates.YearLocator(1))
|
||||
@@ -367,8 +318,8 @@ def plot_lagged(
|
||||
# Footnote
|
||||
foot = (
|
||||
f"Dates: {start_date.strftime('%Y')} through "
|
||||
f"{unrate.index[-1].strftime('%d %b %Y')}.\n"
|
||||
"Source: Local FRED snapshot (offline)."
|
||||
f"{unrate.index[-1].strftime('%d %b %Y')}\."
|
||||
"\nSource: Local FRED snapshot (offline)."
|
||||
)
|
||||
plt.annotate(
|
||||
foot,
|
||||
@@ -435,3 +386,9 @@ if __name__ == "__main__":
|
||||
|
||||
```
|
||||
|
||||
## data/fred.db
|
||||
```
|
||||
*Binary file (.db) cannot be displayed.*
|
||||
|
||||
```
|
||||
|
||||
@@ -22,6 +22,8 @@ from pathlib import Path
|
||||
|
||||
import matplotlib.dates as mdates
|
||||
import matplotlib.pyplot as plt
|
||||
import matplotlib.ticker as mticker
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from dateutil.relativedelta import relativedelta
|
||||
import sqlite3
|
||||
@@ -82,7 +84,7 @@ def plot_lagged(
|
||||
end_date: datetime,
|
||||
extend_years: int,
|
||||
) -> None:
|
||||
"""Render the dual-axis chart."""
|
||||
"""Render the dual-axis chart with fixed scales and log ticks on oil."""
|
||||
oil_shifted = oil.shift(offset_months)
|
||||
|
||||
fig, ax1 = plt.subplots(figsize=(14, 7))
|
||||
@@ -102,11 +104,12 @@ def plot_lagged(
|
||||
color="#1f77b4",
|
||||
)
|
||||
ax1.set_ylabel("Unemployment rate (%)", fontsize=12)
|
||||
ax1.set_ylim(0, unrate["value"].max() * 1.1)
|
||||
ax1.set_ylim(3, 15)
|
||||
ax1.yaxis.set_major_locator(mticker.MultipleLocator(2))
|
||||
ax1.yaxis.set_major_formatter("{x:.0f}%")
|
||||
ax1.grid(axis="y", linestyle="--", alpha=0.4)
|
||||
|
||||
# Right axis – shifted oil
|
||||
# Right axis – shifted oil (log scale)
|
||||
ax2 = ax1.twinx()
|
||||
ax2.plot(
|
||||
oil_shifted.index,
|
||||
@@ -118,10 +121,23 @@ def plot_lagged(
|
||||
color="#FF9900",
|
||||
)
|
||||
ax2.set_ylabel("Oil price (USD)", fontsize=12)
|
||||
ax2.set_ylim(0, oil_shifted["value"].max() * 1.1)
|
||||
ax2.yaxis.set_major_formatter("${x:,.0f}")
|
||||
|
||||
# X-axis
|
||||
# Build doubling ticks from $3 upward
|
||||
min_tick = 3
|
||||
max_val = oil_shifted["value"].max() * 1.1
|
||||
ticks = []
|
||||
i = 0
|
||||
while min_tick * 2**i < max_val:
|
||||
ticks.append(min_tick * 2**i)
|
||||
i += 1
|
||||
ticks.append(min_tick * 2**i)
|
||||
|
||||
ax2.set_yscale("log")
|
||||
ax2.set_ylim(min_tick, ticks[-1])
|
||||
ax2.set_yticks(ticks)
|
||||
ax2.yaxis.set_major_formatter("${x:.0f}")
|
||||
|
||||
# X-axis formatting
|
||||
ax1.set_xlim(start_date, end_date + relativedelta(years=extend_years))
|
||||
ax1.xaxis.set_major_locator(mdates.YearLocator(base=5))
|
||||
ax1.xaxis.set_minor_locator(mdates.YearLocator(1))
|
||||
@@ -136,8 +152,8 @@ def plot_lagged(
|
||||
# Footnote
|
||||
foot = (
|
||||
f"Dates: {start_date.strftime('%Y')} through "
|
||||
f"{unrate.index[-1].strftime('%d %b %Y')}.\n"
|
||||
"Source: Local FRED snapshot (offline)."
|
||||
f"{unrate.index[-1].strftime('%d %b %Y')}\."
|
||||
"\nSource: Local FRED snapshot (offline)."
|
||||
)
|
||||
plt.annotate(
|
||||
foot,
|
||||
|
||||
+56
-4
@@ -1,9 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
# -------------------------------------------------------------------
|
||||
# startup.sh — prepare Python env, ensure dependencies, FRED data,
|
||||
# and run a command inside the venv
|
||||
# Usage:
|
||||
# ./startup.sh [command…]
|
||||
# Automatically:
|
||||
# - Upgrades pip & setuptools (ensuring distutils on Python 3.12+)
|
||||
# - Creates venv if missing
|
||||
# - Installs requirements
|
||||
# - Downloads data/fred.db if missing
|
||||
# -------------------------------------------------------------------
|
||||
set -euo pipefail
|
||||
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
VENV_DIR="venv"
|
||||
REQ_FILE="requirements.txt"
|
||||
WHEELHOUSE="wheelhouse"
|
||||
DATA_DB="data/fred.db"
|
||||
|
||||
pip install --no-index --find-links=wheelhouse -r requirements.txt
|
||||
# 1) Create or reuse venv
|
||||
if [[ ! -d "$VENV_DIR" ]]; then
|
||||
echo "🔧 Creating virtual-env…"
|
||||
python3 -m venv "$VENV_DIR"
|
||||
fi
|
||||
# Activate
|
||||
# shellcheck disable=SC1090
|
||||
source "$VENV_DIR/bin/activate"
|
||||
|
||||
echo "✅ Virtual-env ready (offline install)."
|
||||
# 2) Upgrade pip & setuptools (to provide distutils on Py3.12+)
|
||||
echo "🛠 Upgrading pip & setuptools…"
|
||||
pip install --upgrade pip setuptools
|
||||
|
||||
# 3) Install project dependencies
|
||||
PIP_OPTS=(install --upgrade --no-input)
|
||||
if [[ -d "$WHEELHOUSE" ]]; then
|
||||
echo "📦 Installing from wheelhouse…"
|
||||
pip "${PIP_OPTS[@]}" --no-index --find-links="$WHEELHOUSE" -r "$REQ_FILE" \
|
||||
|| { echo "⚠️ Wheelhouse failed—falling back to PyPI…"; \
|
||||
pip "${PIP_OPTS[@]}" -r "$REQ_FILE"; }
|
||||
else
|
||||
echo "🌐 Installing from PyPI…"
|
||||
pip "${PIP_OPTS[@]}" -r "$REQ_FILE"
|
||||
fi
|
||||
|
||||
echo "✅ Virtual-env ready ($(python -V))"
|
||||
|
||||
# 4) Ensure data/fred.db exists
|
||||
if [[ ! -f "$DATA_DB" ]]; then
|
||||
echo "🔄 $DATA_DB not found—downloading FRED series…"
|
||||
python scripts/refresh_data.py
|
||||
fi
|
||||
|
||||
# 5) Decide what to run
|
||||
if [[ $# -gt 0 ]]; then
|
||||
CMD=("$@")
|
||||
else
|
||||
CMD=(python scripts/lagged_oil_unrate_chart_styled.py --offset 18)
|
||||
fi
|
||||
|
||||
echo "🚀 Executing: ${CMD[*]}"
|
||||
exec "${CMD[@]}"
|
||||
Reference in new issue
Block a user