
Daily Merged CPC Statistic Generation¶
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
from datetime import datetime, timedelta
import fnmatch
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from pathlib import Path
import pytz
import math
import time
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.colors import ListedColormap, BoundaryNorm
import matplotlib.pyplot as plt
import xarray
import xarray as xr
import numpy as np
import glob
import getpass
import act
# Scikit-learn imports
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
# Dask imports
from distributed import Client, LocalCluster, progress
# Read in the CSV
df = pd.read_csv("~/DOE_ARM_SummerSchool/merged_cpc_2023_UF_minus_FINE5min.csv")
# Make sure time column is datetime
df["time_Local"] = pd.to_datetime(df["time_Local"])
# Make a date column for grouping by individual days
df["date"] = df["time_Local"].dt.date
# Output file name
output_file = "daily_UF_minus_FINE_stats.csv"
daily_folder = "~/DOE_ARM_SummerSchool/daily_UF_minus_FINE_csvs"# Define base directory
base_dir = Path("~/DOE_ARM_SummerSchool").expanduser()
# Input CSV
input_file = base_dir / "merged_cpc_2023_UF_minus_FINE5min.csv"
# Read in the CSV
df = pd.read_csv(input_file)
# Make sure time column is datetime
df["time_Local"] = pd.to_datetime(df["time_Local"])
# Make a date column for grouping by individual days
df["date"] = df["time_Local"].dt.date
# Output file name
output_file = "daily_UF_minus_FINE_stats.csv"
# Output folder
daily_folder = base_dir / "daily_UF_minus_FINE_csvs"# Create/overwrite the output file and write the header
# Create/overwrite output file and write header
with open(output_file, "w") as f:
f.write(
"date,"
"average_UF_minus_FINE,"
"max_UF_minus_FINE,"
"min_UF_minus_FINE,"
"p25_UF_minus_FINE,"
"p50_UF_minus_FINE,"
"p75_UF_minus_FINE\n"
)
# Loop through each individual day
for date, day_df in df.groupby("date"):
# Copy the day's data so we can safely modify it
day_df = day_df.copy()
# For this day, change negative values to NaN
day_df.loc[day_df["UF_minus_FINE"] < 0, "UF_minus_FINE"] = np.nan
# Drop NaNs before calculating statistics
values = day_df["UF_minus_FINE"].dropna()
# Skip day if no valid data remains
if len(values) == 0:
continue
# Calculate daily statistics
avg_val = values.mean()
max_val = values.max()
min_val = values.min()
p25 = values.quantile(0.25)
p50 = values.quantile(0.50)
p75 = values.quantile(0.75)
# Append this day's results to the file
with open(output_file, "a") as f:
f.write(
f"{date},"
f"{avg_val},"
f"{max_val},"
f"{min_val},"
f"{p25},"
f"{p50},"
f"{p75}\n"
)plot_folder = base_dir / "daily_UF_minus_FINE_plots"
# Loop through each individual day
for date, day_df in df.groupby("date"):
print(date)
# Copy the day's data so we can safely modify it
day_df = day_df.copy()
# For this day, change negative values to NaN
day_df.loc[day_df["UF_minus_FINE"] < 0, "UF_minus_FINE"] = np.nan
# Make sure time column is datetime
day_df["time_Local"] = pd.to_datetime(day_df["time_Local"])
# Get date from filename or dataframe
date_str = day_df["time_Local"].dt.date.iloc[0]
plt.figure(figsize=(12, 5))
plt.plot(day_df["time_Local"], day_df["UF_minus_FINE"])
plt.title(f"UF minus FINE on {date_str}", fontsize=20)
plt.xlabel("Time Local", fontsize=16)
plt.ylabel("UF_minus_FINE", fontsize=16)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.grid(True)
plt.tight_layout()
# Save plot
plot_file = os.path.join(plot_folder, f"UF_minus_FINE_{date_str}.png")
plt.savefig(plot_file, dpi=300)
# Do not show plot; just close it
plt.close()
2023-01-01
2023-01-02
2023-01-03
2023-01-04
2023-01-05
2023-01-06
2023-01-07
2023-01-08
2023-01-09
2023-01-10
2023-01-11
2023-01-12
2023-01-13
2023-01-14
2023-01-15
2023-01-16
2023-01-17
2023-01-18
2023-01-19
2023-01-20
2023-01-21
2023-01-22
2023-01-23
2023-01-24
2023-01-25
2023-01-26
2023-01-27
2023-01-28
2023-01-29
2023-01-30
2023-01-31
2023-02-01
2023-02-02
2023-02-03
2023-02-04
2023-02-05
2023-02-06
2023-02-07
2023-02-08
2023-02-09
2023-02-10
2023-02-11
2023-02-12
2023-02-13
2023-02-14
2023-02-15
2023-02-16
2023-02-17
2023-02-18
2023-02-19
2023-02-20
2023-02-21
2023-02-22
2023-02-23
2023-02-24
2023-02-25
2023-02-26
2023-02-27
2023-02-28
2023-03-01
2023-03-02
2023-03-03
2023-03-04
2023-03-05
2023-03-06
2023-03-07
2023-03-08
2023-03-09
2023-03-10
2023-03-11
2023-03-12
2023-03-13
2023-03-14
2023-03-15
2023-03-16
2023-03-17
2023-03-18
2023-03-19
2023-03-20
2023-03-21
2023-03-22
2023-03-23
2023-03-24
2023-03-25
2023-03-26
2023-03-27
2023-03-28
2023-03-29
2023-03-30
2023-03-31
2023-04-01
2023-04-02
2023-04-03
2023-04-04
2023-04-05
2023-04-06
2023-04-07
2023-04-08
2023-04-09
2023-04-10
2023-04-11
2023-04-12
2023-04-13
2023-04-14
2023-04-15
2023-04-16
2023-04-17
2023-04-18
2023-04-19
2023-04-20
2023-04-21
2023-04-22
2023-04-23
2023-04-24
2023-04-25
2023-04-26
2023-04-27
2023-04-28
2023-04-29
2023-04-30
2023-05-01
2023-05-02
2023-05-03
2023-05-04
2023-05-05
2023-05-06
2023-05-07
2023-05-08
2023-05-09
2023-05-10
2023-05-11
2023-05-12
2023-05-13
2023-05-14
2023-05-15
2023-05-16
2023-05-17
2023-05-18
2023-05-19
2023-05-20
2023-05-21
2023-05-22
2023-05-23
2023-05-24
2023-05-25
2023-05-26
2023-05-27
2023-05-28
2023-05-29
2023-05-30
2023-05-31
2023-06-01
2023-06-02
2023-06-03
2023-06-04
2023-06-05
2023-06-06
2023-06-07
2023-06-08
2023-06-09
2023-06-10
2023-06-11
2023-06-12
2023-06-13
2023-06-14
2023-06-15
2023-06-16
2023-06-17
2023-06-18
2023-06-19
2023-06-20
2023-06-21
2023-06-22
2023-06-23
2023-06-24
2023-06-25
2023-06-26
2023-06-27
2023-06-28
2023-06-29
2023-06-30
2023-07-01
2023-07-02
2023-07-03
2023-07-04
2023-07-05
2023-07-06
2023-07-07
2023-07-08
2023-07-09
2023-07-10
2023-07-11
2023-07-12
2023-07-13
2023-07-14
2023-07-15
2023-07-16
2023-07-17
2023-07-18
2023-07-19
2023-07-20
2023-07-21
2023-07-22
2023-07-23
2023-07-24
2023-07-25
2023-07-26
2023-07-27
2023-07-28
2023-07-29
2023-07-30
2023-07-31
2023-08-01
2023-08-02
2023-08-03
2023-08-04
2023-08-05
2023-08-06
2023-08-07
2023-08-08
2023-08-09
2023-08-10
2023-08-11
2023-08-12
2023-08-13
2023-08-14
2023-08-15
2023-08-16
2023-08-17
2023-08-18
2023-08-19
2023-08-20
2023-08-21
2023-08-22
2023-08-23
2023-08-24
2023-08-25
2023-08-26
2023-08-27
2023-08-28
2023-08-29
2023-08-30
2023-08-31
2023-09-01
2023-09-02
2023-09-03
2023-09-04
2023-09-05
2023-09-06
2023-09-07
2023-09-08
2023-09-09
2023-09-10
2023-09-11
2023-09-12
2023-09-13
2023-09-14
2023-09-15
2023-09-16
2023-09-17
2023-09-18
2023-09-19
2023-09-20
2023-09-21
2023-09-22
2023-09-23
2023-09-24
2023-09-25
2023-09-26
2023-09-27
2023-09-28
2023-09-29
2023-09-30
2023-10-01
2023-10-02
2023-10-03
2023-10-04
2023-10-05
2023-10-06
2023-10-07
2023-10-08
2023-10-09
2023-10-10
2023-10-11
2023-10-12
2023-10-13
2023-10-14
2023-10-15
2023-10-16
2023-10-17
2023-10-18
2023-10-19
2023-10-20
2023-10-21
2023-10-22
2023-10-23
2023-10-24
2023-10-25
2023-10-26
2023-10-27
2023-10-28
2023-10-29
2023-10-30
2023-10-31
2023-11-01
2023-11-02
2023-11-03
2023-11-04
2023-11-05
2023-11-06
2023-11-07
2023-11-08
2023-11-09
2023-11-10
2023-11-11
2023-11-12
2023-11-13
2023-11-14
2023-11-15
2023-11-16
2023-11-17
2023-11-18
2023-11-19
2023-11-20
2023-11-21
2023-11-22
2023-11-23
2023-11-24
2023-11-25
2023-11-26
2023-11-27
2023-11-28
2023-11-29
2023-11-30
2023-12-01
2023-12-02
2023-12-03
2023-12-04
2023-12-05
2023-12-06
2023-12-07
2023-12-08
2023-12-09
2023-12-10
2023-12-11
2023-12-12
2023-12-13
2023-12-14
2023-12-15
2023-12-16
2023-12-17
2023-12-18
2023-12-19
2023-12-20
2023-12-21
2023-12-22
2023-12-23
2023-12-24
2023-12-25
2023-12-26
2023-12-27
2023-12-28
2023-12-29
2023-12-30
2023-12-31
2024-01-01