Skip to content

Commit ecdeed8

Browse files
committed
save_xml() for the interface
1 parent 94e4c57 commit ecdeed8

File tree

7 files changed

+296
-246
lines changed

7 files changed

+296
-246
lines changed

README.md

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,60 @@
44

55
Data source page: ["Daily Treasury Par Yield Curve Rates"](https://home.treasury.gov/resource-center/data-chart-center/interest-rates/TextView?type=daily_treasury_yield_curve&field_tdr_date_value=2022)
66

7-
## Large dataset
7+
## Read existing dataset
88

9-
CSV file (1990-present):
10-
11-
- [daily yields](https://raw.githubusercontent.com/epogrebnyak/data-ust/master/ust.csv)
9+
CSV file (1990-present): [daily UST yields](https://raw.githubusercontent.com/epogrebnyak/data-ust/master/ust.csv)
1210

13-
## How to use
11+
```
12+
url = "https://raw.githubusercontent.com/epogrebnyak/data-ust/master/ust.csv"
13+
df = pd.read_csv(df, parse_dates=["date"]).set_index("date")
14+
```
1415

15-
Build a local file (`rates.csv`) with US Treasuries yields by maturity:
16+
## Download current dataset
17+
18+
Build a local CSV file with US Treasuries yields by maturity:
1619

1720
```python
1821
import os
22+
1923
import pandas as pd
20-
from ust import save, force_save, read_rates
24+
25+
from ust import save_xml, read_rates, available_years
2126

2227
# save UST yield rates to local folder for selected years
23-
for year in [2020, 2021, 2022]:
24-
save(year, folder="./xml")
28+
for year in available_years():
29+
save_xml(year, folder="./xml")
2530

26-
# force update last year (overwrites existing file)
27-
force_save(2022, folder="./xml")
31+
# run later - force update last year (overwrites existing file)
32+
save_xml(2022, folder="./xml", overwrite=True)
2833

29-
# read as pandas dataframe
34+
# read UST yield rates as pandas dataframe
3035
df = read_rates(start_year=2020, end_year=2022, folder="./xml")
36+
print(df)
3137

3238
# save as single CSV file
3339
df.to_csv("rates.csv")
3440

3541
# read back later
3642
df = pd.read_csv("rates.csv", parse_dates=["date"]).set_index("date")
3743

44+
3845
"""
39-
BC_1MONTH BC_3MONTH BC_6MONTH ... BC_20YEAR BC_30YEAR BC_30YEARDISPLAY
40-
date ...
46+
BC_1MONTH BC_3MONTH BC_6MONTH BC_1YEAR ... BC_10YEAR BC_20YEAR BC_30YEAR BC_30YEARDISPLAY
47+
date ...
4148
2020-01-02 1.53 1.54 1.57 1.56 ... 1.88 2.19 2.33 2.33
4249
2020-01-03 1.52 1.52 1.55 1.55 ... 1.80 2.11 2.26 2.26
4350
2020-01-06 1.54 1.56 1.56 1.54 ... 1.81 2.13 2.28 2.28
4451
2020-01-07 1.52 1.54 1.56 1.53 ... 1.83 2.16 2.31 2.31
4552
2020-01-08 1.50 1.54 1.56 1.55 ... 1.87 2.21 2.35 2.35
4653
... ... ... ... ... ... ... ... ... ...
47-
2022-03-03 0.19 0.38 0.69 1.08 ... 1.86 2.32 2.24 2.24
48-
2022-03-04 0.15 0.34 0.69 1.05 ... 1.74 2.23 2.16 2.16
4954
2022-03-07 0.17 0.38 0.75 1.07 ... 1.78 2.29 2.19 2.19
5055
2022-03-08 0.16 0.36 0.72 1.12 ... 1.86 2.34 2.24 2.24
5156
2022-03-09 0.18 0.38 0.75 1.15 ... 1.94 2.38 2.29 2.29
52-
2.29
53-
"""
57+
2022-03-10 0.19 0.39 0.75 1.19 ... 1.98 2.45 2.38 2.38
58+
2022-03-11 0.17 0.40 0.78 1.22 ... 2.00 2.45 2.36 2.36
59+
60+
[550 rows x 12 columns]
5461
```
5562
5663
## Sample image

requirements_dev.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
black
2+
pyright
3+
pytest

runner.py

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,20 @@
11
import os
2-
32
import pandas as pd
4-
5-
from ust import force_save, read_rates, save
3+
from ust import save_xml, read_rates, available_years
64

75
# save UST yield rates to local folder for selected years
8-
for year in [2020, 2021, 2022]:
9-
save(year, folder="./xml")
6+
for year in available_years():
7+
save_xml(year, folder="./xml")
108

11-
# force update last year (overwrites existing file)
12-
force_save(2022, folder="./xml")
9+
# run later - force update last year (overwrites existing file)
10+
save_xml(2022, folder="./xml", overwrite=True)
1311

1412
# read UST yield rates as pandas dataframe
15-
df = read_rates(start_year=2021, end_year=2022, folder="./xml")
13+
df = read_rates(start_year=2020, end_year=2022, folder="./xml")
14+
print(df)
1615

1716
# save as single CSV file
1817
df.to_csv("rates.csv")
1918

2019
# read back later
2120
df = pd.read_csv("rates.csv", parse_dates=["date"]).set_index("date")
22-
23-
24-
"""
25-
BC_1MONTH BC_3MONTH BC_6MONTH ... BC_20YEAR BC_30YEAR BC_30YEARDISPLAY
26-
date ...
27-
2021-01-04 0.09 0.09 0.09 ... 1.46 1.66 1.66
28-
2021-01-05 0.08 0.09 0.09 ... 1.49 1.70 1.70
29-
2021-01-06 0.09 0.09 0.09 ... 1.60 1.81 1.81
30-
2021-01-07 0.09 0.09 0.09 ... 1.64 1.85 1.85
31-
2021-01-08 0.08 0.08 0.09 ... 1.67 1.87 1.87
32-
... ... ... ... ... ... ... ...
33-
2022-03-02 0.13 0.34 0.68 ... 2.32 2.24 2.24
34-
2022-03-03 0.19 0.38 0.69 ... 2.32 2.24 2.24
35-
2022-03-04 0.15 0.34 0.69 ... 2.23 2.16 2.16
36-
2022-03-07 0.17 0.38 0.75 ... 2.29 2.19 2.19
37-
2022-03-08 0.16 0.36 0.72 ... 2.34 2.24 2.24
38-
"""

ust.csv

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8052,3 +8052,5 @@ date,BC_1MONTH,BC_3MONTH,BC_6MONTH,BC_1YEAR,BC_2YEAR,BC_3YEAR,BC_5YEAR,BC_7YEAR,
80528052
2022-03-07,0.17,0.38,0.75,1.07,1.55,1.68,1.71,1.77,1.78,2.29,2.19,2.19
80538053
2022-03-08,0.16,0.36,0.72,1.12,1.63,1.78,1.8,1.85,1.86,2.34,2.24,2.24
80548054
2022-03-09,0.18,0.38,0.75,1.15,1.68,1.83,1.87,1.92,1.94,2.38,2.29,2.29
8055+
2022-03-10,0.19,0.39,0.75,1.19,1.72,1.88,1.92,1.98,1.98,2.45,2.38,2.38
8056+
2022-03-11,0.17,0.4,0.78,1.22,1.75,1.91,1.96,2.01,2.0,2.45,2.36,2.36

ust.png

40 Bytes
Loading

ust.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def data(self):
134134
return soup.find_all("content")
135135

136136

137-
def get_date(string):
137+
def get_date(string) -> str:
138138
dt = datetime.strptime(string, "%Y-%m-%dT%H:%M:%S")
139139
return dt.strftime("%Y-%m-%d")
140140

@@ -145,7 +145,8 @@ def yield_datapoints_from_string(xml_content) -> Iterable[dict]:
145145
data = soup.find_all("content")
146146
for datum in data:
147147
cur_dict = dict((key, elem(datum, key)) for key in BC_KEYS)
148-
cur_dict["date"] = get_date(datum.find("NEW_DATE").text)
148+
# ignore type check with pyright below
149+
cur_dict["date"] = get_date(datum.find("NEW_DATE").text) # type: ignore
149150
yield cur_dict
150151

151152

@@ -194,7 +195,7 @@ def year_now():
194195

195196

196197
def available_years():
197-
return range(1990, year_now() + 1)
198+
return list(range(1990, year_now() + 1))
198199

199200

200201
def from_years(years: list, folder: str):
@@ -218,13 +219,20 @@ def years(start_year, end_year):
218219
return range(start_year, end_year + 1)
219220

220221

221-
def force_save(year, folder=default_folder()):
222+
def save_xml(year, folder, overwrite=False):
223+
if overwrite:
224+
force_save(year, folder)
225+
else:
226+
soft_save(year, folder)
227+
228+
229+
def force_save(year, folder):
222230
r = Rates(year, folder)
223231
r.save_local()
224232
print("Updated", r.path)
225233

226234

227-
def save(year, folder=default_folder()):
235+
def soft_save(year, folder):
228236
r = Rates(year, folder)
229237
if not r.exists():
230238
r.save_local()
@@ -233,18 +241,12 @@ def save(year, folder=default_folder()):
233241
print("No action taken - file already exists", r.path)
234242

235243

236-
237-
def save_rates(start_year, end_year, folder=default_folder()):
244+
def save_rates(start_year, end_year, folder):
238245
for year in years(start_year, end_year):
239-
r = Rates(year, folder)
240-
if not r.exists():
241-
r.save_local()
242-
print("Saved data for year", year)
243-
else:
244-
print("No action taken - file already exists", r.path)
246+
soft_save(year, folder)
245247

246248

247-
def read_rates(start_year, end_year, folder=default_folder()):
249+
def read_rates(start_year, end_year, folder):
248250
dfs = []
249251
for year in years(start_year, end_year):
250252
r = Rates(year, folder)
@@ -254,7 +256,7 @@ def read_rates(start_year, end_year, folder=default_folder()):
254256

255257
def draw(folder=default_folder()):
256258
current_year = year_now()
257-
force_save(current_year)
259+
save_xml(current_year, folder, overwrite=True)
258260
df = read_rates(1990, current_year, folder)
259261
df.to_csv("ust.csv")
260262
make_chart(df, "ust.png")

0 commit comments

Comments
 (0)