Dev Dives: Streamline document processing with UiPath Studio Web
Account Performance and Optimization
1. AdWords API Workshops 2013
Account Performance &
Optimization
Finding the needle in your haystack
Google Confidential and Proprietary
2. Overview
1. How to Optimize
○ The Optimization Cycle
2. Developing a solid reporting backend
○ Reporting Workflow
○ Strategies for scaling, processing and storage
○ Introduction to sample applications
3. Keyword Optimizations
○ What are TIS and TES
○ Discovering good ideas with TIS and TES
○ Automated keyword optimizations strategy
4. Discovering optimization opportunities with Kratu
○ Introduction to Kratu
○ AdWords Optimization Report in Kratu
○ Kratu backend example
Google Confidential and Proprietary
9. Reporting Workflow MCC Info
Managed
List<ManagedCustomer> Customer
Service
Report Definition
ReportType
Report Data Storage
DateRange Report Downloader Processor MySql
MongoDB
...
Fields
n-Threads
Google Confidential and Proprietary
10. Report Data Storage
Report Downloader Processor MySql
MongoDB
...
n-Threads
Process local temp files
Keys must guarantee
Based on Parses rows using a Uniqueness per
MultipleClient CSVReader ReportRow
ReportDownloader (Date/Day, Segments)
example Write calls to Storage
must be in batches Rows Updates are
Each Thread runs a frequent
ReportDownloder with: Batch size depends on
technology/memory Create indexes for:
● AdWordsSession
● ClientCustomerId Shard data based on ● AccountId
● ReportDefinition account, subMCCs, dates ● Date/Day
● CSV & GZip or common attributes ● CampaignId
● Segments...
Google Confidential and Proprietary
11. Implementing a MySql ReportProcessor
connection.setAutoCommit( false);
statement.execute(" SET UNIQUE_CHECKS=0; ALTER TABLE ... DISABLE KEYS;");
for (File file : localFiles) {
preparedStatement = "INSERT INTO .. (.) VALUES (.) ON DUPLICATE KEY UPDATE
(.)";
CSVReader csvReader = new CSVReader(new InputStreamReader (new FileInputStream
(
file.getAbsolutePath() + ".gunzip"), " UTF-8"), ',', '"', 1);
reportRows = new ModifiedCsvToBean <Report>(). parseReport(mapping, csvReader);
for (Report reportItem : reportRows) {
addInsertToBatch(reportItem, preparedStatement);
// Executing the Batch every 500 inserts to reduce memory usage
if (batchSize++ >= 500) {
preparedStatement.executeBatch();
connection.commit();
batchSize = 0;
}
}...
}...
statement.execute(" SET UNIQUE_CHECKS=1; ALTER TABLE ... ENABLE KEYS;");
Google Confidential and Proprietary
12. Implementing a MongoDB ReportProcessor
for (File file : localFiles) {
CSVReader csvReader = new CSVReader(new InputStreamReader(
new FileInputStream(file),"UTF-8"), ',', '"', 1);
List<Report> reportObjectList =
ModifiedCsvToBean<Report>().parseReport(mapping, csvReader);
csvReader.close();
// Save in MongoDB (there is also an AppEngine implementation)
// Iterates using Google Gson: gsonBuilder.create().toJson(Object)
// and DBObject: com.mongodb.util.JSON.parse(jsonObject)
noSqlStorage.save(reportObjectList);
}
Google Confidential and Proprietary
14. TIS SearchParameter[ ]
Keyword / Placement
TargetingIdeaSelector
Ideas / Stats
AttributeType[ ] (fields)
Targeting Idea
Service
TargetingIdea[ ]
Type_AttributeMapEntry[ ]
(field,value)
Google Confidential and Proprietary
15. TIS - Search Parameters & Fields
SearchParameter[ ] AttributeType[ ] (fields)
● AdSpecList ● Average Cpc
● CategoryProductsAndServices ● Average Targeted Monthly Searches
● Competition ● Category Products and Services
● ExcludedKeyword ● Competition
● IdeaTextFilter ● Criterion
● IncludeAdultContent ● Extracted from Webpage
● Language ● Global Monthly Searches
● Location ● Idea Type
● Network NEW ● Keyword Category
● PlacementType ● Keyword Text
● RelatedToQuery ● Negative Keywords
● RelatedToUrl ● Search Share
● SearchVolume ● Search Volume
● SeedAdGroupId ● Targeted Monthly Searches
...
Google Confidential and Proprietary
16. TIS EXAMPLE
LanguageSearchParameter = english
RelatedToUrlSearchParameter = http://www.someplumbers.com/
LocationSearchParameter = uk
RequestType. IDEAS, IdeaType. KEYWORD
{AttributeType. KEYWORD_TEXT, AttributeType. SEARCH_VOLUME,
AttributeType. AVERAGE_CPC ,AttributeType. COMPETITION}
Targeting Idea
Service
KEYWORD_TEXT searchVol avgCPC Competition
'london plumbing service' 16 5.13 0.858
'london plumbing services' 46 9.41 0.765
'emergency plumbing service' 28 6.71 0.912
... new
Google Confidential and Proprietary
17. TES
TrafficEstimatorSelector
CampaignEstimateRequest[ ] Criterion[ ], campaignId
AdGroupEstimateRequest[ ] adGroupId, maxCPC
KeywordEstimateRequest[ ] keyword, maxCpc, isNegative
Traffic Estimator Service
CampaignEstimate[ ] campaignId
AdGroupEstimate[ ] adGroupId
KeywordEstimate[ ] criterionId, Min & Max StatsEstimates
averageCpc, averagePosition, clicksPerDay, impressionsPerDay, clickThroughRate, totalCost
Google Confidential and Proprietary
18. campaignEstimateRequest.setCriteria(new Criterion[] { uk, english });
adGroupEstimateRequest.setMaxCpc(new Money(null, 1000000)); // 1€
adGroupEstimateRequest.setKeywordEstimateRequests( ...
'london plumbing service'
'emergency plumbing service london'
'emergency plumbing services london'... )...
Traffic Estimator Service
Keyword avgCPC avgPosition dayClicks totalCost CTR
dayImpressions
'london plumbing service', 0.87, 2.00, 0.02, 0.02, 0.04, 0.58
'plumbing services london', 0.71, 8.56, 0.54, 0.39, 0.01, 49.33
new new
...
Google Confidential and Proprietary
19. Example Optimization - Epsilon Greedy Inspired
http://en.wikipedia.org/wiki/Multi-armed_bandit
Automatic auto glass repair
● Regular car glass replacement
● Set and forget
● Needs close monitoring windshield repair
vehicle glass repair
Semi-automatic KW Research
● Manual lookup car window repair Using TIS+TES
● Suggest KWs for exchange fix car glass
● KW Research can be
manual car glass
glass window
glasses repair
KW window repair
Google Confidential and Proprietary
21. Kratu - Open Source Issue and Opportunity Discovery
Google Confidential and Proprietary
22. Kratu - Open Source Issue and Opportunity Discovery
● Open Source, Google driven
○ http://google.github.com/kratu/
● Client-side, runs in the browser. Implemented in JavaScript
● Includes prebuilt working example for AdWords
○ Starting point created by experienced Google Account Managers
○ Used internally at Google to display data for millions of accounts
○ Provided as-is. Use with caution. Google accepts no liabilities.
● BYOD - Bring Your Own Data
○ Anything that can be converted to a JS Array with key/value objects
○ Includes simple JSON and CSV loaders
● We offer a Google built sample backend
● Easily integratable with other, non-AdWords data
Google Confidential and Proprietary
24. Kratu - Implementation - Overview
Reporting
Data Storage backend
MySql Fetch
MongoDB Process
... Store
Web server
/kratu/
/rest/accounts/
Google Confidential and Proprietary
25. Kratu - Implementation
● Easy to add other signals
○ Add any key/value pair to your data, define a weight and a threshold
● Flexible model
○ Custom and built-in calculation of opportunity/issue
○ Compose new signals from multiple data points
○ Custom and built-in event handlers (integrate with other systems)
○ Custom and built-in formatting
● Paginations for larger number of accounts
● Re-use data and signals to produce new reports
○ Targeted reports, eg. upselling opportunities, mobile adoption
○ Personalized reports, eg. individual for Account managers
● End-to-end tutorial available here:
○ http://google.github.com/kratu/tutorial/
Google Confidential and Proprietary
26. Kratu - backend example
Quick example using Restlet and Gson:
router.attach("/accountreports/{accountId}", ReportRest.class);
String accountId = (String) getRequestAttributes().get("
accountId");
@Get
public JsonRepresentation getAccountPerformanceReportHandler() {
// Gets Reports from MongoDB or MySql as Java Objects
List<Report> listAccountReports = Report.getReportByAccountIdMonth(
accountId, date, "AccountReport");
String resultJsonList = gson.toJson(listAccountReports);
JsonRepresentation jsonRepresentation = new
JsonRepresentation(resultJsonList);
jsonRepresentation.setMediaType(MediaType.APPLICATION_JSON);
return jsonRepresentation;
}
Google Confidential and Proprietary