Daily Dose of Data Science is a publication on Substack that brings together intriguing frameworks, libraries, technologies, and tips that make the life cycle of a Data Science project effortless.
This repository is a collection of all the code snippets presented in my publication. If you want to receive these tips in your mailbox daily, you can subscribe to my Substack newsletter.
To download the tips listed here, you can clone this repo.
git clone https://github.com/ChawlaAvi/Daily-Dose-of-Data-Science
- Pandas
- Jupyter Tips
- Python
- Plotting
- NumPy
- Memory Optimization
- Cool Tools
- Run-time Optimization
- Sklearn
- Debugging
- Missing Data
- ML-AI News
- Machine Learning
- Statistics
- Testing
- Terminal
- Documents
- Animations
Title | Notebook | Substack | Article |
---|---|---|---|
One-Minute Guide To Becoming a Polars-savvy Data Scientist | π | π | |
Avoid Using Pandas' Apply() Method At All Times | π | π | |
Pandas vs Polars β Run-time and Memory Comparison | π | π | |
A Lesser-Known Feature of the Merge Method in Pandas | π | π | |
A Highly Overlooked Approach To Analysing Pandas DataFrames | π | π | |
The Most Common Misconception About Inplace Operations in Pandas | π | π | |
Become A Bilingual Data Scientist With These Pandas to SQL Translations | π | π | |
Avoid This Costly Mistake When Indexing A DataFrame | π | π | |
AutoProfiler: Automatically Profile Your DataFrame As You Work | π | π | |
Why You Should Avoid Appending Rows To A DataFrame | π | π | |
Are You Sure You Are Using The Correct Pandas Terminologies? | π | π | |
If You Are Not Able To Code A Vectorized Approach, Try This. | π | π | |
Why Are We Typically Advised To Never Iterate Over A DataFrame? | π | π | |
PyGWalker: Analyze Pandas Dataframe in Jupyter using a Tableau-style Interface | π | π | |
A Simple Trick to Make The Most Out of Pivot Tables in Pandas | π | π | |
Never Worry About Parsing Errors Again While Reading CSV with Pandas | π | π | |
An Interesting and Lesser-Known Way To Create Plots Using Pandas | π | π | |
Generate Helpful Hints As You Write Your Pandas Code | π | π | |
Speed-up Parquet I/O of Pandas by 5x | π | π | |
Stop Using The Describe Method in Pandas. Instead, use Skimpy. | π | π | |
Stop Using The Describe Method in Pandas. Instead, use Summarytools. | π | π | |
Analyze A Pandas DataFrame Without Code | π | π | |
70x Faster Pandas By Changing Just One Line of Code | π | π | |
Reduce Memory Usage Of A Pandas DataFrame By 90% | π | π | π |
Speed-up Pandas Apply 5x with NumPy | π | π | |
A Lesser-Known Feature of Apply Method In Pandas | π | π | |
Create Pandas DataFrame from Dataclass | π | π | |
Run SQL in Jupyter To Analyze A Pandas DataFrame | π | π | |
When You Should Not Use the head() Method In Pandas | π | π | |
Three Lesser-known Tips For Reading a CSV File Using Pandas | π | π | |
The Best File Format To Store A Pandas DataFrame | π | π | π |
Lesser-Known Feature of the Merge Method in Pandas | π | π | |
The Best Way to Use Apply() in Pandas | π | π | |
A No-code Tool To Understand Your Data Quickly | π | π | |
Display Progress Bar With Apply() in Pandas | π | π | |
Supercharge value_counts() Method in Pandas With Sidetable | π | π | |
Explore CSV Data Right From The Terminal | π | π | |
Define the Correct DataType for Categorical Columns | π | π | π |
Don't Create Conditional Columns in Pandas with Apply | π | π | |
Write Your Own Flavor Of Pandas | π | π | |
Create DataFrame Hassle-free By Using Clipboard | π | π | |
Alter the Datatype of Multiple Columns at Once | π | π | |
Why you should not dump DataFrames to a CSV | π | π | π |
Why You Should Not Read CSVs with Pandas | π | π | π |
Parallelize Pandas Apply() With Swifter | π | π | |
A Hidden Feature of Describe Method In Pandas | π | π | |
Enrich Your Notebook With Interactive Controls | π | π | |
Data Analysis Using No-Code Pandas In Jupyter | π | π | |
Create Pivot Tables, Aggregations and Plots Without Any Code | π | π | π |
Parallelize Pandas with Pandarallel | π | π | π |
Pretty Plotting With Pandas | π | π | |
How to Read Multiple CSV Files Efficiently | π | π | π |
Configure Sklearn To Output Pandas DataFrame | π | π | |
Datatype For Handling Missing Valued Columns in Pandas | π | π | π |
Vectorization Does Not Always Guarantee Better Performance | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Declutter Your Jupyter Notebook Using Interactive Controls | π | π | |
π Jupyter Notebook + Spreadsheet + AI β All in One Place With Mito | π | π | |
The Coolest GitHub-Colab Integration You Would Ever See | π | π | |
Break the Linear Presentation of Notebooks With Stickyland | π | π | |
Restart Jupyter Kernel Without Losing Variables | π | π | |
Annotate Data With The Click Of A Button Using Pigeon | π | π | |
Build Elegant Web Apps Right From Jupyter Notebook with Mercury | π | π | |
Supercharge Your Jupyter Kernel With ipyflow | π | π | |
PyGWalker: Analyze Pandas Dataframe in Jupyter using a Tableau-style Interface | π | π | |
Draw The Data You Are Looking For In Seconds | π | π | |
Never Search Jupyter Notebooks Manually Again To Find Your Code | π | π | |
Stop Previewing Raw DataFrames. Instead, Use DataTables | π | π | |
Label Your Data With The Click Of A Button | π | π | |
The Coolest Jupyter Notebook Hack | π | π | |
View Documentation in Jupyter Notebook | π | π | |
Get Notified When Jupyter Cell Has Executed | π | π | |
Clear Cell Output In Jupyter Notebook During Run-time | π | π | |
CodeSquire: The AI Coding Assistant You Should Use Over GitHub Copilot | π | π | |
Find Your Code Hiding In Some Jupyter Notebook With Ease | π | π | |
Enrich Your Notebook With Interactive Controls | π | π | |
Data Analysis Using No-Code Pandas In Jupyter | π | π | |
Create Pivot Tables, Aggregations and Plots Without Any Code | π | π | π |
Restart Notebook Without Losing Variables | π | π | π |
Retrieve Previously Computed Output In Jupyter Notebook | π | π | π |
Transfer Variables Between Jupyter Notebooks | π | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
7 Elegant Usages of Underscore in Python | π | π | |
How To Enforce Type Hints in Python? | π | π | |
A Common Misconception About Deleting Objects in Python | π | π | |
What Makes The Join() Method Blazingly Faster Than Iteration? | π | π | |
A Hidden Feature of a Popular String Method in Python | π | π | |
Execute Python Project Directory as a Script | π | π | |
Improve Python Run-time Without Changing A Single Line of Code | π | π | |
A Lesser-Known Difference Between For-Loops and List Comprehensions | π | π | |
A Lesser-Known Difference Between For-Loops and List Comprehensions | π | π | |
Magic Methods: An Underrated Gem of Python OOP | π | π | |
9 Command Line Flags To Run Python Scripts More Flexibly | π | π | |
Use Custom Python Objects In A Boolean Context | π | π | |
You Were Probably Given Incomplete Info About A Tuple's Immutability | π | π | |
A Counterintuitive Thing About Python Dictionaries | π | π | |
A Counterintuitive Thing About Python Dictionaries | π | π | |
Probably The Fastest Way To Execute Your Python Code | π | π | |
A Counterintuitive Fact About Python Functions | π | π | |
Manipulating Mutable Objects In Python Can Get Confusing At Times | π | π | |
Most Python Programmers Don't Know This About Python OOP | π | π | |
You Can Add a List As a Dictionary's Key (Technically)! | π | π | |
Why Python Does Not Offer True OOP Encapsulation | π | π | |
Most Python Programmers Don't Know This About Python For-loops | π | π | |
How To Enable Function Overloading In Python | π | π | |
The Right Way to Roll Out Library Updates in Python | π | π | |
F-strings Are Much More Versatile Than You Think | π | π | |
A Single Line That Will Make Your Python Code Faster | π | π | |
Make Dot Notation More Powerful in Python | π | π | |
An Elegant Way To Perform Shutdown Tasks in Python | π | π | |
What Are Class Methods and When To Use Them? | π | π | |
Hide Attributes While Printing A Dataclass Object | π | π | |
List : Tuple :: Set : ? | π | π | |
Post_init: Add Attributes To A Dataclass Post Initialization | π | π | |
Simplify Your Functions With Partial Functions | π | π | |
DotMap: A Better Alternative to Python Dictionary | π | π | |
Prevent Wild Imports With all in Python | π | π | |
Performance Comparison of Python 3.11 and Python 3.10 | π | π | |
Why 256 is 256 But 257 is not 257? | π | π | |
Make a Class Object Behave Like a Function | π | π | |
Lesser-known Feature of Pickle Files | π | π | |
Specify Loops and Runs In %%timeit | π | π | |
Don't Use time.time() To Measure Execution Time | π | π | |
Import Your Python Package as a Module | π | π | |
Fine-grained Error Tracking With Python 3.11 | π | π | |
Run Python Project Directory As A Script | π | π | |
Use Slotted Class To Improve Your Python Code | π | π | |
Using Dictionaries In Place of If-conditions | π | π | |
In Defense of Match-case Statements in Python | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Don't Overuse Scatter, Line and Bar Plots. Try These Four Elegant Alternatives. | π | π | |
Sankey Diagrams: An Underrated Gem of Data Visualization | π | π | |
Enrich Your Heatmaps With This Simple Trick | π | π | |
The Coolest Matplotlib Hack to Create Subplots Intuitively | π | π | |
Waterfall Charts: A Better Alternative to Line/Bar Plot | π | π | π |
Enrich Your Confusion Matrix With A Sankey Diagram | π | π | |
A Simple One-Liner to Create Professional Looking Matplotlib Plots | π | π | |
Visualise The Change In Rank Over Time With Bump Charts | π | π | |
A Simple Trick That Significantly Improves The Quality of Matplotlib Plots | π | π | |
A Lesser-known Feature of Creating Plots with Plotly | π | π | |
A Little Bit Of Extra Effort Can Hugely Transform Your Basic Matplotlib Plots | π | π | |
Interactively Visualise A Decision Tree With A Sankey Diagram | π | π | |
Use Histograms With Caution. They Are Highly Misleading! | π | π | |
Three Simple Ways To (Instantly) Make Your Scatter Plots Clutter Free | π | π | |
Matplotlib Has Numerous Hidden Gems. Here's One of Them. | π | π | |
A Simple Trick That Will Make Heatmaps More Elegant | π | π | |
The Limitations Of Heatmap That Are Slowing Down Your Data Analysis | π | π | |
An Underrated Technique To Improve Your Data Visualizations | π | π | |
Who Said Matplotlib Cannot Create Interactive Plots? | π | π | |
Don't Create Messy Bar Plots. Instead, Try Bubble Charts! | π | π | |
Use Box Plots With Caution! They May Be Misleading. | π | π | |
An Underrated Technique To Create Better Data Plots | π | π | |
An Interesting and Lesser-Known Way To Create Plots Using Pandas | π | π | |
Style Matplotlib Plots To Make Them More Attractive | π | π | |
Simple One-Liners to Preview a Decision Tree Using Sklearn | π | π | |
Create Data Plots Right From The Terminal | π | π | |
Make Your Matplotlib Plots More Professional | π | π | |
Perfplot: Measure, Visualize and Compare Run-time With Ease | π | π | |
Prettify Word Clouds In Python | π | π | |
Calendar Map As A Richer Alternative to Line Plot | π | π | |
Density Plot As A Richer Alternative to Scatter Plot | π | π | π |
Python One-Liner To Create Sketchy Hand-drawn Plots | π | π | |
Create a Moving Bubbles Chart in Python | π | π | |
Visualizing Google Search Trends of 2022 using Python | π | π | |
Create A Racing Bar Chart In Python | π | π | |
Elegantly Plot the Decision Boundary of a Classifier | π | π | |
Dot Plot: A Potential Alternative to Bar Plot | π | π | π |
Hexbin Plots As A Richer Alternative to Scatter Plots | π | π | π |
Enrich Your Notebook With Interactive Controls | π | π | |
Regression Plot Made Easy with Plotly | π | π | |
Pretty Plotting With Pandas | π | π | |
Polynomial Linear Regression Plot Made Easy With Seaborn | π | π | |
Analyse Flow Data With Sankey Diagrams | π | π | |
Waterfall Charts: A Better Alternative to Line/Bar Plot | π | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
A Major Limitation of NumPy Which Most Users Aren't Aware Of | π | π | |
Beware of This Unexpected Behaviour of NumPy Methods | π | π | |
Speedup NumPy Methods 25x With Bottleneck | π | π | |
Speed-up NumPy 20x with Numexpr | π | π | |
An Elegant Way To Perform Matrix Multiplication | π | π | |
Difference Between Dot and Matmul in NumPy | π | π | |
Don't Print NumPy Arrays! Use Lovely-NumPy Instead | π | π | |
Polynomial Linear Regression with NumPy | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
70x Faster Pandas By Changing Just One Line of Code | π | π | |
Reduce Memory Usage Of A Pandas DataFrame By 90% | π | π | π |
The Best File Format To Store A Pandas DataFrame | π | π | π |
Define the Correct DataType for Categorical Columns | π | π | π |
Datatype For Handling Missing Valued Columns in Pandas | π | π | π |
Save Memory with Python Generators | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
CNN Explainer: Interactively Visualize a Convolutional Neural Network | π | π | |
Break the Linear Presentation of Notebooks With Stickyland | π | π | |
Annotate Data With The Click Of A Button Using Pigeon | π | π | |
Mito Just Got Supercharged With AI! | π | π | |
PyGWalker: Analyze Pandas Dataframe in Jupyter using a Tableau-style Interface | π | π | |
Supercharge Shell With Python Using Xonsh | π | π | |
Draw The Data You Are Looking For In Seconds | π | π | |
Preview Your README File Locally In GitHub Style | π | π | |
This GUI Tool Can Possibly Save You Hours Of Manual Work | π | π | |
Stop Previewing Raw DataFrames. Instead, Use DataTables. | π | π | |
Converting Python To LaTeX Has Possibly Never Been So Simple | π | π | |
Label Your Data With The Click Of A Button | π | π | |
Analyze A Pandas DataFrame Without Code | π | π | |
A No-Code Online Tool To Explore and Understand Neural Networks | π | π | |
Speed-up NumPy 20x with Numexpr | π | π | |
Debugging Made Easy With PySnooper | π | π | |
Deep Learning Network Debugging Made Easy | π | π | |
CodeSquire: The AI Coding Assistant You Should Use Over GitHub Copilot | π | π | |
Find Unused Python Code With Ease | π | π | |
Enrich Your Notebook With Interactive Controls | π | π | |
Data Analysis Using No-Code Pandas In Jupyter | π | π | |
Modify Python Code During Run-Time | π | π | π |
Modify Function During Run-Time | π | π | π |
Importing Modules Made Easy with Pyforest | π | π | |
Create Pivot Tables, Aggregations and Plots Without Any Code | π | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Pandas vs Polars β Run-time and Memory Comparison | π | π | |
The Limitation of KMeans Which Is Often Overlooked by Many | π | π | |
Most Sklearn Users Don't Know This About Its LinearRegression Implementation | π | π | |
Probably The Fastest Way To Execute Your Python Code | π | π | |
Why Are We Typically Advised To Never Iterate Over A DataFrame? | π | π | |
Speed-up Parquet I/O of Pandas by 5x | π | π | |
A Single Line That Will Make Your Python Code Faster | π | π | |
Make Sklearn KMeans 20x times faster | π | π | |
Speed-up NumPy 20x with Numexpr | π | π | |
The Best File Format To Store A Pandas DataFrame | π | π | π |
The Best Way to Use Apply() in Pandas | π | π | |
Don't Create Conditional Columns in Pandas with Apply | π | π | |
Why you should not dump DataFrames to a CSV | π | π | π |
Parallelize Pandas Apply() With Swifter | π | π | |
Parallelize Pandas with Pandarallel | π | π | π |
How to Read Multiple CSV Files Efficiently | π | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Why Sklearn's Linear Regression Has No Hyperparameters? | π | π | |
Scikit-LLM: Integrate Sklearn API with Large Language Models | π | π | |
Most Sklearn Users Don't Know This About Its LinearRegression Implementation | π | π | |
A Lesser-Known Feature of Sklearn To Train Models on Large Datasets | π | π | |
Sklearn One-liner to Generate Synthetic Data | π | π | |
Skorch: Use Scikit-learn API on PyTorch Models | π | π | |
Make Sklearn KMeans 20x times faster | π | π | |
Build Baseline Models Effortlessly With Sklearn | π | π | |
Polynomial Linear Regression with NumPy | π | π | |
An Elegant Way to Import Metrics From Sklearn | π | π | |
Feature Tracking Made Simple In Sklearn Transformers | π | π | |
Configure Sklearn To Output Pandas DataFrame | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Debugging Made Easy With PySnooper | π | π | |
Don't use print() to debug your code. | π | π | π |
Inspect Program Flow with IceCream | π | π | π |
Lesser-known Feature of f-strings in Python | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Handle Missing Data With Missingno | π | π | |
Datatype For Handling Missing Valued Columns in Pandas | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Now You Can Use DALLΒ·E With OpenAI API | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Decision Trees ALWAYS Overfit. Here's A Lesser-Known Technique To Prevent It. | π | π | |
Evaluate Clustering Performance Without Ground Truth Labels | π | π | |
The Most Common Misconception About Continuous Probability Distributions | π | π | |
A Common Misconception About Feature Scaling and Standardization | π | π | |
Random Forest May Not Need An Explicit Validation Set For Evaluation | π | π | |
A Visual and Overly Simplified Guide To Bagging and Boosting | π | π | |
10 Most Common (and Must-Know) Loss Functions in ML | π | π | |
A Visual and Overly Simplified Guide To Bagging and Boosting | π | π | |
10 Most Common (and Must-Know) Loss Functions in ML | π | π | |
Theil-Sen Regression: The Robust Twin of Linear Regression | π | π | |
The Limitations Of Elbow Curve And What You Should Replace It With | π | π | |
21 Most Important (and Must-know) Mathematical Equations in Data Science | π | π | |
Try This If Your Linear Regression Model is Underperforming | π | π | |
The Limitation of KMeans Which Is Often Overlooked by Many | π | π | |
Nine Most Important Distributions in Data Science | π | π | |
The Limitation of Linear Regression Which is Often Overlooked By Many | π | π | |
The Limitation of Linear Regression Which is Often Overlooked By Many | π | π | |
A Reliable and Efficient Technique To Measure Feature Importance | π | π | |
Does Every ML Algorithm Rely on Gradient Descent? | [π](https://github.com/ChawlaAvi/Daily-Dose-of-Data-Science/blob/main/Machine%20Learning/Does Every ML Algorithm Rely on Gradient Descent?.ipynb) | π | |
Visualize The Performance Of Linear Regression With This Simple Plot | π | π | |
Confidence Interval and Prediction Interval Are Not The Same | π | π | |
The Ultimate Categorization of Performance Metrics in ML | π | π | |
The Most Overlooked Problem With One-Hot Encoding | π | π | |
9 Most Important Plots in Data Science | π | π | |
Is Categorical Feature Encoding Always Necessary Before Training ML Models? | π | π | |
The Counterintuitive Behaviour of Training Accuracy and Training Loss | π | π | |
A Highly Overlooked Point In The Implementation of Sigmoid Function | π | π | |
The Ultimate Categorization of Clustering Algorithms | π | π | |
A Lesser-Known Feature of Sklearn To Train Models on Large Datasets | π | π | |
Visualize The Performance Of Any Linear Regression Model With This Simple Plot | π | π | |
How To Truly Use The Train, Validation and Test Set | π | π | |
The Advantages and Disadvantages of PCA To Consider Before Using It | π | π | |
Loss Functions: An Algorithm-wise Comprehensive Summary | π | π | |
Is Data Normalization Always Necessary Before Training ML Models? | π | π | |
A Visual Guide to Stochastic, Mini-batch, and Batch Gradient Descent | π | π | |
The Taxonomy Of Regression Algorithms That Many Don't Bother To Remember | π | π | |
The Limitation of PCA Which Many Folks Often Ignore | π | π | |
Breathing KMeans: A Better and Faster Alternative to KMeans | π | π | |
How Many Dimensions Should You Reduce Your Data To When Using PCA? | π | π | |
A Visual Guide To Sampling Techniques in Machine Learning | π | π | |
A Visual and Overly Simplified Guide to PCA | π | π | |
The Limitation Of Euclidean Distance Which Many Often Ignore | π | π | |
Visualising The Impact Of Regularisation Parameter | π | π | |
A (Highly) Important Point to Consider Before You Use KMeans Next Time | π | π | |
Is Class Imbalance Always A Big Problem To Deal With? | π | π | |
A Visual Comparison Between Locality and Density-based Clustering | π | π | |
Why Don't We Call It Logistic Classification Instead? | π | π | |
A Typical Thing About Decision Trees Which Many Often Ignore | π | π | |
Always Validate Your Output Variable Before Using Linear Regression | π | π | |
Why Is It Important To Shuffle Your Dataset Before Training An ML Model | π | π | |
Why Are We Typically Advised To Set Seeds for Random Generators? | π | π | |
This Small Tweak Can Significantly Boost The Run-time of KMeans | π | π | |
Most ML Folks Often Neglect This While Using Linear Regression | π | π | |
Is This The Best Animated Guide To KMeans Ever? | π | π | |
An Effective Yet Underrated Technique To Improve Model Performance | π | π | |
How to Encode Categorical Features With Many Categories? | π | π | |
Why KMeans May Not Be The Apt Clustering Algorithm Always | π | π | |
Skorch: Use Scikit-learn API on PyTorch Models | π | π | |
A No-Code Online Tool To Explore and Understand Neural Networks | π | π | |
Make Sklearn KMeans 20x times faster | π | π | |
Deep Learning Network Debugging Made Easy | π | π | |
Build Baseline Models Effortlessly With Sklearn | π | π | |
Polynomial Linear Regression with NumPy | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Be Cautious Before Drawing Any Conclusions Using Summary Statistics | π | π | |
The Limitation Of Pearson Correlation Which Many Often Ignore | π | π | |
Pandas and NumPy Return Different Values for Standard Deviation. Why? | π | π | |
Why Correlation (and Other Statistics) Can Be Misleading | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Generate Your Own Fake Data In Seconds | π | π |
Title | Notebook | Substack | Article |
---|---|---|---|
Supercharge Shell With Python Using Xonsh | π | π | |
Most Command-line Users Don't Know This Cool Trick About Using Terminals | π | π | |
Never Refactor Your Code Manually Again. Instead, Use Sourcery! | π | π | |
Create Data Plots Right From The Terminal | π | π | |
Visualize Commit History of Git Repo With Beautiful Animations | π | π | |
How Would You Identify Fuzzy Duplicates In A Data With Million Records? | π | π | |
Automated Code Refactoring With Sourcery | π | π | π |
Explore CSV Data Right From The Terminal | π | π |
Title | Document | Substack | Article |
---|---|---|---|
Daily Dose of Data Science - Full Archive | π | π | |
35 Hidden Python Libraries That Are Absolute Gems | π | π | |
40 Open-Source Tools to Supercharge Your Pandas Workflow | π | π | |
37 Hidden Python Libraries That Are Absolute Gems | π | π | |
10 Automated EDA Tools That Will Save You Hours Of (Tedious) Work | π | π | |
30 Python Libraries to (Hugely) Boost Your Data Science Productivity | π | π |
Title | Notebook | Substack | Video |
---|---|---|---|
Visualizing The Data Transformation of a Neural Network | π | π |