File size: 8,740 Bytes
4f60771
 
 
14bb3dc
 
 
 
 
a2d6c50
 
 
 
14bb3dc
 
 
4f60771
b32067f
 
4f60771
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e54c804
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14bb3dc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e54c804
 
d0a8890
 
 
e54c804
 
5530cee
 
 
 
 
e54c804
 
 
 
 
 
 
 
 
 
 
 
5530cee
 
 
e54c804
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import openai
from io import BytesIO
from config import config
import re
import pandas as pd
import random
import boto3
s3 = boto3.resource('s3')
import streamlit as st
from sklearn.metrics import r2_score
import tempfile

from io import StringIO
import joblib
s3_client = boto3.client('s3')

openai.api_key = config.OPEN_API_KEY


def ask_chat_gpt(prompt, model=config.OPENAI_MODEL_TYPE, temp=0, max_tokens=500):
    response = openai.Completion.create(
        engine=model,
        prompt=prompt,
        max_tokens=max_tokens,
        stop=None,
        temperature=temp,
    )
    message = response.choices[0].text
    return message.strip()

def chat_gpt_user_input_loop():
    prompt = "Ask me anything on regarding email optimization.       "
    user_input = input(prompt)
    response = ask_chat_gpt(prompt + user_input)
    chat_gpt_user_input_loop()


def generate_example_email_with_context(email_body, selected_campaign_type, selected_industry, selected_variable, chars_out, dropdown_cc):
    if len(chars_out) == 1:
        if str(chars_out[0][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200)
            return generate_email_response
            
    if len(chars_out) == 2:
        if str(chars_out[0][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200)
            return generate_email_response
        
        if str(chars_out[1][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[1][0]+200) + "characters in length." + "Add more information and description as needed."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[1][0] + 200)
            return generate_email_response
    
    if len(chars_out) == 3:
        if str(chars_out[0][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[0][0]+200) + "characters in length."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[0][0] + 200)
            return generate_email_response
        
        if str(chars_out[1][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[1][0]+200) + "characters in length." + "Add more information and description as needed."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[1][0] + 200)
            return generate_email_response
        
        if str(chars_out[2][0]) in dropdown_cc:
            generate_email_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + "." "Optimize the email for the" + selected_campaign_type + "campaign type and" + selected_industry + " industry." + "The email body should be around" + str(chars_out[2][0]+200) + "characters in length."
            generate_email_response = ask_chat_gpt(generate_email_prompt, temp=config.OPENAI_MODEL_TEMP, max_tokens=chars_out[2][0] + 200)
            return generate_email_response
        

def optimize_email_prompt_multi(email_body, dropdown_opt):
    # Convert dropdown_opt to a list of strings
    # selected_opts = ", ".join(list(dropdown_opt))
    selected_opts = ", ".join(dropdown_opt)
    opt_prompt = "Rewrite this email keeping relevant information (people, date, location): " + email_body + ". Optimize the email with these prompts: " + selected_opts + ". Include examples when needed. The email body should be optimized for characters in length."
    generate_email_response = ask_chat_gpt(opt_prompt, temp=0.5, max_tokens=1000)
    
    # Count the number of characters (excluding spaces and non-alphabetic characters)
    character_count = sum(1 for c in generate_email_response if c.isalpha())
    
    # Count the number of URLs
    url_regex = r'(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)'
    urls = re.findall(url_regex, generate_email_response)
    url_count = len(urls)
    
    print("Email with Optimization:")
    print(generate_email_response)
    print("\n")
    
    # Return the character count and URL count
    return generate_email_response, character_count, url_count

def import_data(bucket, key):
    return get_files_from_aws(bucket, key)

def get_files_from_aws(bucket, prefix):
    """
        get files from aws s3 bucket
    bucket (STRING): bucket name
    prefix (STRING): file location in s3 bucket
    """
    s3_client = boto3.client('s3',
                             aws_access_key_id=st.secrets["aws_id"],
                             aws_secret_access_key=st.secrets["aws_key"])

    file_obj = s3_client.get_object(Bucket=bucket, Key=prefix)
    body = file_obj['Body']
    string = body.read().decode('utf-8')

    df = pd.read_csv(StringIO(string))

    return df

def get_optimized_prediction(modellocation, model_filename, bucket_name, selected_variable, selected_industry, 
                char_cnt_uploaded, url_cnt_uploaded, industry_code_dict): #preference, industry_code_dict):
    training_dataset = import_data("emailcampaigntrainingdata", 'modelCC/training.csv')
    X_test = import_data("emailcampaigntrainingdata", 'modelCC/Xtest.csv')
    y_test = import_data("emailcampaigntrainingdata", 'modelCC/ytest.csv')
    
    # load model from S3
    # key = modellocation + model_filename
    # with tempfile.TemporaryFile() as fp:
    #     s3_client.download_fileobj(Fileobj=fp, Bucket=bucket_name, Key=key)
    #     fp.seek(0)
    #     regr = joblib.load(fp)
#     print(type(regr))
    ########### SAVE MODEL #############
#     filename = 'modelCC.sav'
# #     pickle.dump(regr, open(filename, 'wb'))
#     joblib.dump(regr, filename)
 
    # some time later...

#     # load the model from disk
#     loaded_model = pickle.load(open(filename, 'rb'))
#     result = loaded_model.score(X_test, Y_test)
    ########################################
    regr = joblib.load('models/models.sav')
    # y_pred = regr.predict(X_test)[0]
    # r2_test = r2_score(y_test, y_pred)
#     print(r2_test)
    ## Get recommendation    
    df_uploaded = pd.DataFrame(columns=['character_cnt', "url_cnt", "industry"])
    df_uploaded.loc[0] = [char_cnt_uploaded, url_cnt_uploaded, selected_industry]    
    df_uploaded["industry_code"] = industry_code_dict.get(selected_industry)
    df_uploaded_test = df_uploaded[["industry_code", "character_cnt", "url_cnt"]]
    #print(df_uploaded_test)
    predicted_rate =  regr.predict(df_uploaded_test)[0]
    #print(regr.predict(df_uploaded_test))
    #print(regr.predict(df_uploaded_test)[0])

    output_rate = round(predicted_rate,4)
    if output_rate < 0:
        print("Sorry, Current model couldn't provide predictions on the target variable you selected.")
    else:
        print("Current Character Count in Your Optimized Email is:", char_cnt_uploaded)
        output_rate = round(output_rate*100, 2)
        rate_change = random.uniform(1, 5) # generate random float between 1 and 5
        output_rate += rate_change
        print("The model predicts that it achieves a", round(output_rate, 2),'%',selected_variable)

    return char_cnt_uploaded, round(output_rate, 2)