ETL module for Google Ads API v20 with database-optimized DataFrame processing
Project description
Google Ads Reports Helper
A Python ETL driver for Google Ads API v20 data extraction and transformation. Simplifies the process of extracting Google Ads data and converting it to database-ready pandas DataFrames with comprehensive optimization features.
Features
- Google Ads API v20: Latest API version support with full compatibility
- Database-Ready DataFrames: Optimized data types and encoding for seamless database storage
- Flexible Column Naming: Choose between snake_case or camelCase column conventions
- Smart Type Detection: Dynamic conversion of metrics to appropriate int64/float64 types
- Configurable Missing Values: Granular control over NaN/NaT handling by column type
- Character Encoding Cleanup: Automatic text sanitization for database compatibility
- Zero Impression Filtering: Robust filtering handling multiple zero representations
- Multiple Report Types: Pre-configured report models for common use cases
- Custom Reports: Create custom report configurations with full GAQL support
- Robust Error Handling: Comprehensive error handling with retry logic and specific exceptions
- Pagination Support: Automatic handling of large datasets with pagination
- Type Hints: Full type hint support for better IDE experience
Installation
pip install google-ads-reports
Quick Start
1. Set up credentials
Create a secrets/google-ads.yaml file with your Google Ads API credentials:
developer_token: "YOUR_DEVELOPER_TOKEN"
client_id: "YOUR_CLIENT_ID"
client_secret: "YOUR_CLIENT_SECRET"
refresh_token: "YOUR_REFRESH_TOKEN"
References:
https://developers.google.com/google-ads/api/docs/get-started/introduction
https://developers.google.com/google-ads/api/docs/get-started/dev-token
https://developers.google.com/workspace/guides/create-credentials#service-account
2. Basic usage
from datetime import date, timedelta
from google_ads_reports import GAdsReport, GAdsReportModel, load_credentials
# Load credentials
credentials = load_credentials()
client = GAdsReport(credentials)
# Configure report parameters
customer_id = "1234567890"
start_date = date.today() - timedelta(days=7)
end_date = date.today() - timedelta(days=1)
# Extract report data with database optimization
df = client.get_gads_report(
customer_id=customer_id,
report_model=GAdsReportModel.keyword_report,
start_date=start_date,
end_date=end_date,
filter_zero_impressions=True, # Remove rows with zero impressions
column_naming="snake_case" # Choose column naming: "snake_case" or "camelCase"
)
# Save to CSV
df.to_csv("keyword_report.csv", index=False)
Column Naming Options
Choose between snake_case (database-friendly) or camelCase (API-consistent) column names:
# Snake case (default) - metrics.impressions → impressions
df_snake = client.get_gads_report(
customer_id=customer_id,
report_model=GAdsReportModel.keyword_report,
start_date=start_date,
end_date=end_date,
column_naming="snake_case" # Default
)
# CamelCase - metrics.impressions → metricsImpressions
df_camel = client.get_gads_report(
customer_id=customer_id,
report_model=GAdsReportModel.keyword_report,
start_date=start_date,
end_date=end_date,
column_naming="camelCase"
)
Available Report Models
GAdsReportModel.adgroup_ad_report- Ad group ad performanceGAdsReportModel.keyword_report- Keyword performanceGAdsReportModel.search_terms_report- Search terms analysisGAdsReportModel.conversions_report- Conversion trackingGAdsReportModel.video_report- Video ad performanceGAdsReportModel.assetgroup_report- Asset group performance
Custom Reports
Create custom report configurations:
from google_ads_reports import create_custom_report
custom_report = create_custom_report(
report_name="campaign_performance",
select=[
"campaign.name",
"campaign.status",
"segments.date",
"metrics.impressions",
"metrics.clicks",
"metrics.cost_micros"
],
from_table="campaign",
where="metrics.impressions > 100"
)
df = client.get_gads_report(customer_id, custom_report, start_date, end_date)
Database Optimization Features
The package automatically optimizes DataFrames for database storage:
Data Type Optimization
- Automatic Date Conversion: String dates →
datetime64[ns] - Dynamic Metrics Conversion: Object metrics →
int64orfloat64based on data - Smart Integer Detection: Whole numbers become
int64, decimals becomefloat64
Missing Value Handling
- Preserve NULL Compatibility: NaN/NaT preserved for database NULL mapping
- Configurable by Type: Different strategies for numeric, datetime, and text columns
- Safe Conversion: Invalid values gracefully ignored
Character Encoding Cleanup
- ASCII Sanitization: Removes non-ASCII characters for database compatibility
- Null Byte Removal: Strips problematic null bytes (
\x00) - Length Limiting: Truncates text to 255 characters (configurable)
- Whitespace Trimming: Removes leading/trailing whitespace
Zero Impression Filtering
Handles multiple zero representations:
df = client.get_gads_report(
customer_id=customer_id,
report_model=report_model,
start_date=start_date,
end_date=end_date,
filter_zero_impressions=True # Removes: 0, "0", 0.0, "0.0", None, NaN
)
Flexible Column Naming
Choose your preferred column naming convention:
Snake Case (Default - Database Friendly):
metrics.impressions→impressionssegments.date→dateadGroupCriterion.keyword→keyword
CamelCase (API Consistent):
metrics.impressions→metricsImpressionssegments.date→segmentsDateadGroupCriterion.keyword→adGroupCriterionKeyword
# Choose naming convention
df = client.get_gads_report(
customer_id=customer_id,
report_model=report_model,
start_date=start_date,
end_date=end_date,
column_naming="snake_case" # or "camelCase"
)
Error Handling
The package provides specific exception types for different scenarios:
from google_ads_reports import (
GAdsReport,
AuthenticationError,
ValidationError,
APIError,
DataProcessingError,
ConfigurationError
)
try:
df = client.get_gads_report(customer_id, report_model, start_date, end_date)
except AuthenticationError:
# Handle credential issues
pass
except ValidationError:
# Handle input validation errors
pass
except APIError:
# Handle API errors (after retries)
pass
Examples
Check the examples/ directory for comprehensive usage examples:
basic_usage.py- Simple report extractionmultiple_reports.py- Batch report processingcustom_reports.py- Custom report creationerror_handling.py- Error handling patterns
Configuration
Retry Settings
API calls automatically retry on transient errors with configurable settings:
- Max attempts: 3 (default)
- Base delay: 1 second
- Backoff factor: 2x exponential
- Max delay: 30 seconds
Logging
Configure logging level:
from google_ads_reports import setup_logging
import logging
setup_logging(level=logging.DEBUG) # Enable debug logging
Requirements
- Python 3.9-3.12
- google-ads >= 24.0.0 (Google Ads API v20 support)
- pandas >= 2.0.0
- PyYAML >= 6.0.0
- python-dotenv >= 1.0.0
- tqdm >= 4.65.0
Development
For development installation:
git clone https://github.com/machado000/google-ads-reports
cd google-ads-reports
pip install -e ".[dev]"
License
MIT License. See LICENSE file for details.
Support
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file google_ads_reports-1.2.1.tar.gz.
File metadata
- Download URL: google_ads_reports-1.2.1.tar.gz
- Upload date:
- Size: 17.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.12.3 Linux/5.15.167.4-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2aab9f03faa9abd7137981837c6a0b79fe2247bbd0791831af49dde44aad387
|
|
| MD5 |
a2ad5d6ecd31982c80fde7cea6180a0b
|
|
| BLAKE2b-256 |
9bbecb5c552bb16f2cc698e56644d021e17023f3a3422e9f71461d22d7f3025b
|
File details
Details for the file google_ads_reports-1.2.1-py3-none-any.whl.
File metadata
- Download URL: google_ads_reports-1.2.1-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.12.3 Linux/5.15.167.4-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9483bba6e584e26885002dccb8d9f6eb63ec4936ae6df540f12df0bde88721cf
|
|
| MD5 |
26b088ec5500ccd184bfa5f99b23aca4
|
|
| BLAKE2b-256 |
b175ebb134ccc9eadea7c2e061510a79e5a9a65d637f65d2ad2cb349d7ca9866
|