mirror of
https://github.com/PR0M3TH3AN/python_charts.git
synced 2026-10-27 08:50:39 +00:00
Delete lagged oil unemployment rate chart script and add new files
Removed the `lagged_oil_unrate_chart_styled.py` script as it is no longer needed. Added a `.gitignore` file, a `requirements.txt` for dependencies, and a `scripts/` directory for future development.
This commit is contained in:
1 parent
4602a24ada
commit
89accfa168
4 files changed
+30
No files matched your search
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
lagged_oil_unrate_chart_styled.py
|
||||
---------------------------------
|
||||
Fetch and plot UNRATE vs. WTI oil price with a configurable lag,
|
||||
date range, and polished dual-axis styling.
|
||||
|
||||
Usage:
|
||||
python lagged_oil_unrate_chart_styled.py \
|
||||
--offset 18 \
|
||||
--start 1973-01-01 \
|
||||
--end 2025-05-31 \
|
||||
--extend-years 3
|
||||
|
||||
Dependencies:
|
||||
pip install pandas pandas_datareader matplotlib python-dateutil
|
||||
"""
|
||||
import argparse
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
import matplotlib.dates as mdates
|
||||
import matplotlib.pyplot as plt
|
||||
import pandas as pd
|
||||
import pandas_datareader.data as web
|
||||
|
||||
|
||||
def fetch_series(start, end):
|
||||
# FRED series
|
||||
unrate = web.DataReader("UNRATE", "fred", start, end)
|
||||
oil = web.DataReader("DCOILWTICO", "fred", start, end)
|
||||
|
||||
# Resample WTI to month-end average
|
||||
oil_monthly = oil.resample("M").mean()
|
||||
# Ensure UNRATE is at month-end timestamps, too
|
||||
unrate.index = unrate.index.to_period("M").to_timestamp("M")
|
||||
return unrate, oil_monthly
|
||||
|
||||
|
||||
def plot_lagged(
|
||||
unrate: pd.DataFrame,
|
||||
oil: pd.DataFrame,
|
||||
offset_months: int,
|
||||
start_date: datetime,
|
||||
end_date: datetime,
|
||||
extend_years: int
|
||||
):
|
||||
# Shift oil by offset: positive = lag; negative = lead
|
||||
oil_shifted = oil.shift(offset_months)
|
||||
|
||||
# Build figure
|
||||
fig, ax1 = plt.subplots(figsize=(14, 7))
|
||||
plt.title("Unemployment Rate and US Oil Price", fontsize=20, weight="bold")
|
||||
plt.suptitle(
|
||||
"Civilian Unemployment Rate and WTI Crude Oil Price",
|
||||
fontsize=14,
|
||||
y=0.93
|
||||
)
|
||||
|
||||
# Plot UNRATE on left axis
|
||||
ax1.plot(unrate.index, unrate["UNRATE"],
|
||||
label="UNRATE (LHS)", linewidth=2.5, color="#1f77b4")
|
||||
ax1.set_ylabel("Unemployment rate (%)", fontsize=12)
|
||||
ax1.set_ylim(0, unrate["UNRATE"].max() * 1.1)
|
||||
ax1.yaxis.set_major_formatter("{x:.0f}%")
|
||||
ax1.grid(axis="y", linestyle="--", alpha=0.4)
|
||||
|
||||
# Plot shifted oil on right axis
|
||||
ax2 = ax1.twinx()
|
||||
ax2.plot(oil_shifted.index, oil_shifted["DCOILWTICO"],
|
||||
label="USOIL (RHS)", linewidth=2, linestyle="-", alpha=0.8, color="#FF9900")
|
||||
ax2.set_ylabel("Oil price (USD)", fontsize=12)
|
||||
ax2.set_ylim(0, oil_shifted["DCOILWTICO"].max() * 1.1)
|
||||
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))
|
||||
ax1.xaxis.set_major_formatter(mdates.DateFormatter("%Y"))
|
||||
plt.setp(ax1.get_xticklabels(), rotation=0, fontsize=11)
|
||||
|
||||
# Combine legends
|
||||
lines, labels = ax1.get_legend_handles_labels()
|
||||
l2, l2l = ax2.get_legend_handles_labels()
|
||||
ax1.legend(lines + l2, labels + l2l, loc="upper left", frameon=False, fontsize=12)
|
||||
|
||||
# Footnotes
|
||||
foot = (
|
||||
f"Dates: {start_date.strftime('%Y')} through {unrate.index[-1].strftime('%d %b %Y')}.\n"
|
||||
"Source: FRED, pandas_datareader."
|
||||
)
|
||||
plt.annotate(
|
||||
foot,
|
||||
(0,0), (0, -40),
|
||||
xycoords="axes fraction", textcoords="offset points",
|
||||
va="top", fontsize=10, color="gray"
|
||||
)
|
||||
|
||||
fig.tight_layout(rect=[0, 0.03, 1, 0.95])
|
||||
plt.show()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument("-o", "--offset", type=int, default=18,
|
||||
help="lag in months (positive=lag, negative=lead)")
|
||||
p.add_argument("--start", type=str, default="1973-01-01",
|
||||
help="series start date (YYYY-MM-DD)")
|
||||
p.add_argument("--end", type=str, default=datetime.today().strftime("%Y-%m-%d"),
|
||||
help="series end date (YYYY-MM-DD)")
|
||||
p.add_argument("--extend-years", type=int, default=3,
|
||||
help="how many years beyond end_date to show on the x-axis")
|
||||
args = p.parse_args()
|
||||
|
||||
start_dt = datetime.fromisoformat(args.start)
|
||||
end_dt = datetime.fromisoformat(args.end)
|
||||
|
||||
unrate, oil = fetch_series(start_dt, end_dt)
|
||||
plot_lagged(unrate, oil, args.offset, start_dt, end_dt, args.extend_years)
|
||||
@@ -0,0 +1,14 @@
|
||||
# pyproject.toml
|
||||
|
||||
[project]
|
||||
name = "lagged-oil-unrate"
|
||||
version = "0.1.0"
|
||||
description = "Plot UNRATE vs WTI oil price with adjustable lag"
|
||||
authors = ["Your Name <[email protected]>"]
|
||||
dependencies = [
|
||||
"pandas>=1.3.0",
|
||||
"pandas_datareader>=0.10.0",
|
||||
"matplotlib>=3.4.0",
|
||||
"python-dateutil>=2.8.0",
|
||||
"lxml>=4.6.0"
|
||||
]
|
||||
Reference in new issue
Block a user