joshuadunlop's picture
Update app.py
f42b01e
from urllib import parse, request
import hashlib
from time import strftime, gmtime
import streamlit as st
from datetime import datetime, timedelta
import pandas as pd
import csv
from io import StringIO
# Function to fetch data from ShareASale
def fetch_shareasale_data(action_verb, affiliate_id, api_token, api_secret_key, api_version=2.4):
my_timestamp = strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime())
data = parse.urlencode({
'affiliateId': affiliate_id,
'token': api_token,
'version': api_version,
'action': action_verb
})
sig = f"{api_token}:{my_timestamp}:{action_verb}:{api_secret_key}"
sig_hash = hashlib.sha256(sig.encode('utf-8')).hexdigest()
my_headers = {
'x-ShareASale-Date': my_timestamp,
'x-ShareASale-Authentication': sig_hash
}
call = request.Request(f'https://shareasale.com/x.cfm?{data}', headers=my_headers)
try:
return_result = request.urlopen(call).read().decode('utf-8')
return return_result
except Exception as inst:
return str(inst)
# Parse CSV data to a Pandas DataFrame
def parse_csv_to_df(csv_data):
csv_stream = StringIO(csv_data)
return pd.read_csv(csv_stream, delimiter='|')
# Streamlit UI
st.title("Affiliate Earnings Dashboard")
st.sidebar.title("Settings")
# API and credential settings
my_affiliate_id = st.sidebar.text_input("ShareASale Affiliate ID", "599431")
api_token = st.sidebar.text_input("API Token", "YOUR_API_TOKEN")
api_secret_key = st.sidebar.text_input("API Secret Key", "YOUR_API_SECRET_KEY", type="password")
# Date range picker
start_date = st.sidebar.date_input("Start Date", datetime.now() - timedelta(days=30))
end_date = st.sidebar.date_input("End Date", datetime.now())
# Fetch data button
if st.sidebar.button("Fetch Data"):
# Fetch data from ShareASale
action_verb = 'ledger'
ledger_data = fetch_shareasale_data(action_verb, my_affiliate_id, api_token, api_secret_key)
# Parse the CSV data into a DataFrame
df = parse_csv_to_df(ledger_data)
# Filter rows where action is "Transaction Created"
df_filtered = df.loc[df['action'] == 'Transaction Created']
# Remove 'ledgerid' and 'transid' columns
df_filtered = df_filtered.drop(columns=['ledgerid', 'transid', 'action'])
# Display the DataFrame as a table
st.write("Transaction Data")
st.write(df_filtered)
# Create a second table summing the impact for each unique merchantid
df_sumif = df_filtered.groupby('merchantid')['impact'].sum().reset_index()
# Calculate the total impact
total_impact = df_sumif['impact'].sum()
# Add a total row to the DataFrame
total_row = pd.DataFrame({'merchantid': ['Total'], 'impact': [total_impact]})
df_sumif = pd.concat([df_sumif, total_row], ignore_index=True)
# Display the second DataFrame as a table
st.write("Impact Summary by Merchant")
st.write(df_sumif)