@@ -147,6 +147,8 @@ def __getattr__(self, key):
147147 val = self ._raw [key ]
148148 if key == 'timestamp' :
149149 return pd .Timestamp (val , tz = NY , unit = 'ms' )
150+ elif key in ['sip_timestamp' , 'participant_timestamp' , 'trf_timestamp' ]:
151+ return pd .Timestamp (val , tz = NY , unit = 'ns' )
150152 return val
151153 return getattr (super (), key )
152154
@@ -156,14 +158,24 @@ class _TradesOrQuotes(object):
156158
157159 def __init__ (self , raw ):
158160 def rename_keys (tick , map ):
161+ if type (map ['t' ]) is dict :
162+ # Must be a v2 response
163+ return {
164+ map [k ]['name' ]: v for k , v in tick .items ()
165+ }
159166 return {
160167 map [k ]: v for k , v in tick .items ()
161168 }
162169
163170 unit_class = self .__class__ ._unit
171+ results = {}
172+ if 'ticks' in raw :
173+ results = raw ['ticks' ]
174+ else :
175+ results = raw ['results' ]
164176 super ().__init__ ([
165- unit_class (rename_keys (tick , raw ['map' ]))
166- for tick in raw [ 'ticks' ]
177+ unit_class (rename_keys (result , raw ['map' ]))
178+ for result in results
167179 ])
168180 self ._raw = raw
169181
@@ -172,16 +184,32 @@ def df(self):
172184 if not hasattr (self , '_df' ):
173185 raw = self ._raw
174186 columns = self .__class__ ._columns
187+ results = {}
188+ if 'ticks' in raw :
189+ results = raw ['ticks' ]
190+ else :
191+ results = raw ['results' ]
175192 df = pd .DataFrame (
176- sorted (raw [ 'ticks' ] , key = lambda d : d ['t' ]),
193+ sorted (results , key = lambda d : d ['t' ]),
177194 columns = columns ,
178195 )
179- df .columns = [raw ['map' ][c ] for c in df .columns ]
180- df .set_index ('timestamp' , inplace = True )
181- df .index = pd .to_datetime (
182- df .index .astype ('int64' ) * 1000000 ,
183- utc = True ,
184- ).tz_convert (NY )
196+ if type (raw ['map' ]['t' ]) is dict :
197+ # Must be v2 response
198+ df .columns = [raw ['map' ][c ]['name' ] for c in df .columns ]
199+ df .set_index ('sip_timestamp' , inplace = True )
200+ df .index = pd .to_datetime (
201+ df .index .astype ('int64' ),
202+ utc = True ,
203+ unit = 'ns' ,
204+ ).tz_convert (NY )
205+ else :
206+ df .columns = [raw ['map' ][c ] for c in df .columns ]
207+ df .set_index ('timestamp' , inplace = True )
208+ df .index = pd .to_datetime (
209+ df .index .astype ('int64' ),
210+ utc = True ,
211+ unit = 'ms' ,
212+ ).tz_convert (NY )
185213
186214 df .sort_index (inplace = True )
187215 self ._df = df
@@ -198,6 +226,11 @@ class Trades(_TradesOrQuotes, list):
198226 _unit = Trade
199227
200228
229+ class TradesV2 (_TradesOrQuotes , list ):
230+ _columns = ('t' , 'y' , 'f' , 'q' , 'i' , 'x' , 's' , 'c' , 'p' , 'z' )
231+ _unit = Trade
232+
233+
201234class Quote (_TradeOrQuote , Entity ):
202235 pass
203236
@@ -207,66 +240,10 @@ class Quotes(_TradesOrQuotes, list):
207240 _unit = Quote
208241
209242
210- class _TradeOrQuoteV2 (object ):
211- def __init__ (self , raw ):
212- self ._raw = raw
213-
214- def __getattr__ (self , key ):
215- if key in self ._raw :
216- val = self ._raw [key ]
217- if key in ['t' , 'y' , 'f' ]:
218- return pd .Timestamp (val , tz = NY , unit = 'ns' )
219- return val
220- return getattr (super (), key )
221-
222-
223- class _TradesOrQuotesV2 (object ):
224- def __init__ (self , raw ):
225- unit_class = self .__class__ ._unit
226- super ().__init__ ([
227- unit_class (result )
228- for result in raw ['results' ]
229- ])
230- self ._raw = raw
231-
232- @property
233- def df (self ):
234- if not hasattr (self , '_df' ):
235- raw = self ._raw
236- columns = self .__class__ ._columns
237- df = pd .DataFrame (
238- sorted (raw ['results' ], key = lambda d : d ['t' ]),
239- columns = columns ,
240- )
241- df .set_index ('t' , inplace = True )
242- df .index = pd .to_datetime (
243- df .index .astype ('int64' ) * 1000000 ,
244- utc = True , unit = 'ns'
245- ).tz_convert (NY )
246-
247- df .sort_index (inplace = True )
248- self ._df = df
249-
250- return self ._df
251-
252-
253- class TradeV2 (_TradeOrQuoteV2 , Entity ):
254- pass
255-
256-
257- class TradesV2 (_TradesOrQuotesV2 , list ):
258- _columns = ('T' , 't' , 'y' , 'f' , 'q' , 'i' , 'x' , 's' , 'c' , 'p' , 'z' )
259- _unit = TradeV2
260-
261-
262- class QuoteV2 (_TradeOrQuoteV2 , Entity ):
263- pass
264-
265-
266- class QuotesV2 (_TradesOrQuotesV2 , list ):
267- _columns = ('T' , 't' , 'y' , 'f' , 'q' , 'c' , 'i' , 'p' , 'x' , 's' , 'P' , 'X' ,
243+ class QuotesV2 (_TradesOrQuotes , list ):
244+ _columns = ('t' , 'y' , 'f' , 'q' , 'c' , 'i' , 'p' , 'x' , 's' , 'P' , 'X' ,
268245 'S' , 'z' )
269- _unit = QuoteV2
246+ _unit = Quote
270247
271248
272249class Exchange (Entity ):
0 commit comments