import pandas as pd
from typing import Tuple
from emodpy_malaria.weather.weather_utils import *
from emodpy_malaria.weather.weather_variable import WeatherVariable
from emodpy_malaria.weather.weather_metadata import WeatherMetadata, WeatherAttributes
from emodpy_malaria.weather.weather_data import WeatherData, DataFrameInfo
from emodpy_malaria.weather.weather_set import WeatherSet
from emodpy_malaria.weather.weather_request import WeatherRequest, WeatherArgs, RequestReport
from idmtools_platform_comps.comps_platform import COMPSPlatform
# module level doc-string
__doc__ = """
**weather** is a module providing features for working with EMOD weather files.
Main Features
-------------
Here are main features:
- Generate EMOD weather files locally from a csv file.
- Generate EMOD weather files using COMPS SSMT weather service.
- Convert existing EMOD weather files to csv file or dataframes.
- Programmatic access to EMOD weather files via weather object model.
"""
# Use __all__ to let type checkers know what is part of the public API.
_all_ = ['csv_to_weather',
'generate_weather'
'weather_to_csv',
'WeatherRequest',
'WeatherArgs',
'RequestReport',
'WeatherMetadata',
'WeatherAttributes',
'WeatherData',
'DataFrameInfo',
'WeatherSet',
'WeatherVariable']
[docs]
def generate_weather(platform: Union[str, COMPSPlatform],
site_file: Union[str, Path],
start_date: int,
end_date: int = None,
node_column: str = "nodes",
lat_column: str = "lat",
lon_column: str = "lon",
id_reference: str = None,
request_name: str = "",
local_dir: Union[str, Path] = None,
data_source: str = None,
force: bool = False) -> WeatherRequest:
"""
Generate weather files by submitting a request and downloading generated weather files to a specified dir.
Args:
platform: Platform name (like "Calculon") or COMPSPlatform object, where the work item will run.
site_file: CSV (.csv) or demographics (.json) file containing a set of sites (points) defined with lat/lon.
CSV file must contain columns for: EMOD node ids (node), latitude (lat) and longitude (lon).
Demographics file must match EMOD demographics file schema.
start_date: Start date, in formats: year (2018), year and day-of-year (2018001) or date (20180101)
end_date: (Optional) End date, in formats: year (2018), year and day-of-year (2018365) or date (20181231)
node_column: (Optional) Name of a column containing EMOD node ids. The default is "nodes".
lat_column: (Optional) Name of a column containing site (point) latitude. The default is "lat".
lon_column: (Optional) Name of a column containing site (point) longitude. The default is "lon".
id_reference: (Optional) Value of weather metadata IdReference attribute. The default is "Default".
request_name: (Optional) Name to be used for the weather SSMT work item.
local_dir: (Optional) Local dir where files will be downloaded.
data_source: (Optional) SSMT data source to be used.
force: (Optional) Flag ensuring a new weather request is submitted, even if weather files exist in "local_dir".
**Example**::
wr: WeatherRequest = generate_weather(platform="Calculon",
site_file="path/to/sites.csv",
start_date=2015,
end_date=2016,
node_column="id",
local_dir="path/to/weather_dir")
Returns:
WeatherRequest object.
Can be used to access asset collection id or a local dir (if not given as ) argument or a download report.
"""
wa = WeatherArgs(site_file=site_file,
start_date=start_date,
end_date=end_date,
node_column=node_column,
lat_column=lat_column,
lon_column=lon_column,
id_reference=id_reference)
wr = WeatherRequest(platform=platform, local_dir=local_dir, data_source=data_source)
wr.generate(weather_args=wa, request_name=request_name, force=force)
wr.download(force=force)
return wr
[docs]
def csv_to_weather(csv_data: Union[str, Path, pd.DataFrame],
node_column: str = "nodes",
step_column: str = "steps",
weather_columns: Dict[WeatherVariable, str] = None,
attributes: WeatherAttributes = None,
weather_dir: Union[str, Path] = None,
weather_file_names: Dict[WeatherVariable, str] = None) -> WeatherSet:
"""
Convert a dataframe or csv file, containing node, step and weather columns, into a weather set
and corresponding weather files, if weather dir is specified.
Args:
csv_data: Dataframe or a csv file path, containing weather data.
node_column: (Optional) Column containing node ids. The default is "nodes". The default is "nodes".
step_column: (Optional) Column containing node index for weather time series values. The default is "steps".
weather_columns: (Optional) Dictionary of weather variables (keys) and weather column names (values).
Defaults are WeatherVariables values are used: "airtemp", "humidity", "rainfall", "landtemp".
attributes: (Optional) Weather attribute object containing metadata for WeatherMetadata object.
weather_dir: (Optional) Directory where weather files are stored. If not specified files are not created.
weather_file_names: (Optional) Dictionary of weather variables (keys) and weather .bin file names (values).
**Example**::
wa = WeatherAttributes(start_year=2001, end_year=2010)
ws = csv_to_weather(csv_data="path/to/data.csv", attributes=wa, weather_dir="path/to/weather_dir")
Returns:
WeatherSet object.
"""
if isinstance(csv_data, pd.DataFrame):
ws = WeatherSet.from_dataframe(df=csv_data,
node_column=node_column,
step_column=step_column,
weather_columns=weather_columns,
attributes=attributes)
elif isinstance(csv_data, str) or isinstance(csv_data, Path):
ws = WeatherSet.from_csv(file_path=csv_data,
node_column=node_column,
step_column=step_column,
weather_columns=weather_columns,
attributes=attributes)
else:
raise TypeError("The data argument must be a file path or a pandas dataframe.")
if weather_dir:
ws.to_files(dir_path=weather_dir, file_names=weather_file_names)
return ws
[docs]
def weather_to_csv(weather_dir: Union[str, Path],
weather_file_prefix: str = "",
weather_file_names: Dict[WeatherVariable, str] = None,
csv_file: Union[str, Path] = None,
node_column: str = "nodes",
step_column: str = "steps",
weather_columns: Dict[WeatherVariable, str] = None) -> Tuple[pd.DataFrame, WeatherAttributes]:
"""
Convert weather files into a dataframe and a .csv file, if csv file path is specified.
Args:
weather_dir: Local dir containing weather files.
weather_file_prefix: (Optional) Weather files prefix, e.g. "dtk_15arcmin\_"
weather_file_names: (Optional) Dictionary of weather variables (keys) and weather .bin file names (values).
csv_file: (Optional) The path of a csv file to be generated. If not specified csv file is not created.
node_column: (Optional) Column containing node ids. The default is "nodes".
step_column: (Optional) Column containing node index for weather time series values. The default is "steps".
weather_columns: (Optional) Dictionary of weather variables (keys) and weather column names (values).
Defaults are WeatherVariables values are used: "airtemp", "humidity", "rainfall", "landtemp".
**Example**::
df, attributes = weather_to_csv(weather_dir="path/to/weather_dir")
Returns:
Dataframe and weather attributes objects.
"""
ws = WeatherSet.from_files(dir_path=weather_dir, prefix=weather_file_prefix, file_names=weather_file_names)
if csv_file:
df = ws.to_csv(file_path=csv_file,
node_column=node_column,
step_column=step_column,
weather_columns=weather_columns)
else:
df = ws.to_dataframe(node_column=node_column,
step_column=step_column,
weather_columns=weather_columns)
wa = ws.attributes
return df, wa