17
17
"INTEGER" : int ,
18
18
"TIME" : float ,
19
19
"PERCENT" : float ,
20
- "STRING " : str ,
20
+ "FLOAT " : float ,
21
21
"CURRENCY" : float
22
22
}
23
23
@@ -90,51 +90,39 @@ def to_dask(self):
90
90
raise NotImplementedError ()
91
91
92
92
def _close (self ):
93
- self ._dataframe = None
93
+ self ._df = None
94
94
95
95
96
96
class GoogleAnalyticsAPI (object ):
97
- def __init__ (self , credentials_path = None ):
98
- credentials = None
99
-
100
- if credentials_path :
101
- credentials = Credentials .from_service_account_file (credentials_path )
97
+ def __init__ (self , credentials_path ):
98
+ self ._credentials_path = credentials_path
99
+ self .client = self .create_client ()
102
100
103
- self .client = discovery .build ('analyticsreporting' , 'v4' ,
104
- credentials = credentials ,
105
- cache_discovery = False ).reports ()
101
+ def create_client (self ):
102
+ credentials = Credentials .from_service_account_file (self ._credentials_path )
103
+ c = discovery .build ('analyticsreporting' , 'v4' ,
104
+ credentials = credentials ,
105
+ cache_discovery = False ).reports ()
106
+ return c
106
107
107
- def query (self , view_id : str , start_date : DateTypes , end_date : DateTypes , metrics : list ,
108
- dimensions : list = None , filters : list = None ):
108
+ def query (self , view_id : str , start_date : DateTypes , end_date : DateTypes ,
109
+ metrics : list , dimensions : list = None , filters : list = None ):
109
110
result = self ._query (
110
111
view_id = view_id , start_date = start_date , end_date = end_date ,
111
112
metrics = metrics , dimensions = dimensions , filters = filters
112
113
)
113
114
114
115
df = self ._to_dataframe (result )
115
-
116
116
return df
117
117
118
- def _query (self , view_id : str , start_date : DateTypes , end_date : DateTypes , metrics : list ,
118
+ def _build_body (self , view_id : str , start_date : DateTypes , end_date : DateTypes , metrics : list ,
119
119
dimensions : list = None , filters : list = None ):
120
120
121
- date_range = {'startDate' : start_date , 'endDate' : end_date }
122
- for key , value in date_range .items ():
123
- if is_dt (value ):
124
- date_range [key ] = as_day (value )
125
- elif value .lower () in ['yesterday' , 'today' ]:
126
- date_range [key ] = value .lower ()
127
- elif re .match (YYYY_MM_DD , value ):
128
- pass
129
- elif re .match (r'\d+DaysAgo' , value ):
130
- pass
131
- else :
132
- raise ValueError (f'{ key } ={ value } is not a supported date.\n '
133
- f'Please use a date/datetime object.' )
134
-
135
- body = {
136
- 'reportRequests' : []
121
+ date_range = {
122
+ 'startDate' : self ._parse_date (start_date ),
123
+ 'endDate' : self ._parse_date (end_date )
137
124
}
125
+
138
126
request = {
139
127
'viewId' : view_id ,
140
128
'dateRanges' : [date_range ],
@@ -151,11 +139,23 @@ def _query(self, view_id: str, start_date: DateTypes, end_date: DateTypes, metri
151
139
if filters :
152
140
request ['filtersExpression' ] = filters
153
141
154
- body ['reportRequests' ].append (request )
142
+ body = {'reportRequests' : [request ]}
143
+ return body
144
+
145
+ def _query (self , view_id : str , start_date : DateTypes , end_date : DateTypes , metrics : list ,
146
+ dimensions : list = None , filters : list = None ):
147
+
148
+ body = self ._build_body (
149
+ view_id = view_id , start_date = start_date , end_date = end_date ,
150
+ metrics = metrics , dimensions = dimensions , filters = filters
151
+ )
155
152
156
153
result = self .client .batchGet (body = body ).execute ()
154
+
157
155
report = result ['reports' ][0 ]
158
- expected_rows = report ['data' ]['rowCount' ]
156
+ expected_rows = report ['data' ].get ('rowCount' , 0 )
157
+ if expected_rows == 0 :
158
+ return report
159
159
160
160
while result ['reports' ][0 ].get ('nextPageToken' ):
161
161
body ['reportRequests' ][0 ]['pageToken' ] = result ['reports' ][0 ].get ('nextPageToken' )
@@ -238,3 +238,18 @@ def _parse_fields(fields, style):
238
238
raise ValueError ('\n ' .join (errors ))
239
239
240
240
return parsed
241
+
242
+ @staticmethod
243
+ def _parse_date (value ):
244
+ if is_dt (value ):
245
+ return as_day (value )
246
+ elif value in ['yesterday' , 'today' ]:
247
+ return value
248
+ elif re .match (YYYY_MM_DD , value ):
249
+ return value
250
+ elif re .match (r'\d+DaysAgo' , value ):
251
+ return value
252
+ else :
253
+ raise ValueError (f'{ value } is not a supported date.\n '
254
+ f'Please use a date/datetime object or string of the following formats:\n '
255
+ f'"yesterday", "today", "NDaysAgo", "YYYY-MM-DD"' )
0 commit comments