Download multiple stocks data with Python thru Yahoo finance and analyze with PivotTable

Hi, in the following Youtube video, I am using Python to download multiple stock prices from Yahoo Finance and using Excel PivotTable to analyze the data. The source code is after the video.

The Python code:

# %%
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
# import seaborn as sb
import yfinance as yf
import datetime
import warnings
warnings.filterwarnings("ignore")

plt.style.use("ggplot")
np.printoptions(precision = 3)
mpl.rcParams["axes.grid"] = True
mpl.rcParams["grid.alpha"] = 0.25
mpl.rcParams["grid.color"] = "grey"

# from pandas_datareader import data as pdr
# yf.pdr_override() - Obsoleted


# %% [markdown]
# #### Initialize Variables

# %%
start = datetime.date(2024,1,1)
end = datetime.date(2025,6,18)

start_date = start.strftime('%Y-%m-%d')
end_date = end.strftime('%Y-%m-%d')

excel_path = 'C:/Users/test/Documents/Algo/Code/Algo/' +'stocks_prices_' + start_date + '_' + end_date + '.xlsx'

# %%
df = yf.download('MSFT', start , end)
df

# %% [markdown]
# #### Define Functions

# %%
def single_data(ticker):
        df = yf.download(ticker, start , end)
        df.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in df.columns]
        df1 = df.reset_index()
        df1.insert(0, 'Ticker', 'MSFT')

        df_final = df1.rename(columns={df1.columns[0] : 'Ticker', df1.columns[1]: 'Date', df1.columns[2]: 'Close',
                                 df1.columns[3]: 'High', df1.columns[4]: 'Low',df1.columns[5]: 'Open',
                                 df1.columns[6]: 'Volume'                                
                                 })

        return df_final   

# %% [markdown]
# #### Download sigle tickers

# %%
msft = single_data("MSFT")
print(msft)

# %%
print(msft.columns)

# %% [markdown]
# #### Download multiple tickers

# %%
TICKERS = ["MSFT", "AAPL", "GOOG", "AMZN"]

# %%
def all_data(TICKERS):

    def single_data(ticker):
        df = yf.download(ticker, start , end)
        df.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in df.columns]
        df1 = df.reset_index()
        df1.insert(0, 'Ticker', ticker)

        df_final = df1.rename(columns={df1.columns[0] : 'Ticker', df1.columns[1]: 'Date', df1.columns[2]: 'Close',
                                 df1.columns[3]: 'High', df1.columns[4]: 'Low',df1.columns[5]: 'Open',
                                 df1.columns[6]: 'Volume'                                
                                 })
        return df_final 
      
    interim = map(single_data, TICKERS)
    return pd.concat(interim)

# %%
stocks_data = all_data(TICKERS)

# %%
# Set proces to 2 decimal places
cols_to_round = ['Close', 'High', 'Low', 'Open']
stocks_data[cols_to_round] = stocks_data[cols_to_round].round(2)
stocks_data

# %% [markdown]
# #### Check if data for all tickers matches

# %%
# Check data if complete
TICKERS = stocks_data['Ticker'].unique()

min_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].min()
print(min_dates_each_ticker)

max_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].max()
print(max_dates_each_ticker)

count_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].count()
print(count_dates_each_ticker)

# %%
# Transfer dataframe to Excel
if os.path.exists(excel_path):
    os.remove(excel_path)
    
stocks_data.to_excel(excel_path, index = False)

# %% [markdown]
# #### Split the datafrom to individual ticker

# %%
grp_df = stocks_data.groupby(stocks_data.Ticker)

TICKERS = stocks_data['Ticker'].unique()

def split_df(tickers):
    for ticker in tickers:  
        df = grp_df.get_group(ticker)
        print(df)
        
split_df(TICKERS)