CinAI-ScriptSmart / market_analysis.py
Ashish1722's picture
Upload 23 files
4f038ca verified
Raw
History Blame Contribute Delete
8.46 kB
import json
import streamlit as st
import matplotlib.pyplot as plt
import plotly.graph_objs as go
import plotly.express as px
import re
from json_repair import repair_json
def extract_week_data(json_str):
# Find all JSON-like objects in the string
json_objects = re.findall(r'\{[^{}]*\}', json_str)
weeks_data = []
for obj in json_objects:
try:
# Replace single quotes with double quotes for valid JSON
obj = obj.replace("'", '"')
data = json.loads(obj)
# Check if this object contains week data
if 'week_number' in data and 'domestic_projection' in data and 'international_projection' in data:
weeks_data.append(data)
except json.JSONDecodeError:
continue
return weeks_data
def analyze_and_process_market(analysis):
st.write("### Market Analysis")
st.write("Raw analysis:")
st.code(analysis)
try:
box_office_data = repair_json(analysis)
box_office_data = json.loads(box_office_data)
weeks = [f"Week {data['week_number']}" for data in box_office_data.values()]
domestic_projections = [data["domestic_projection"] for data in box_office_data.values()]
international_projections = [data["international_projection"] / 1000000 for data in box_office_data.values()] # Convert to millions
# Create a Streamlit app
st.title("Box Office Projections Over 8 Weeks")
st.write("This app visualizes the domestic and international box office projections for each week of a film's release.")
# Plotting Domestic Projections
fig_domestic, ax_domestic = plt.subplots(figsize=(10, 6))
domestic_bars = ax_domestic.bar(weeks, domestic_projections, color='b')
ax_domestic.set_ylabel('Domestic Earnings (₹ Crores)')
ax_domestic.set_title('Domestic Box Office Projections')
for bar in domestic_bars:
yval = bar.get_height()
ax_domestic.text(bar.get_x() + bar.get_width() / 2, yval + 0.2, f"{yval:.1f}", ha='center', va='bottom', fontsize=10)
st.pyplot(fig_domestic)
# Plotting International Projections
fig_international, ax_international = plt.subplots(figsize=(10, 6))
international_bars = ax_international.bar(weeks, international_projections, color='r')
ax_international.set_ylabel('International Earnings ($ Million)')
ax_international.set_title('International Box Office Projections')
for bar in international_bars:
yval = bar.get_height()
ax_international.text(bar.get_x() + bar.get_width() / 2, yval + 0.02, f"{yval:.2f}", ha='center', va='bottom', fontsize=10)
st.pyplot(fig_international)
except Exception as e:
st.error(f"Error processing data for Market Analysis: {e}")
# Display additional analysis text
additional_text = re.sub(r'\{[^{}]*\}', '', analysis).strip()
if additional_text:
st.write("#### Additional Analysis")
st.write(additional_text)
# import json
# from utils import client
# import streamlit as st
# import plotly.graph_objs as go
# import plotly.express as px
# import re
# def analyze_market(thread_id, additional_context=None):
# # Note: You might need to create a new assistant for market analysis
# run = client.beta.threads.runs.create(
# thread_id=thread_id,
# assistant_id="asst_ykSNeNu74RsJPkOxLTPYHQ36" # Replace with the actual assistant ID for market analysis
# )
# while run.status in ['queued', 'in_progress', 'cancelling']:
# run = client.beta.threads.runs.retrieve(
# thread_id=thread_id,
# run_id=run.id
# )
# if run.status == 'completed':
# messages = client.beta.threads.messages.list(thread_id=thread_id)
# analysis = next((msg.content[0].text.value for msg in reversed(list(messages)) if msg.role == "assistant"), "")
# return analysis
# else:
# return f"Error: Run status is {run.status}"
# def usd_to_inr(usd_value):
# return usd_value * 75
# def extract_number(value):
# if isinstance(value, (int, float)):
# return value
# if isinstance(value, str):
# return float(re.sub(r'[^\d.]', '', value))
# return 0
# def process_market_analysis(analysis):
# st.write("### Market Analysis")
# st.write(analysis) # Display the raw analysis first
# try:
# # Extract all JSON-like objects from the response
# json_objects = re.findall(r'\{[^}]+\}', analysis)
# weeks_data = []
# for json_str in json_objects:
# try:
# # Replace single quotes with double quotes, except within the "factors_influencing" field
# json_str = re.sub(r"'([^']*)':", r'"\1":', json_str)
# json_str = json_str.replace("'Pellichoopulu'", '"Pellichoopulu"')
# # Parse the JSON
# week_data = json.loads(json_str)
# # Clean up the data
# domestic = extract_number(week_data.get('domestic_projection', 0))
# international = extract_number(week_data.get('international_projection', 0))
# cleaned_data = {
# "week_number": week_data.get('week_number', 'Unknown'),
# "domestic_projection": domestic,
# "international_projection": international,
# "factors_influencing": week_data.get('factors_influencing', 'Not specified')
# }
# weeks_data.append(cleaned_data)
# except json.JSONDecodeError as e:
# st.warning(f"Couldn't parse JSON object: {json_str}\nError: {str(e)}")
# # Box office projections
# st.write("#### Box Office Projections")
# domestic_projections = []
# international_projections = []
# for week_data in weeks_data:
# domestic = week_data['domestic_projection']
# international = week_data['international_projection']
# # Convert to INR
# domestic_inr = usd_to_inr(domestic)
# international_inr = usd_to_inr(international)
# domestic_projections.append(domestic_inr)
# international_projections.append(international_inr)
# st.write(f"**{week_data['week_number']}**")
# st.write(f"Domestic: ₹{domestic_inr:,.2f}")
# st.write(f"International: ₹{international_inr:,.2f}")
# st.write(f"Factors: {week_data['factors_influencing']}")
# st.write("---")
# # Visualize box office projections
# if weeks_data:
# weeks = [data['week_number'] for data in weeks_data]
# fig = go.Figure()
# fig.add_trace(go.Bar(x=weeks, y=domestic_projections, name='Domestic'))
# fig.add_trace(go.Bar(x=weeks, y=international_projections, name='International'))
# fig.update_layout(title='Weekly Box Office Projections (in INR)', barmode='group')
# st.plotly_chart(fig)
# # Total projections
# total_domestic = sum(domestic_projections)
# total_international = sum(international_projections)
# st.write("#### Total Projections")
# st.write(f"Total Domestic: ₹{total_domestic:,.2f}")
# st.write(f"Total International: ₹{total_international:,.2f}")
# st.write(f"Total Global: ₹{total_domestic + total_international:,.2f}")
# # Pie chart for domestic vs international split
# fig = px.pie(values=[total_domestic, total_international],
# names=['Domestic', 'International'],
# title='Domestic vs International Box Office Split')
# st.plotly_chart(fig)
# else:
# st.warning("No valid data found for creating visualizations.")
# except Exception as e:
# st.error(f"Error processing data for Market Analysis: {e}")
# st.code(analysis)