Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Unavailability_MarketDocument_parser and fix ZipParser bug. #21

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions entsoe_client/Parsers/Parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
Acknowledgment_MarketDocument_Parser
from entsoe_client.Parsers.Outages_MarketDocument_Parser import \
Outages_MarketDocument_Parser
from entsoe_client.Parsers.Unavailability_MarketDocument_parser import \
Unavailability_MarketDocument_Parser


class Parser:
Expand Down Expand Up @@ -47,11 +49,11 @@ def unpack_archive(response_content: bytes) -> List[bytes]:
return xml_document_list

def parse(self, zip_archive: bytes):
parser = XMLParser()
xml_documents = self.unpack_archive(zip_archive)
deserailized_xmls = [XMLParser.deserialize_xml(elem) for elem in xml_documents]
parser = factory.get_parser(deserailized_xmls[0].tag, deserailized_xmls[0].type.text)
parser.set_objectified_input_xml(deserailized_xmls)
return parser.parse()
dfs = [parser.parse(xml_document) for xml_document in xml_documents]
df = pd.concat(dfs, axis=0)
return df


class XMLParser:
Expand All @@ -78,7 +80,12 @@ def get_parser(tag: str, document_type: str):
if tag in ["Acknowledgement_MarketDocument"]:
return Acknowledgment_MarketDocument_Parser()
elif tag in ["Unavailability_MarketDocument"]:
return Outages_MarketDocument_Parser()
if document_type in ["A53"]:
return Unavailability_MarketDocument_Parser()
elif document_type in ["A76", "A78", "A79", "A80", "A77"]:
return Outages_MarketDocument_Parser()
else:
raise ValueError(document_type)
elif tag in ["GL_MarketDocument"]:
if document_type in ["A65", "A70"]: # Load
return GL_MarketDocument_Parser()
Expand Down
44 changes: 44 additions & 0 deletions entsoe_client/Parsers/Unavailability_MarketDocument_parser.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from entsoe_client.Parsers import ParserUtils as utils
from entsoe_client.Parsers.Entsoe_Document_Parser import Entsoe_Document_Parser

class Abstract_Unavailability_MarketDocument_Parser(Entsoe_Document_Parser):
def __init__(self):
super().__init__()
self.Document_Parser = None
self.TimeSeries_Parser = None
self.Series_Period_Parser = None
self.Point_Parser = None
self.MktPSRType_Parser = None
self.MktGeneratingUnit_Parser = None

def set_Document_Parser(self, Document_Parser):
self.Document_Parser = Document_Parser

def set_TimeSeries_Parser(self, TimeSeries_Parser):
self.TimeSeries_Parser = TimeSeries_Parser

def set_Series_Period_Parser(self, Series_Period_Parser):
self.Series_Period_Parser = Series_Period_Parser

def set_Point_Parser(self, Point_Parser):
self.Point_Parser = Point_Parser

def set_MktPSRType_Parser(self, MktPSRType_Parser):
self.MktPSRType_Parser = MktPSRType_Parser

def set_MktGeneratingUnit_Parser(self, MktGeneratingUnit_Parser):
self.MktGeneratingUnit_Parser = MktGeneratingUnit_Parser


class Unavailability_MarketDocument_Parser(Abstract_Unavailability_MarketDocument_Parser):
def __init__(self):
super().__init__()
self.set_Document_Parser(
utils.Tree_to_DataFrame(utils.Root_to_DataFrame_fn(), "TimeSeries")
)

def parse(self):
df = self.Document_Parser(self.objectified_input_xml)
# Remove the metadata from the parent node (Timeseries) which does not give extra information
df = df.reset_index().pivot(columns="Tag", values="Value", index="Unavailability_MarketDocument.mRID")
return df