-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathadwords.py
93 lines (78 loc) · 3.1 KB
/
adwords.py
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
import pandas as pd
import numpy as np
import sklearn
import sys
import copy
np.random.seed(0)
def greedy(bidders_dict, queries_dict, queries):
revenue = 0
for _,q in queries.itertuples():
b = queries_dict[q]
for temp in b.itertuples():
if(bidders_dict[temp[1]]>temp[2]):
bidders_dict[temp[1]]-=temp[2]
revenue += temp[2]
break
return revenue
def msvv(bidders_dict, queries_dict, queries, original_bidders_dict):
revenue = 0
for _,q in queries.itertuples():
b = queries_dict[q]
temp_bidders_dict = {}
for temp in b.itertuples():
fraction = (original_bidders_dict[temp[1]]-bidders_dict[temp[1]])/original_bidders_dict[temp[1]]
temp_bidders_dict[temp[1]] = temp[2]*(1-np.exp(fraction-1))
max_bidder = max(temp_bidders_dict, key=temp_bidders_dict.get)
bid = b[b['Advertiser']==max_bidder]['Bid Value'].iloc[0]
if(bidders_dict[max_bidder]>bid):
bidders_dict[max_bidder]-=bid
revenue += bid
return revenue
def balance(bidders_dict, queries_dict, queries):
revenue = 0
for _,q in queries.itertuples():
b = queries_dict[q]
temp_bidders_dict = {}
for temp in b.itertuples():
temp_bidders_dict[temp[1]] = bidders_dict[temp[1]]
max_bidder = max(temp_bidders_dict, key=temp_bidders_dict.get)
bid = b[b['Advertiser']==max_bidder]['Bid Value'].iloc[0]
if(bidders_dict[max_bidder]>bid):
bidders_dict[max_bidder]-=bid
revenue += bid
return revenue
def choose_algorithm(algorithm, *args):
if algorithm=='greedy':
return greedy(bidders_dict, queries_dict, queries)
elif algorithm=='msvv':
return msvv(bidders_dict, queries_dict, queries, original_bidders_dict)
elif algorithm=='balance':
return balance(bidders_dict, queries_dict, queries)
else:
return 0
bidders = pd.read_csv('bidder_dataset.csv')
queries = pd.read_csv('queries.txt',header=None)
optimal = np.nansum(bidders['Budget'])
bidders_dict = {}
for b in bidders.itertuples():
if b[1] not in bidders_dict.keys():
bidders_dict[b[1]] = b[4]
original_bidders_dict = copy.deepcopy(bidders_dict)
queries_dict = {}
for _,q in queries.itertuples():
if q not in queries_dict.keys():
temp = bidders[bidders["Keyword"].str.contains(q)].loc[:,("Advertiser","Bid Value")]
sorted_temp = temp.sort_values(by= "Bid Value", ascending = False)
queries_dict[q] = sorted_temp
algorithm = sys.argv[1]
revenue_result = 0
for _ in range(100):
queries = sklearn.utils.shuffle(queries)
bidders_dict = copy.deepcopy(original_bidders_dict)
revenue_result += choose_algorithm(algorithm, bidders_dict, queries_dict, queries, original_bidders_dict)
revenue_result/=100
if revenue_result==0:
print("No method or wrong method choosen.")
else:
print("Average Revenue for {} Algorithm: {}".format(algorithm, revenue_result))
print("Competitive Ratio: {}".format(revenue_result/optimal))