This repository documents my Python learning journey with a focus on:
- Data analysis
- Numerical computing
- Energy and power-system applications
- Time-series analysis
- Forecasting
- Machine learning
The goal is to build a strong Python foundation and gradually apply it to real energy, grid, forecasting, and power-system problems.
Topics covered:
- Variables and data types
- Input and output
- Conditionals
- Loops
- Lists
- Strings
- Tuples
- Sets
- Dictionaries
- Functions
- Parameters and return values
- Variable scope
- Exception handling
tryexceptelsefinallyraise- File handling
- Reading and writing files
- Modules and packages
- Import styles
__name__- Object-oriented programming
- Classes and objects
- Constructors with
__init__ - Instance attributes and methods
- Class attributes
- Inheritance
- Method overriding
super()- Polymorphism
isinstance()- Class methods
- Static methods
- Properties and setters
- Encapsulation
__str__- Composition
- Abstract base classes
- Abstract methods
- Basic type hints
Topics covered:
- Mean
- Median
- Range
- Variance
- Standard deviation
- Population vs sample statistics
- Z-scores
- Moving averages
- Basic time-series change calculations
Forecast evaluation metrics:
- MAE
- MSE
- RMSE
- MAPE
- Bias
NumPy foundation completed.
Topics covered:
- Creating
ndarrayobjects shapendimsizedtype- 1D, 2D, and higher-dimensional arrays
- Row and column vector concepts
- Indexing
- Slicing
- Reverse slicing
- Vectorized arithmetic
- NumPy ufuncs
- Operator overloading
- Elementwise calculations
- Boolean masks
- Filtering
- Combining conditions with
&and| np.where()np.argwhere()
summeanminmaxargmaxargmin- Range
- Variance
- Standard deviation
- Median
- Quantiles
- Percentiles
ddof
np.diff()- Change detection
np.sign()np.cumsum()np.cumprod()
- Min-max normalization
- Z-score standardization
reshape()ravel()flatten()squeeze()expand_dims()np.newaxis- Transpose
- Views
- Copies
- Slicing behavior
- Fancy indexing
ravel()vsflatten()
- Broadcasting rules
- Shape compatibility
- Row and column broadcasting
stackvstackhstackcolumn_stackconcatenate
splitarray_splithsplitvsplit
unique- Frequency counts
takedeleteinsertappendrepeattileflipsortargsortnp.ix_
zerosonesfulleyearangelinspace
- Random integer generation
- Uniform random values
- Normal distributions
- Random seeds
- Reproducibility
int32int64float32float64astype()- Floating-point representation
itemsizenbytes
np.nannp.isnannp.isinfnp.isfinitenanmeannanminnanmaxnansum
- Dot product
- Matrix multiplication
- Matrix-vector multiplication
- Transpose
- Symmetric matrices
- Diagonal extraction
- Trace
- Upper and lower triangular matrices
- Determinant
- Matrix inverse
- Solving linear systems
- Vector norms
- Unit vectors
- Angle between vectors
- Scalar projection
- Vector projection
- Orthogonal components
np.isclose()np.allclose()- Eigenvalues
- Eigenvectors
- Verifying
Av = λv
Current pandas topics covered:
- Creating Series
- Default and custom indexes
- Label-based access
- Position-based access
.loc.iloc- Boolean filtering
- Series attributes
.index.values.dtype.shape.size
- Creating DataFrames from dictionaries
- Selecting columns
- Selecting rows
- Scalar selection
- Multiple-row and multiple-column selection
.loc.iloc- Setting indexes
- Resetting indexes
- Index names
- Boolean filtering
sort_values()- Sorting by multiple columns
sort_index()head()tail()info()describe()
- Creating derived columns
- Boolean columns
- Categorical columns with
np.where() - Dropping rows and columns
- Renaming rows and columns
value_counts()unique()nunique()
isna()- Missing-value masks
- Missing-value counts
dropna()fillna()- Filling with mean
- Forward fill
- Backward fill
- Handling missing data by column
duplicated()drop_duplicates()- Duplicate detection by subset
- Keeping first or last duplicate
astype()pd.to_numeric()errors="coerce"- Handling invalid numeric values
.straccessorstr.strip()str.lower()str.split()str.replace()str.contains()str.startswith()str.endswith()str.len()str.extract()- Basic regular expressions
- Mapping categories
.map().replace()
groupby()- Split-apply-combine concept
- Mean
- Sum
- Min
- Max
- Count
- Multiple aggregations
.agg()- Dictionary-based aggregation
- Named aggregation
- Grouping by multiple keys
- MultiIndex results
reset_index()
pd.concat()- Vertical concatenation
- Horizontal concatenation
- Index alignment
merge()- Inner joins
- Left joins
- Right joins
- Outer joins
- Cross joins
left_onright_onright_index- Merge indicators
- Merge validation
- One-to-one
- One-to-many
- Many-to-one
- Many-to-many
- Duplicate-key row expansion
- Merge suffixes
Topics covered:
pd.to_datetime()datetime64[ns].dtaccessor- Extracting:
- Year
- Month
- Day
- Hour
- Minute
- Second
- Day name
- Day of week
- Weekend detection
- Setting timestamps as index
- Sorting datetime indexes
- Partial datetime selection
- Datetime slicing
- Date-based filtering
resample()- Hourly resampling
- Daily resampling
- Mean aggregation
- Sum aggregation
- Multiple aggregations
- Frequency aliases
- Power vs energy distinction
- Converting power samples to energy
- Regular sampling intervals
- 30-minute measurements
Energy_MWh = Power_MW × interval_hours- Hourly power averages
- Hourly energy totals
- Row-based rolling windows
- Time-based rolling windows
- Rolling mean
- Rolling maximum
- Rolling minimum
- Rolling range
min_periods- Regular vs irregular sampling
- Time-window boundary behavior
closed="both"
shift()- Lag-1 features
- Lag-2 features
- Lag-3 features
- Previous-value features
- Power differences
- Percentage changes
pct_change()- Forecasting feature intuition
pd.date_range()periodsfreq- 30-minute sampling
- Regular time indexes
- Linear interpolation
- Time-based interpolation
- Interpolation vs extrapolation
- Interpolation with one missing value
- Interpolation with multiple missing values
- Position-based interpolation
- Time-weighted interpolation
- Regular vs irregular timestamps
- Difference between missing values and missing rows
- Restoring expected frequencies with
asfreq() - Creating expected time indexes
- Detecting missing timestamps with
Index.difference() - Dynamic expected indexes using:
.index.min().index.max()
- Missing timestamp masks
- Missing-value counts
Built helper functions for:
- Detecting missing timestamps
- Handling empty DataFrames
- Validating
DatetimeIndex - Raising
TypeError - Combining validation with:
tryexceptelse