Skip to content

Commit 05135e9

Browse files
authored
refactor data.py (#175)
1 parent e4c62a4 commit 05135e9

File tree

1 file changed

+55
-41
lines changed

1 file changed

+55
-41
lines changed

quartz_solar_forecast/data.py

Lines changed: 55 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,58 @@ def format_nwp_data(df: pd.DataFrame, nwp_source:str, site: PVSite):
144144
)
145145
return data_xr
146146

147-
def process_pv_data(live_generation_kw: Optional[pd.DataFrame], ts: pd.Timestamp, site: PVSite) -> xr.Dataset:
147+
def fetch_enphase_data() -> Optional[pd.DataFrame]:
148+
system_id = os.getenv('ENPHASE_SYSTEM_ID')
149+
if not system_id:
150+
print("Error: Enphase inverter ID is not provided in the environment variables.")
151+
return None
152+
return get_enphase_data(system_id)
153+
154+
def fetch_solis_data() -> Optional[pd.DataFrame]:
155+
try:
156+
return asyncio.run(get_solis_data())
157+
except Exception as e:
158+
print(f"Error retrieving Solis data: {str(e)}")
159+
return None
160+
161+
def fetch_givenergy_data() -> Optional[pd.DataFrame]:
162+
try:
163+
return get_givenergy_data()
164+
except Exception as e:
165+
print(f"Error retrieving GivEnergy data: {str(e)}")
166+
return None
167+
168+
def fetch_solarman_data() -> pd.DataFrame:
169+
try:
170+
end_date = datetime.now()
171+
start_date = end_date - timedelta(weeks=1)
172+
solarman_data = get_solarman_data(start_date, end_date)
173+
174+
# Filter out rows with null power_kw values
175+
valid_data = solarman_data.dropna(subset=['power_kw'])
176+
177+
if valid_data.empty:
178+
print("No valid Solarman data found.")
179+
return pd.DataFrame(columns=['timestamp', 'power_kw'])
180+
181+
return valid_data
182+
except Exception as e:
183+
print(f"Error retrieving Solarman data: {str(e)}")
184+
return pd.DataFrame(columns=['timestamp', 'power_kw'])
185+
186+
def fetch_live_generation_data(inverter_type: str) -> Optional[pd.DataFrame]:
187+
if inverter_type == 'enphase':
188+
return fetch_enphase_data()
189+
elif inverter_type == 'solis':
190+
return fetch_solis_data()
191+
elif inverter_type == 'givenergy':
192+
return fetch_givenergy_data()
193+
elif inverter_type == 'solarman':
194+
return fetch_solarman_data()
195+
else:
196+
return pd.DataFrame(columns=['timestamp', 'power_kw'])
197+
198+
def process_pv_data(live_generation_kw: Optional[pd.DataFrame], ts: pd.Timestamp, site: 'PVSite') -> xr.Dataset:
148199
"""
149200
Process PV data and create an xarray Dataset.
150201
@@ -180,53 +231,16 @@ def process_pv_data(live_generation_kw: Optional[pd.DataFrame], ts: pd.Timestamp
180231

181232
return da
182233

183-
def make_pv_data(site: PVSite, ts: pd.Timestamp) -> xr.Dataset:
234+
def make_pv_data(site: 'PVSite', ts: pd.Timestamp) -> xr.Dataset:
184235
"""
185236
Make PV data by combining live data from various inverters.
186237
187238
:param site: the PV site
188239
:param ts: the timestamp of the site
189240
:return: The combined PV dataset in xarray form
190241
"""
191-
live_generation_kw = None
192-
193-
if site.inverter_type == 'enphase':
194-
system_id = os.getenv('ENPHASE_SYSTEM_ID')
195-
if system_id:
196-
live_generation_kw = get_enphase_data(system_id)
197-
else:
198-
print("Error: Enphase inverter ID is not provided in the environment variables.")
199-
elif site.inverter_type == 'solis':
200-
live_generation_kw = asyncio.run(get_solis_data())
201-
if live_generation_kw is None:
202-
print("Error: Failed to retrieve Solis inverter data.")
203-
elif site.inverter_type == 'givenergy':
204-
try:
205-
live_generation_kw = get_givenergy_data()
206-
except Exception as e:
207-
print(f"Error retrieving GivEnergy data: {str(e)}")
208-
elif site.inverter_type == 'solarman':
209-
try:
210-
end_date = datetime.now()
211-
start_date = end_date - timedelta(weeks=1)
212-
solarman_data = get_solarman_data(start_date, end_date)
213-
214-
# Filter out rows with null power_kw values
215-
valid_data = solarman_data.dropna(subset=['power_kw'])
216-
217-
if not valid_data.empty:
218-
# Use all valid data points
219-
live_generation_kw = valid_data
220-
else:
221-
print("No valid Solarman data found.")
222-
live_generation_kw = pd.DataFrame(columns=['timestamp', 'power_kw'])
223-
except Exception as e:
224-
print(f"Error retrieving Solarman data: {str(e)}")
225-
live_generation_kw = pd.DataFrame(columns=['timestamp', 'power_kw'])
226-
else:
227-
live_generation_kw = pd.DataFrame(columns=['timestamp', 'power_kw'])
228-
242+
live_generation_kw = fetch_live_generation_data(site.inverter_type)
229243
# Process the PV data
230244
da = process_pv_data(live_generation_kw, ts, site)
231245

232-
return da
246+
return da

0 commit comments

Comments
 (0)