Deployment¶
#exports
from etswatch import prices
from etswatch.eutl import accounts
import os
import typer
import dotenv
Loading Environment Variables¶
use_dotenv = True
if use_dotenv == True:
assert dotenv.load_dotenv(), 'environment variables could not be loaded'
Initialising CLI¶
#exports
app = typer.Typer()
Download Commands¶
We'll start by creating a function for downloading the market prices data
#exports
@app.command()
def download_mkt_prices(data_dir='data', print_dataset_head=True):
api_key = os.getenv('QUANDL_API_KEY')
df_ets = prices.get_ets_mkt_data(api_key)
df_ets.to_csv(f'{data_dir}/market_prices.csv')
if print_dataset_head == True:
print(f'Output Tail (n=3):\n\n{df_ets.tail(3)}')
return
download_mkt_prices(data_dir='../data')
c:\users\ayrto\desktop\side projects\ets-watch\etswatch\prices.py:35: FutureWarning: The default value of regex will change from True to False in a future version. In addition, single character regular expressions will*not* be treated as literal strings when regex=True.
df.columns = df.columns.str.lower().str.replace('.', '').str.replace(' ', '_')
Output Tail (n=3):
open high low settle change wave volume \
datetime
2021-04-14 43.87 43.88 43.47 43.73 -0.03 43.75 28.0
2021-04-15 43.84 44.32 43.84 44.08 0.35 44.22 5.0
2021-04-16 44.53 44.53 44.53 44.33 0.25 44.53 1.0
prev_day_open_interest efp_volume efs_volume block_volume \
datetime
2021-04-14 4865.0 NaN NaN 2290.0
2021-04-15 2881.0 NaN NaN 598.0
2021-04-16 2483.0 NaN NaN NaN
close
datetime
2021-04-14 43.84
2021-04-15 44.19
2021-04-16 44.78
Next we'll download the aircraft data
#exports
@app.command()
def download_aircraft_accounts(data_dir='data', redownload=True, print_dataset_heads=True):
df_search = accounts.get_search_df(data_dir=f'{data_dir}/..', redownload=redownload)
aircraft_dfs = accounts.get_aircraft_dfs(
df_search,
data_dir=data_dir,
redownload=redownload
)
if print_dataset_heads == True:
for dataset_name, df in aircraft_dfs.items():
print(f'{dataset_name} (head, n=3):\n\n{df.head(3)}\n\n\n')
return
download_aircraft_accounts(data_dir='../data/aircraft', redownload=False)
aircraft (head, n=3):
account_id aircraft_operator_id Unnamed: 2 monitoring_plan_id \
0 90574 200103 27702 BMLFUW-UW.1.3.2/0354-V/4/2009
1 90727 200108 194 BMFLUW-UW.1.3.2/0084-V/4/2010
2 90728 200109 36057 UW.1.3.2/0085-V/4/2011
monitoring_plan_start_date monitoring_plan_expiration_Date \
0 2010-01-01 NaN
1 2010-01-01 NaN
2 2010-01-01 NaN
subsidiary_undertaking_name parent_undertaking_name EPRTR_id call_sign \
0 NaN NaN NaN JAG
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
initial_emissions_year first_address_line second_address_line postcode \
0 2013 NaN NaN NaN
1 2012 NaN NaN NaN
2 2012 NaN NaN NaN
city country lat lon main_activity
0 NaN AT NaN NaN 10-Aircraft operator activities
1 NaN AT NaN NaN 10-Aircraft operator activities
2 NaN AT NaN NaN 10-Aircraft operator activities
allocated_allowances (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 2011 2012 2013 \
0 1020625 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 106049 NaN NaN NaN NaN NaN NaN NaN 75.0 41.0
2 106068 NaN NaN NaN NaN NaN NaN NaN 4586700.0 1297.0
... 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 ... 36.0 35.0 35.0 NaN NaN NaN NaN NaN NaN NaN
2 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[3 rows x 27 columns]
compliance_code (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 2011 2012 2013 ... 2021 \
0 1020625 NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN
1 106049 NaN NaN NaN NaN NaN NaN NaN A* A ... NaN
2 106068 NaN NaN NaN NaN NaN NaN NaN A A ... NaN
2022 2023 2024 2025 2026 2027 2028 2029 2030
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN
[3 rows x 27 columns]
owners (head, n=3):
account_id national_administrator account_type \
0 90574 Austria 100-Holding Account
1 90727 Austria 100-Holding Account
2 90728 Austria 100-Holding Account
account_holder_name aircraft_operator_id \
0 Jetalliance Flugbetriebs GmbH 200103
1 Glock GmbH 200108
2 Glock Services GmbH 200109
company_registration_number account_status type \
0 FN 203001g closed Account holder
1 FN64142b closed Account holder
2 FN329154a closed Account holder
name legal_entity_identifier \
0 Jetalliance Flugbetriebs GmbH NaN
1 Glock GmbH NaN
2 Glock Services GmbH NaN
first_address_line second_address_line postcode city \
0 Flugplatz 1 NaN 2542 Kottingbrunn
1 Loibstrasse 16 NaN 9170 Ferlach
2 Schneeweisshofweg 32 NaN 9521 Treffen am Ossiachersee
country telephone_1 telephone_2 email
0 Austria NaN NaN NaN
1 Austria NaN NaN NaN
2 Austria NaN NaN NaN
units_surrendered (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 2011 2012 2013 ... \
0 1020625 NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
1 106049 NaN NaN NaN NaN NaN NaN NaN 1945.0 2523.0 ...
2 106068 NaN NaN NaN NaN NaN NaN NaN 2130.0 NaN ...
2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[3 rows x 27 columns]
verified_emissions (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 2011 2012 2013 ... \
0 1020625 NaN NaN NaN NaN NaN NaN NaN NaN NaN ...
1 106049 NaN NaN NaN NaN NaN NaN NaN 1991 1949 ...
2 106068 NaN NaN NaN NaN NaN NaN NaN 2130 2507 ...
2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Excluded NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[3 rows x 27 columns]
We'll then do the same for the installation accounts
#exports
@app.command()
def download_installation_accounts(data_dir='data', redownload=True, print_dataset_heads=True):
df_search = accounts.get_search_df(data_dir=f'{data_dir}/..', redownload=redownload)
installation_dfs = accounts.get_installation_dfs(
df_search,
data_dir=data_dir,
redownload=redownload
)
if print_dataset_heads == True:
for dataset_name, df in installation_dfs.items():
print(f'{dataset_name} (head, n=3):\n\n{df.head(3)}\n\n\n')
return
download_installation_accounts(data_dir='../data/installations', redownload=False)
allocated_allowances (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 \
0 100000 269940.0 269941.0 269941.0 153922.0 153922.0 153922.0
1 100001 146438.0 146438.0 146438.0 131200.0 131197.0 131197.0
2 100002 10.0 11.0 0.0 NaN NaN NaN
2011 2012 2013 ... 2021 2022 2023 2024 2025 2026 2027 2028 \
0 153922.0 153922.0 3167 ... NaN NaN NaN NaN NaN NaN NaN NaN
1 131197.0 131197.0 16892 ... NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN
2029 2030
0 NaN NaN
1 NaN NaN
2 NaN NaN
[3 rows x 27 columns]
compliance_code (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 2011 2012 2013 ... 2021 2022 \
0 100000 A A A A A A A A A ... NaN NaN
1 100001 A A A A A A A A A ... NaN NaN
2 100002 A A NaN NaN C C NaN NaN NaN ... NaN NaN
2023 2024 2025 2026 2027 2028 2029 2030
0 NaN NaN NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN
[3 rows x 27 columns]
installations (head, n=3):
account_id installation_id installation_name permit_id permit_entry_date \
0 93707 47 AGRANA Gmünd ILE166 2005-01-26
1 93708 50 AGRANA Aschach ILE165 2005-10-18
2 93709 51 AGRANA Tulln ILE161 2005-07-01
permit_expiration_Date subsidiary_undertaking_name parent_undertaking_name \
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
EPRTR_id initial_emissions_year final_emissions_year \
0 NaN 2005 0
1 20000.00442 2005 0
2 20000.00320 2005 0
first_address_line second_address_line postcode city country \
0 Conrathstrasse 7 NaN 3953 Gmünd AT
1 Raiffeisenweg 2-6 NaN 4082 Aschach AT
2 Josef-Reither-Strasse 21-23 NaN 3430 Tulln AT
lat lon main_activity
0 NaN NaN 20-Combustion of fuels
1 NaN NaN 20-Combustion of fuels
2 NaN NaN 20-Combustion of fuels
owners (head, n=3):
account_id national_administrator account_type account_holder_name \
0 93707 Austria 100-Holding Account AGRANA Stärke GmbH
1 93708 Austria 100-Holding Account AGRANA Stärke GmbH
2 93709 Austria 100-Holding Account AGRANA Zucker GmbH
installation_id company_registration_number account_status type \
0 47 FN 252477 s open Account holder
1 50 FN 252477 s open Account holder
2 51 FN 51929 t open Account holder
name legal_entity_identifier \
0 AGRANA Stärke GmbH NaN
1 AGRANA Stärke GmbH NaN
2 AGRANA Zucker GmbH NaN
first_address_line second_address_line postcode city \
0 Friedrich-Wilhelm-Raiffeisen-Platz 1 NaN 1020 Wien
1 Friedrich-Wilhelm-Raiffeisen-Platz 1 NaN 1020 Wien
2 Friedrich-Wilhelm-Raiffeisen-Platz 1 NaN 1020 Wien
country telephone_1 telephone_2 email
0 Austria NaN NaN NaN
1 Austria NaN NaN NaN
2 Austria NaN NaN NaN
units_surrendered (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 \
0 100000 87923.0 106745.0 117404.0 205430.0 105795.0 25900.0
1 100001 134139.0 138143.0 170415.0 143182.0 149405.0 142121.0
2 100002 NaN NaN NaN NaN NaN NaN
2011 2012 2013 ... 2021 2022 2023 2024 2025 2026 \
0 101784.0 21384.0 5671.0 ... NaN NaN NaN NaN NaN NaN
1 119263.0 102751.0 101881.0 ... NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN
2027 2028 2029 2030
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
[3 rows x 27 columns]
verified_emissions (head, n=3):
account_id 2005 2006 2007 2008 2009 2010 \
0 100000 87923 106745 117404 126296 105795 105034
1 100001 134139 138143 170415 143182 149405 142121
2 100002 0 NaN NaN NaN Not Reported Not Reported
2011 2012 2013 ... 2021 2022 2023 2024 2025 2026 2027 2028 2029 \
0 101784 21384 5671 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 119263 102751 101881 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN
2030
0 NaN
1 NaN
2 NaN
[3 rows x 27 columns]
Lastly we'll create a function for downloading all of the accounts data in one step (including the accounts search data)
#exports
@app.command()
def download_all_accounts_data(data_dir='data', search=True, installations=True, aircraft=True):
all_dfs = accounts.retrieve_all_data(data_dir=data_dir, redownload_search=search, redownload_installations=installations, redownload_aircraft=aircraft)
return
download_all_accounts_data(data_dir='../data', search=False, installations=False, aircraft=False)
Context Handling¶
Finally we need to ensure the CLI app is available when the module is loaded.
N.b. we've included the condition '__file__' in globals()
to make sure this isn't when inside the notebook
#exports
if __name__ == '__main__' and '__file__' in globals():
app()