Concerts / app.py
eswardivi's picture
Create app.py
513882d verified
raw
history blame
3.96 kB
import streamlit as st
import pandas as pd
import re
from openai import OpenAI
import concurrent.futures
import json
import os
def extract_and_parse_json_from_markdown(markdown_text: str) -> dict:
code_block_pattern = r"``````"
code_block_match = re.search(code_block_pattern, markdown_text)
if code_block_match:
json_str = code_block_match.group(1).strip()
else:
json_str = markdown_text.strip()
try:
return json.loads(json_str)
except json.JSONDecodeError as e:
raise ValueError(f"Invalid JSON format: {e}")
def process_event(event):
openai = OpenAI(
api_key=os.environ.get('DEEP_API_KEY'),
base_url="https://api.deepinfra.com/v1/openai",
)
llm_prompt = f"""
You are a digital marketing campaign analyst designed to analyze and report digital marketing campaign data for Rod Wave concerts, Your job is to convert the given text into JSON
{{
"market": "str",
"total_spend": "float",
"impressions": "float",
"clicks": "float",
"metrics_cpc": "float",
"metrics_cpm": "float",
"metrics_ctr": "float",
"metrics_cpa": "float",
"platform_spend_meta_total": "float",
"platform_spend_meta_instagram": "float",
"platform_spend_meta_facebook": "float",
"platform_spend_google_total": "float",
"platform_spend_google_youtube": "float",
"platform_spend_google_search_display": "float",
"platform_spend_programmatic": "float",
"revenue_average_ticket_price": "float",
"revenue_total_revenue": "float",
"revenue_roi": "float"
}}
Here is Text for it:
{event}
Return in only JSON adhering to Above Schema
"""
chat_completion = openai.chat.completions.create(
model="meta-llama/Llama-3.3-70B-Instruct-Turbo",
messages=[{"role": "user", "content": llm_prompt}],
)
return chat_completion.choices[0].message.content
def process_all_events(events):
json_all = []
progress_bar = st.progress(0)
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(process_event, event) for event in events]
for i, future in enumerate(concurrent.futures.as_completed(futures)):
progress = (i + 1) / len(events)
progress_bar.progress(progress)
st.write(f"Processed event {i + 1}/{len(events)}")
json_all.append(future.result())
return json_all
def main():
st.title("Rod Wave Concert Marketing Data Processor")
st.write("Upload a text file containing concert marketing data to convert it to CSV format")
uploaded_file = st.file_uploader("Choose a text file", type="txt")
if uploaded_file is not None:
text = uploaded_file.read().decode("utf-8")
events = re.split(r'\n(?=Rod Wave Concert)', text)
events = [event for event in events if event.strip()]
st.write(f"Found {len(events)} events to process")
if st.button("Process Data"):
with st.spinner("Processing events..."):
json_all = process_all_events(events)
json_sanity = []
for ele in json_all:
json_sanity.append(extract_and_parse_json_from_markdown(ele))
df = pd.DataFrame(json_sanity)
st.success("Processing complete!")
st.write("Preview of processed data:")
st.dataframe(df.head())
csv = df.to_csv(index=False)
st.download_button(
label="Download CSV",
data=csv,
file_name="processed_concert_data.csv",
mime="text/csv"
)
if __name__ == "__main__":
main()