Lectures: Nguyễn Tuấn Phong, Đào Việt Anh
Labs: Trịnh Ngọc Huỳnh, Phạm Tiến Du
Semester: 2025-2026-1
Institute for AI, VNU-UET
df = pd.read_csv("data.csv")
df["ts"] = pd.to_datetime(df["timestamp"],
utc=True, errors="coerce")
df = df.set_index("ts").sort_index()
# DateTimeIndex[UTC] ready for time-aware ops
dup = df.index.duplicated(keep=False)
df_clean = df.groupby(level=0).mean(numeric_only=True) # collapse exact dup timestamps
# Unique DateTimeIndex achieved
rng = pd.date_range("2024-01-01", periods=5, freq="D")
s = pd.Series(range(5), index=rng)
s_lag1 = s.shift(1)
# Lag features ready
df = df.tz_localize("Europe/Paris", ambiguous="NaT", nonexistent="NaT")
df_hcm = df.tz_convert("Asia/Ho_Chi_Minh")
# DST-safe index for resampling and rolling windows
# Hourly series (2 points)
idx = pd.date_range("2024-01-01 10:00", periods=2, freq="h")
s = pd.Series([100, 110], index=idx)
# Align to a 15-minute grid (no aggregation; reveals NaNs)
up = s.asfreq("15min")
# Optional: make it continuous
up_i = up.interpolate("time").ffill()
display(up)
print("---" * 10)
display(up_i)
2024-01-01 10:00:00 100.0
2024-01-01 10:15:00 NaN
2024-01-01 10:30:00 NaN
2024-01-01 10:45:00 NaN
2024-01-01 11:00:00 110.0
Freq: 15min, dtype: float64
------------------------------
2024-01-01 10:00:00 100.0
2024-01-01 10:15:00 102.5
2024-01-01 10:30:00 105.0
2024-01-01 10:45:00 107.5
2024-01-01 11:00:00 110.0
Freq: 15min, dtype: float64
# Minute data (5 points in the first 15-min bin)
idx_m = pd.date_range("2024-01-01 10:00", periods=5, freq="min")
m = pd.Series([1, 2, 3, 4, 5], index=idx_m)
# Downsample to 15-minute bins:
down_af = m.asfreq("15min") # just pick value exactly at 10:00, else NaN
down_mean = m.resample("15min").mean() # aggregation (average of 1..5 = 3)
print("Original data:")
display(m)
print("---")
print("asfreq('15min'):")
display(down_af.head())
print("---")
print("resample('15min').mean():")
display(down_mean.head())
Original data:
2024-01-01 10:00:00 1
2024-01-01 10:01:00 2
2024-01-01 10:02:00 3
2024-01-01 10:03:00 4
2024-01-01 10:04:00 5
Freq: min, dtype: int64
---
asfreq('15min'):
2024-01-01 10:00:00 1
Freq: 15min, dtype: int64
---
resample('15min').mean():
2024-01-01 10:00:00 3.0
Freq: 15min, dtype: float64
weekly = s.resample("W").sum()
by_month = s.groupby(s.index.month).mean()
# Seasonal patterns by calendar buckets
roll = s.rolling("30D", min_periods=15)
ma = roll.mean(); sd = roll.std()
# Smooth trend & local variability
s_reg = s.asfreq("D")
s_fill = s_reg.interpolate("time").ffill()
# Consistent daily series for downstream ops
roll = s.rolling(30, min_periods=15)
mu, sd = roll.mean(), roll.std()
z = (s - mu) / sd
outliers = s[z.abs() > 3]
# Flags are relative to the local 30-sample context