mfCompare / app.py
kk20krishna's picture
Update app.py
fb89b0a verified
# -*- coding: utf-8 -*-
"""GetMFData.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/github/Krishna-Kumar-Sankaran-Kutty/mfCompare/blob/main/GetMFData.ipynb
# Analyze MF Portfolio data from Money Control
"""
#Import Dependencies
import gradio as gr
from bs4 import BeautifulSoup
import requests
import pandas as pd
import plotly.express as px
# Define function to extract portfolio details from given url from Moneycontrol Portfolio Holdings page
def extract_portfolio(url):
# Send an HTTP GET request to the URL
response = requests.get(url)
# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')
# Find the table element
table = soup.find('table', id='equityCompleteHoldingTable')
# Extract table headers
headers = [header.text.strip() for header in table.find_all('th')]
# Extract table rows
rows = []
for row in table.find_all('tr')[1:]: # Skip the header row
data = [cell.text.strip() for cell in row.find_all('td')]
rows.append(data)
# Create a Pandas DataFrame
df = pd.DataFrame(rows, columns=headers)
# Add Fund Name column
df['Fund Name'] = url.split('/')[-3].replace('-', ' ').title()
# Set Fund Name column as index
#df = df.set_index('Fund Name')
# Clean-up 'Stock Invested in' column
df['Stock Invested in'] = df['Stock Invested in'].str.replace('#\n', '')
# Clean-up '% of Total Holdings' column nad convert to float
df['% of Total Holdings'] = df['% of Total Holdings'].str.rstrip('%').astype(float)
# Drop all columns except 'Stock Invested in', 'Sector Total', and '% of Total Holdings'
df = df[['Fund Name', 'Sector', 'Stock Invested in', '% of Total Holdings']]
return df
# Define function to generate treemap based on selected funds
def generate_treemap(fund1, fund2, fund3):
fund_urls = {
"Hdfc Index Fund Nifty 50 Plan Direct Plan": 'https://www.moneycontrol.com/mutual-funds/hdfc-index-fund-nifty-50-plan-direct-plan/portfolio-holdings/MHD1152',
"Parag Parikh Flexi Cap Fund Direct Plan": 'https://www.moneycontrol.com/mutual-funds/parag-parikh-flexi-cap-fund-direct-plan/portfolio-holdings/MPP002',
"Hdfc Nifty Next 50 Index Fund Direct Plan": 'https://www.moneycontrol.com/mutual-funds/hdfc-nifty-next-50-index-fund-direct-plan/portfolio-holdings/MHD3484'
}
selected_funds = [fund1, fund2, fund3]
dfs = []
for fund in selected_funds:
if fund:
url = fund_urls[fund]
df = extract_portfolio(url)
dfs.append(df)
if dfs:
combined_df = pd.concat(dfs)
fig = px.treemap(combined_df,
path=[px.Constant("All Funds"), 'Fund Name', 'Sector', 'Stock Invested in'],
values='% of Total Holdings',
color='Fund Name',
template='ggplot2')
return fig
else:
return None
# Create Gradio interface
fund_choices = [
"Hdfc Index Fund Nifty 50 Plan Direct Plan",
"Parag Parikh Flexi Cap Fund Direct Plan",
"Hdfc Nifty Next 50 Index Fund Direct Plan"
]
iface = gr.Interface(
fn=generate_treemap,
inputs=[
gr.Dropdown(choices=fund_choices, label="Fund 1"),
gr.Dropdown(choices=fund_choices, label="Fund 2"),
gr.Dropdown(choices=fund_choices, label="Fund 3")
],
outputs=gr.Plot()
)
iface.launch()