hyb
2025-12-30 5e753a15ff53faab2261a53367e44d38caf87041
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
Ë
nñúhY…ãóZ—dZddlmZddlmZmZddlZddlmZddl    m
Z
m Z m Z m Z ddlZddlZddlZddlmZmZmZmZddlmZdd    lmZmZmZmZm Z m!Z!m"Z"m#Z#dd
l$m%Z%dd l&m'Z'm(Z(m)Z)dd l*m+Z+dd l,m-Z-ddl.m/Z/ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=ddl>m?Z?m@Z@ddlAmBZBmCZCddlDmEZEmFZFddlGmHZHmIZImJZJmKZKmLZLddlMmNcmOZPddlQmRZRmSZSmTZTddlUmVZVddlWmNcmXZYddlZm[Z[m\Z\ddl]m^Z^ddl_m`Z`ddlambZbmcZce
rddlGmdZdddlemfZfddlQmgZgddlhmiZiejÔejÖejØejÖejÚejÜejÞejàejâejäejæejèejêejìejîejðejòejôejöejôejøejúejüejþejejejejejej
iZ†ejejÚurejÖe†ej<ejeTeJeCfZ‰e(d«e'e^d¬«                                            d;                                                                                                            d<d „««ZŠ                                        d=                                                                                                    d>d!„Z‹                d?d"„ZŒ                                d@                                                                    dAd#„Z                                                dB                                                                                            dCd$„ZŽGd%„d&«Z        dD                                    dEd'„Z        dD                                    dFd(„Z‘                                                dGd)„Z’Gd*„d+e«Z“dHd,„Z”Gd-„d.e“«Z•                                dId/„Z–dJd0„Z—                        dKd1„Z˜    dL                                    dMd2„Z™    dN                            dOd3„Zš                        dPd4„Z›                                dQd5„Zœ                                        dRd6„ZdSd7„ZždSd8„ZŸdTd9„Z                                 dUd:„Z¡y)Vz
SQL-style merge routines
é)Ú annotations)ÚHashableÚSequenceN)Úpartial)Ú TYPE_CHECKINGÚLiteralÚcastÚfinal)Ú    TimedeltaÚ    hashtableÚjoinÚlib)Úis_range_indexer)Ú AnyArrayLikeÚ    ArrayLikeÚ
IndexLabelÚJoinHowÚMergeHowÚShapeÚSuffixesÚnpt)Ú
MergeError)ÚAppenderÚ SubstitutionÚcache_readonly)Úfind_stack_level)ÚExtensionDtype)Úfind_common_type) Ú ensure_int64Ú ensure_objectÚis_boolÚ is_bool_dtypeÚis_float_dtypeÚ
is_integerÚis_integer_dtypeÚ is_list_likeÚ    is_numberÚis_numeric_dtypeÚis_object_dtypeÚis_string_dtypeÚneeds_i8_conversion)ÚCategoricalDtypeÚDatetimeTZDtype)Ú ABCDataFrameÚ    ABCSeries)ÚisnaÚna_value_for_dtype)Ú
ArrowDtypeÚ CategoricalÚIndexÚ
MultiIndexÚSeries)ÚArrowExtensionArrayÚBaseMaskedArrayÚExtensionArray)Ú StringDtype)Úensure_wrapped_if_datetimelikeÚ extract_array)Ú
_merge_doc)Ú default_index)Úget_group_indexÚis_int64_overflow_possible)Ú    DataFrame)Úgroupby)Ú DatetimeArray)Ú
FrozenListz!
left : DataFrame or named Series)Úindentsc ó¸—t|«} t|«}|dk(rt| ||||||||    | | |
¬« St| |||||||||    | | ¬« }|j|
¬«S)NÚcross)
ÚonÚleft_onÚright_onÚ
left_indexÚ right_indexÚsortÚsuffixesÚ    indicatorÚvalidateÚcopy)
ÚhowrHrIrJrKrLrMrNrOrP©rQ)Ú_validate_operandÚ _cross_mergeÚ_MergeOperationÚ
get_result)ÚleftÚrightrRrHrIrJrKrLrMrNrQrOrPÚleft_dfÚright_dfÚops                úLH:\Change_password\venv_build\Lib\site-packages\pandas/core/reshape/merge.pyÚmerger^‡s“€ô"  Ó%€GÜ  Ó'€HØ
ˆg‚~ÜØ Ø ØØØØ!Ø#ØØØØØô 
ð     
ôØ Ø ØØØØØ!Ø#ØØØØô 
ˆð}‰} $ˆ}Ó'Ð'óc óî—|s|s|€|€| td«‚dtj«›} |jdi| di¤Ž}|jdi| di¤Ž}| gx}}t    ||d||||||||
| |    ¬« } | | =| S)z,
    See merge.__doc__ with how='cross'
    zMCan not pass on, right_on, left_on or set right_index=True or left_index=TrueÚ_cross_éÚinner) rRrHrIrJrKrLrMrNrOrPrQ©)rÚuuidÚuuid4Úassignr^)rXrYrHrIrJrKrLrMrNrQrOrPÚ    cross_colÚress              r]rUrU»sº€ñ&    Ù Ø Ð Ø Ð Ø ˆ>äð ó
ð    
ð
œ$Ÿ*™*›,˜Ð(€IØ ˆ4;‰;Ñ (˜) Q˜Ñ (€DØ ˆEL‰LÑ *˜I q˜>Ñ *€Eà#˜Ð$€Gˆhä
Ø Ø Ø Ø ØØØØØ ØØØØ ô €Cð     ˆIˆØ €Jr_c
ó@‡—g}t|ttf«s|g}|j|d¬«}d}t    ˆfd„|D««r‰j|d¬«}|j
j |j|j¬«D]H\}}|€‰}    n    ‰j|j|«}    |||    «} || |<|j'| «ŒJddlm}||d    ¬
«}|j|djd¬ «}||fS#t$r‹|jj«}
|
‰jD cgc]} | t|
«vsŒ| ‘Œncc} wc} z} |j| ¬«} t!t#| ««| _|j'| «YŒwxYw) zÒ
    groupby & merge; we are always performing a left-by type operation
 
    Parameters
    ----------
    by: field to group
    left: DataFrame
    right: DataFrame
    merge_pieces: function for merging
    F©rMNc3ó:•K—|]}|‰jv–—Œy­w©N©Úcolumns)Ú.0ÚitemrYs  €r]ú    <genexpr>z%_groupby_and_merge.<locals>.<genexpr>søèø€Ò
0 Tˆ45—=‘=Ô  Ñ
0ùsƒ)Úaxisrnr©ÚconcatT)Ú ignore_index)rorQ)Ú
isinstanceÚlistÚtuplerBÚallÚ_grouperÚ get_iteratorÚ _selected_objrsÚtakeÚindicesÚKeyErrorroÚtolistÚsetÚreindexÚrangeÚlenÚindexÚappendÚpandas.core.reshape.concatru)ÚbyrXrYÚ merge_piecesÚpiecesÚlbyÚrbyÚkeyÚlhsÚrhsÚlcolsÚrÚcolsÚmergedruÚresults  `             r]Ú_groupby_and_merger–òs„ø€ð€FÜ bœ4¤˜-Ô (؈Tˆà
,‰,r ˆ,Ó
&€CØCG€Cô Ó
0¨RÔ
0Ô0؏m‰m˜B UˆmÓ+ˆà—L‘L×-Ñ-¨c×.?Ñ.?ÀcÇhÁhÐ-ÓOò‰ˆˆSØ ˆ;؉Cð     Ø—j‘j §¡¨SÑ!1Ó2ñ˜c 3Ó'ˆðˆˆr‰
à ‰ fÕð+õ22á F¨Ô .€FØ ^‰^ F¨1¡I×$5Ñ$5¸Eˆ^Ó B€FØ 3ˆ;Ðøô/ò àŸ ™ ×*Ñ*Ó,Ø¨5¯=©=ÖP a¸AÄSÈÃZÒ<O¢ÑPùÔPÑPØŸ™¨T˜Ó2Ü$¤S¨£[Ó1” Ø— ‘ ˜fÔ%Úð ús%ÂD    Ä    2FÄ;E
ÅE
ÅAFÆFc
󇇇‡‡‡    ‡ —dˆˆ    ˆˆˆˆfd„ Š | | td«‚|it|t«r|g}t|«j    |j
«}
t |
«dk7rt|
›d«‚t|||ˆ fd„«\} } | S|it|t«r|g}t|«j    |j
«}
t |
«dk7rt|
›d«‚t|||ˆ fd„«\} } | S‰ ||«} | S)    a)
    Perform a merge for ordered data with optional filling/interpolation.
 
    Designed for ordered data like time series data. Optionally
    perform group-wise merge (see examples).
 
    Parameters
    ----------
    left : DataFrame or named Series
    right : DataFrame or named Series
    on : label or list
        Field names to join on. Must be found in both DataFrames.
    left_on : label or list, or array-like
        Field names to join on in left DataFrame. Can be a vector or list of
        vectors of the length of the DataFrame to use a particular vector as
        the join key instead of columns.
    right_on : label or list, or array-like
        Field names to join on in right DataFrame or vector/list of vectors per
        left_on docs.
    left_by : column name or list of column names
        Group left DataFrame by group columns and merge piece by piece with
        right DataFrame. Must be None if either left or right are a Series.
    right_by : column name or list of column names
        Group right DataFrame by group columns and merge piece by piece with
        left DataFrame. Must be None if either left or right are a Series.
    fill_method : {'ffill', None}, default None
        Interpolation method for data.
    suffixes : list-like, default is ("_x", "_y")
        A length-2 sequence where each element is optionally a string
        indicating the suffix to add to overlapping column names in
        `left` and `right` respectively. Pass a value of `None` instead
        of a string to indicate that the column name from `left` or
        `right` should be left as-is, with no suffix. At least one of the
        values must not be None.
 
    how : {'left', 'right', 'outer', 'inner'}, default 'outer'
        * left: use only keys from left frame (SQL: left outer join)
        * right: use only keys from right frame (SQL: right outer join)
        * outer: use union of keys from both frames (SQL: full outer join)
        * inner: use intersection of keys from both frames (SQL: inner join).
 
    Returns
    -------
    DataFrame
        The merged DataFrame output type will be the same as
        'left', if it is a subclass of DataFrame.
 
    See Also
    --------
    merge : Merge with a database-style join.
    merge_asof : Merge on nearest keys.
 
    Examples
    --------
    >>> from pandas import merge_ordered
    >>> df1 = pd.DataFrame(
    ...     {
    ...         "key": ["a", "c", "e", "a", "c", "e"],
    ...         "lvalue": [1, 2, 3, 1, 2, 3],
    ...         "group": ["a", "a", "a", "b", "b", "b"]
    ...     }
    ... )
    >>> df1
      key  lvalue group
    0   a       1     a
    1   c       2     a
    2   e       3     a
    3   a       1     b
    4   c       2     b
    5   e       3     b
 
    >>> df2 = pd.DataFrame({"key": ["b", "c", "d"], "rvalue": [1, 2, 3]})
    >>> df2
      key  rvalue
    0   b       1
    1   c       2
    2   d       3
 
    >>> merge_ordered(df1, df2, fill_method="ffill", left_by="group")
      key  lvalue group  rvalue
    0   a       1     a     NaN
    1   b       1     a     1.0
    2   c       2     a     2.0
    3   d       2     a     3.0
    4   e       3     a     3.0
    5   a       1     b     NaN
    6   b       1     b     1.0
    7   c       2     b     2.0
    8   d       2     b     3.0
    9   e       3     b     3.0
    c
óJ•—t||‰‰‰‰‰‰¬«}|j«S)N)rHrIrJrNÚ fill_methodrR)Ú _OrderedMergerW)    ÚxÚyr\r™rRrIrHrJrNs       €€€€€€r]Ú_mergerzmerge_ordered.<locals>._merger“s3ø€ä Ø Ø ØØØØØ#Øô    
ˆð}‰}‹Ðr_z*Can only group either left or right framesrz not found in left columnscó•—‰||«Srmrd©r›rœrs  €r]ú<lambda>zmerge_ordered.<locals>.<lambda>©sø€É'ÐRSÐUVË-€r_z not found in right columnscó•—‰||«SrmrdrŸs  €r]r zmerge_ordered.<locals>.<lambda>±s ø€±¸¸1³ €r_)ÚreturnrA)    Ú
ValueErrorrwÚstrr‚Ú
differenceror…r€r–)rXrYrHrIrJÚleft_byÚright_byr™rNrRÚcheckr•Ú_rs  ```  ```   @r]Ú merge_orderedrª+sþ€÷P ò ðИxÐ3ÜÐEÓFÐFØÐÜ gœsÔ #ؐiˆGܐG“ ×'Ñ'¨¯ © Ó5ˆÜ ˆu‹:˜Š?ܘe˜WÐ$>Ð?Ó@Ð @Ü& w°°eÓ=WÓX‰    ˆð €Mð
Р   Ü h¤Ô $Ø zˆHܐH“ ×(Ñ(¨¯©Ó7ˆÜ ˆu‹:˜Š?ܘe˜WÐ$?Ð@ÓAÐ AÜ&Ø e˜TÓ#=ó
‰    ˆð
€Mñ˜˜uÓ%ˆØ €Mr_cóV—t||||||||||    |
d| | | ¬«}|j«S)ax"
    Perform a merge by key distance.
 
    This is similar to a left-join except that we match on nearest
    key rather than equal keys. Both DataFrames must be sorted by the key.
 
    For each row in the left DataFrame:
 
      - A "backward" search selects the last row in the right DataFrame whose
        'on' key is less than or equal to the left's key.
 
      - A "forward" search selects the first row in the right DataFrame whose
        'on' key is greater than or equal to the left's key.
 
      - A "nearest" search selects the row in the right DataFrame whose 'on'
        key is closest in absolute distance to the left's key.
 
    Optionally match on equivalent keys with 'by' before searching with 'on'.
 
    Parameters
    ----------
    left : DataFrame or named Series
    right : DataFrame or named Series
    on : label
        Field name to join on. Must be found in both DataFrames.
        The data MUST be ordered. Furthermore this must be a numeric column,
        such as datetimelike, integer, or float. On or left_on/right_on
        must be given.
    left_on : label
        Field name to join on in left DataFrame.
    right_on : label
        Field name to join on in right DataFrame.
    left_index : bool
        Use the index of the left DataFrame as the join key.
    right_index : bool
        Use the index of the right DataFrame as the join key.
    by : column name or list of column names
        Match on these columns before performing merge operation.
    left_by : column name
        Field names to match on in the left DataFrame.
    right_by : column name
        Field names to match on in the right DataFrame.
    suffixes : 2-length sequence (tuple, list, ...)
        Suffix to apply to overlapping column names in the left and right
        side, respectively.
    tolerance : int or Timedelta, optional, default None
        Select asof tolerance within this range; must be compatible
        with the merge index.
    allow_exact_matches : bool, default True
 
        - If True, allow matching with the same 'on' value
          (i.e. less-than-or-equal-to / greater-than-or-equal-to)
        - If False, don't match the same 'on' value
          (i.e., strictly less-than / strictly greater-than).
 
    direction : 'backward' (default), 'forward', or 'nearest'
        Whether to search for prior, subsequent, or closest matches.
 
    Returns
    -------
    DataFrame
 
    See Also
    --------
    merge : Merge with a database-style join.
    merge_ordered : Merge with optional filling/interpolation.
 
    Examples
    --------
    >>> left = pd.DataFrame({"a": [1, 5, 10], "left_val": ["a", "b", "c"]})
    >>> left
        a left_val
    0   1        a
    1   5        b
    2  10        c
 
    >>> right = pd.DataFrame({"a": [1, 2, 3, 6, 7], "right_val": [1, 2, 3, 6, 7]})
    >>> right
       a  right_val
    0  1          1
    1  2          2
    2  3          3
    3  6          6
    4  7          7
 
    >>> pd.merge_asof(left, right, on="a")
        a left_val  right_val
    0   1        a          1
    1   5        b          3
    2  10        c          7
 
    >>> pd.merge_asof(left, right, on="a", allow_exact_matches=False)
        a left_val  right_val
    0   1        a        NaN
    1   5        b        3.0
    2  10        c        7.0
 
    >>> pd.merge_asof(left, right, on="a", direction="forward")
        a left_val  right_val
    0   1        a        1.0
    1   5        b        6.0
    2  10        c        NaN
 
    >>> pd.merge_asof(left, right, on="a", direction="nearest")
        a left_val  right_val
    0   1        a          1
    1   5        b          6
    2  10        c          7
 
    We can use indexed DataFrames as well.
 
    >>> left = pd.DataFrame({"left_val": ["a", "b", "c"]}, index=[1, 5, 10])
    >>> left
       left_val
    1         a
    5         b
    10        c
 
    >>> right = pd.DataFrame({"right_val": [1, 2, 3, 6, 7]}, index=[1, 2, 3, 6, 7])
    >>> right
       right_val
    1          1
    2          2
    3          3
    6          6
    7          7
 
    >>> pd.merge_asof(left, right, left_index=True, right_index=True)
       left_val  right_val
    1         a          1
    5         b          3
    10        c          7
 
    Here is a real-world times-series example
 
    >>> quotes = pd.DataFrame(
    ...     {
    ...         "time": [
    ...             pd.Timestamp("2016-05-25 13:30:00.023"),
    ...             pd.Timestamp("2016-05-25 13:30:00.023"),
    ...             pd.Timestamp("2016-05-25 13:30:00.030"),
    ...             pd.Timestamp("2016-05-25 13:30:00.041"),
    ...             pd.Timestamp("2016-05-25 13:30:00.048"),
    ...             pd.Timestamp("2016-05-25 13:30:00.049"),
    ...             pd.Timestamp("2016-05-25 13:30:00.072"),
    ...             pd.Timestamp("2016-05-25 13:30:00.075")
    ...         ],
    ...         "ticker": [
    ...                "GOOG",
    ...                "MSFT",
    ...                "MSFT",
    ...                "MSFT",
    ...                "GOOG",
    ...                "AAPL",
    ...                "GOOG",
    ...                "MSFT"
    ...            ],
    ...            "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],
    ...            "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03]
    ...     }
    ... )
    >>> quotes
                         time ticker     bid     ask
    0 2016-05-25 13:30:00.023   GOOG  720.50  720.93
    1 2016-05-25 13:30:00.023   MSFT   51.95   51.96
    2 2016-05-25 13:30:00.030   MSFT   51.97   51.98
    3 2016-05-25 13:30:00.041   MSFT   51.99   52.00
    4 2016-05-25 13:30:00.048   GOOG  720.50  720.93
    5 2016-05-25 13:30:00.049   AAPL   97.99   98.01
    6 2016-05-25 13:30:00.072   GOOG  720.50  720.88
    7 2016-05-25 13:30:00.075   MSFT   52.01   52.03
 
    >>> trades = pd.DataFrame(
    ...        {
    ...            "time": [
    ...                pd.Timestamp("2016-05-25 13:30:00.023"),
    ...                pd.Timestamp("2016-05-25 13:30:00.038"),
    ...                pd.Timestamp("2016-05-25 13:30:00.048"),
    ...                pd.Timestamp("2016-05-25 13:30:00.048"),
    ...                pd.Timestamp("2016-05-25 13:30:00.048")
    ...            ],
    ...            "ticker": ["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"],
    ...            "price": [51.95, 51.95, 720.77, 720.92, 98.0],
    ...            "quantity": [75, 155, 100, 100, 100]
    ...        }
    ...    )
    >>> trades
                         time ticker   price  quantity
    0 2016-05-25 13:30:00.023   MSFT   51.95        75
    1 2016-05-25 13:30:00.038   MSFT   51.95       155
    2 2016-05-25 13:30:00.048   GOOG  720.77       100
    3 2016-05-25 13:30:00.048   GOOG  720.92       100
    4 2016-05-25 13:30:00.048   AAPL   98.00       100
 
    By default we are taking the asof of the quotes
 
    >>> pd.merge_asof(trades, quotes, on="time", by="ticker")
                         time ticker   price  quantity     bid     ask
    0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
    1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
    2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
    3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
    4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN
 
    We only asof within 2ms between the quote time and the trade time
 
    >>> pd.merge_asof(
    ...     trades, quotes, on="time", by="ticker", tolerance=pd.Timedelta("2ms")
    ... )
                         time ticker   price  quantity     bid     ask
    0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
    1 2016-05-25 13:30:00.038   MSFT   51.95       155     NaN     NaN
    2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
    3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
    4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN
 
    We only asof within 10ms between the quote time and the trade time
    and we exclude exact matches on time. However *prior* data will
    propagate forward
 
    >>> pd.merge_asof(
    ...     trades,
    ...     quotes,
    ...     on="time",
    ...     by="ticker",
    ...     tolerance=pd.Timedelta("10ms"),
    ...     allow_exact_matches=False
    ... )
                         time ticker   price  quantity     bid     ask
    0 2016-05-25 13:30:00.023   MSFT   51.95        75     NaN     NaN
    1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
    2 2016-05-25 13:30:00.048   GOOG  720.77       100     NaN     NaN
    3 2016-05-25 13:30:00.048   GOOG  720.92       100     NaN     NaN
    4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN
    Úasof) rHrIrJrKrLr‰r¦r§rNrRÚ    toleranceÚallow_exact_matchesÚ    direction)Ú
_AsOfMergerW)rXrYrHrIrJrKrLr‰r¦r§rNr­r®r¯r\s               r]Ú
merge_asofr±¸sJ€ôv
Ø Ø Ø ØØØØØ ØØØØ ØØ/Øô
€Bð" =‰=‹?Ðr_cóH—eZdZUdZdZded<ded<ded<ded    <d
ed <d
ed <d
ed <ded<d
ed<ded<ded<ded<ded<ded<                                        d,                                                                                                    d-d„Z                        d.d„Zd/d„Ze                                            d0d„«Z
d1d2d„Z e    e d3d „««Z e                            d4d!„«Ze    d5d"„«Ze    d6d#„«Ze                                    d7d$„«Z        d8d%„Ze            d9d&„«Ze        d:                                    d;d'„«Ze            d<d(„«Ze    d=d)„«Zd*„Ze    d>d+„«Zy)?rVz
    Perform a database (SQL) merge operation between two DataFrame or Series
    objects using either columns as keys or their row indexes
    r^úJoinHow | Literal['asof']rRúIndexLabel | NonerHz!Sequence[Hashable | AnyArrayLike]rIrJÚboolrKrLrMrrNrQú
str | boolrOú
str | NonerPzlist[Hashable]Ú
join_namesúlist[ArrayLike]Úright_join_keysÚleft_join_keysNc ó2—t|«} t|«}| x|_|_|x|_|_||_t j|«|_|
|_    |    xs|dk(|_
||_ ||_ | |_ t|«stdt!|«›«‚t|«stdt!|«›«‚| j"j$|j"j$k7r<d| j"j$›d|j"j$›d}t'|«‚|j)||«\|_|_|j/«\|_|_|_}}|r |jj7|«|_|r |jj7|«|_|j9|j0|j2«|j;|j0«|j=«| |j?| «yy)NÚouterz/left_index parameter must be of type bool, not z0right_index parameter must be of type bool, not z0Not allowed to merge between different levels. (z levels on the left, z on the right)) rTrXÚ    orig_leftrYÚ
orig_rightrRÚcomÚmaybe_make_listrHrNrMrKrLrOr!r£ÚtyperoÚnlevelsrÚ_validate_left_right_onrIrJÚ_get_merge_keysr»rºr¸Ú_drop_labels_or_levelsÚ_maybe_require_matching_dtypesÚ_validate_toleranceÚ_maybe_coerce_merge_keysÚ_validate_validate_kwd)ÚselfrXrYrRrHrIrJrKrLrMrNrOrPÚ_leftÚ_rightÚmsgÚ    left_dropÚ
right_drops                  r]Ú__init__z_MergeOperation.__init__ásö€ô" $Ó'ˆÜ" 5Ó)ˆØ%*Ð*ˆŒ    D”NØ'-Ð-ˆŒ
T”_؈Œä×%Ñ% bÓ)ˆŒà ˆŒ ØÒ*˜C 7™NˆŒ    à$ˆŒØ&ˆÔà"ˆŒäzÔ"ÜØAÄ$ÀzÓBRÐASÐTóð ô{Ô#ÜØBÄ4È ÓCTÐBUÐVóð ð
=‰=×  Ñ   F§N¡N×$:Ñ$:Ò :ðØ—M‘M×)Ñ)Ð*Ð*?Ø—>‘>×)Ñ)Ð*¨.ð:ð ô
˜S“/Ð !à&*×&BÑ&BÀ7ÈHÓ&UÑ#ˆŒ d”mð ×  Ñ  Ó "ñ     
Ø Ô Ø Ô  Ø ŒOØ Ø ñ ØŸ    ™    ×8Ñ8¸ÓCˆDŒIá ØŸ™×:Ñ:¸:ÓFˆDŒJà ×+Ñ+¨D×,?Ñ,?À×AUÑAUÔVØ × Ñ  ×!4Ñ!4Ô5ð     ×%Ñ%Ô'ð
Ð Ø × 'Ñ '¨Õ 1ð  r_có—yrmrd)rËr»rºs   r]rÇz._MergeOperation._maybe_require_matching_dtypes/s€ð     r_có—yrmrd)rËr»s  r]rÈz#_MergeOperation._validate_tolerance5s€à r_c    ó|—|jdd}|jdd}t|jj|jj|j«\}}|Tt |t |««s?|jj||ddddd¬«}    |j|    |    j¬«}||_ |Tt |t |««s?|jj||ddddd¬«}
|j|
|
j¬«}||_ ddl m } ||_||_| ||gd|¬    «} | S)
z?
        reindex along index and concat along columns.
        NrbFT)rsrQÚ
only_sliceÚ
allow_dupsÚ use_na_proxy)Úaxesrrt)rsrQ)rXrYÚ_items_overlap_with_suffixÚ
_info_axisrNrr…Ú_mgrÚreindex_indexerÚ_constructor_from_mgrrØr†Úpandasruro) rËÚ
join_indexÚ left_indexerÚ right_indexerrQrXrYÚllabelsÚrlabelsÚlmgrÚrmgrrur•s              r]Ú_reindex_and_concatz#_MergeOperation._reindex_and_concat9sE€ðy‰y™ˆ|ˆØ—
‘
™1 ˆä5Ø I‰I×  Ñ   $§*¡*×"7Ñ"7¸¿¹ó
шð Ð #Ô,<¸\Ì3ÈtË9Ô,Uð—9‘9×,Ñ,ØØØØØØØ!ð-óˆDð×-Ñ-¨d¸¿¹Ð-ÓCˆD؈Œ
à Ð $Ô-=Ø œ3˜u›:ô.
ð—:‘:×-Ñ-ØØØØØØØ!ð.óˆDð×/Ñ/°¸4¿9¹9Ð/ÓEˆEØ ˆŒ å!àˆŒ ؈Œ Ù˜˜u˜ ¨A°DÔ9ˆØˆ r_có´—|jr3|j|j|j«\|_|_|j    «\}}}|j ||||¬«}|j ||j¬«}|jr|j|«}|j|||«|j|«|j |d¬«S)NrS)Úmethodr^) rOÚ_indicator_pre_mergerXrYÚ_get_join_inforæÚ __finalize__Ú _merge_typeÚ_indicator_post_mergeÚ_maybe_add_join_keysÚ_maybe_restore_index_levels)rËrQrßràrár•s      r]rWz_MergeOperation.get_resultrsÉ€Ø >Š>Ø$(×$=Ñ$=¸d¿i¹iÈÏÉÓ$TÑ !ˆDŒIt”zà26×2EÑ2EÓ2GÑ/ˆ
L -à×)Ñ)Ø ˜  m¸$ð*ó
ˆð×$Ñ$ T°$×2BÑ2BÐ$ÓCˆà >Š>Ø×/Ñ/°Ó7ˆFà ×!Ñ! &¨,¸ ÔFà ×(Ñ(¨Ô0à×"Ñ" 4°Ð"Ó8Ð8r_có¸—t|jt«r |jSt|jt«r|jrdSdSt    d«‚)NÚ_mergez<indicator option can only accept boolean or string arguments)rwrOr¤rµr£©rËs r]Ú_indicator_namez_MergeOperation._indicator_name†sK€ô d—n‘n¤cÔ *Ø—>‘>Ð !Ü ˜Ÿ™¬Ô -Ø#Ÿ~š~8Ð 7°4Ð 7äØNóð r_cóh—|jj|j«}dD]}||vsŒtd|›«‚|j|vr td«‚|j    «}|j    «}d|d<|dj d«|d<d|d<|dj d«|d<||fS)    N)Ú_left_indicatorÚ_right_indicatorzECannot use `indicator=True` option when data contains a column named z:Cannot use name of an existing column for indicator columnrbrõÚint8érö)roÚunionr£rórQÚastype)rËrXrYroÚis     r]réz$_MergeOperation._indicator_pre_merge’sހð—,‘,×$Ñ$ U§]¡]Ó3ˆà8ò    ˆAؐGŠ|Ü ð4Ø45°3ð8óðð    ð × Ñ  7Ñ *ÜØLóð ðy‰y‹{ˆØ—
‘
“ ˆà"#ˆÐ ÑØ"&Ð'8Ñ"9×"@Ñ"@ÀÓ"HˆÐ Ñà$%ˆÐ Ñ!Ø$)Ð*<Ñ$=×$DÑ$DÀVÓ$LˆÐ Ñ!àUˆ{Ðr_cóD—|djd«|d<|djd«|d<t|d|dzgd¢¬«||j<||jjj    gd¢«||j<|j ddgd¬«}|S)    Nrõrrö)rbrøé)Ú
categories)Ú    left_onlyÚ
right_onlyÚbothrb)Úlabelsrs)Úfillnar3róÚcatÚrename_categoriesÚdrop)rËr•s  r]ríz%_MergeOperation._indicator_post_merge®s»€à$*Ð+<Ñ$=×$DÑ$DÀQÓ$GˆÐ Ñ!Ø%+Ð,>Ñ%?×%FÑ%FÀqÓ%IˆÐ!Ñ"ä'2Ø Ð%Ñ &¨Ð0BÑ)CÑ CÚ ô(
ˆˆt×#Ñ#Ñ$ð(.Ø ×  Ñ  ñ(
ç
‰#×ÑÒ CÓDð    ˆt×#Ñ#Ñ$ð—‘Ð%6Ð8JÐ$KÐRSÓTˆØˆ r_cól—g}t|j|j|j«D]n\}}}|jj |«sŒ#|j j |«sŒ?||k(sŒE||jjvsŒ^|j|«Œp|r|j|d¬«yy)a
        Restore index levels specified as `on` parameters
 
        Here we check for cases where `self.left_on` and `self.right_on` pairs
        each reference an index level in their respective DataFrames. The
        joined columns corresponding to these pairs are then restored to the
        index of `result`.
 
        **Note:** This method has side effects. It modifies `result` in-place
 
        Parameters
        ----------
        result: DataFrame
            merge result
 
        Returns
        -------
        None
        T©ÚinplaceN) Úzipr¸rIrJr¾Ú_is_level_referencer¿r†Únamesr‡Ú    set_index)rËr•Únames_to_restoreÚnameÚleft_keyÚ    right_keys      r]rïz+_MergeOperation._maybe_restore_index_levels¾s«€ð*ÐÜ),Ø O‰O˜TŸ\™\¨4¯=©=ó*
ò    .Ñ %ˆD(˜Ið—‘×2Ñ2°8Õ<ð—O‘O×7Ñ7Øõð     Ó)Ø § ¡ × 2Ñ 2Ò2à ×'Ñ'¨Õ-ð#    .ñ& Ø × Ñ Ð-°tÐ Õ <ð r_có€—d}d}td„|jD««sJ‚t|j|j|j
«}t |«D]Ý\}\}}    }
t|    |
«sŒd\} } ||vrû|€|||jvrm|€|€dn|dk(j«}|rë|j|} ||j|j|jk7r³|j|j} n™||jvr‹|€|€dn|dk(j«}|rp|j|} ||j|j|jk7r8|j|j} n|j|} |j|} | €| €Œ@| €||j} n?|€| } n:t| d¬«} t| j«}t!j"| ||¬«} | €||j}n?|€| }n:t| d¬«}t|j«}t!j"|||¬«}|8|dk(j«r%t%||jd¬«}|j}nÚ|8|dk(j«r%t%| | jd¬«}| j}n t%| | jd¬«}||dk(}|j'||«}t)| j|jg«}| jj*d    k(r4|jj*d    k(r|j*d
k(r |j}|j-|«r#|j/|||j0¬ «||<Œ*|j3|«r‰t5|j0t6«r_||_|j0j:Dcgc]$}||k7r|j0j=|«n|‘Œ&}}|j?|d¬ «Œ´||_||_ŒÄ|jA||xsd |›|«Œàycc}w)Nc3ó<K—|]}t|t«–—Œy­wrm)rwÚ_known©rpr›s  r]rrz7_MergeOperation._maybe_add_join_keys.<locals>.<genexpr>ôsèø€ÒF¨Q”:˜a¤×(ÑFùs‚)NNFéÿÿÿÿT©Ú extract_numpy©Ú
fill_value©ÚdtyperQÚMÚO)rr†rÚkey_)!rzr»r
r¸rIrJÚ    enumerateÚ _should_fillrXÚanyrºrÚ_valuesrYr<r1ÚalgosÚtake_ndr4ÚwhererÚkindÚ_is_label_referenceÚ_constructor_slicedr†r rwr5rr Úget_level_valuesr Úinsert)rËr•ràráÚleft_has_missingÚright_has_missingÚkeysrûrÚlnameÚrnameÚ    take_leftÚ
take_rightÚlvalsÚlfillÚrvalsÚtakerÚrfillÚkey_colÚ result_dtypeÚ    mask_leftÚ
level_nameÚidx_lists                       r]rîz$_MergeOperation._maybe_add_join_keysês)€ð ÐØ ÐäÑF°$×2EÑ2EÔFÔFÐFÐFä4—?‘? D§L¡L°$·-±-Ó@ˆÜ'0°£óg    BÑ #ˆAÑ#e˜UÜ  uÔ-Øà$.Ñ !ˆIzàv‰~ØÐ+¨}Ñ/HؘtŸy™yÑ(Ø+Ð3ð$0Ð#7ñ!&à&2°bÑ&8×%=Ñ%=Ó%?ð-ñ ,Ø)-×)=Ñ)=¸aÑ)@˜Jà% d™|×1Ñ1°T·Y±Y¸t±_×5JÑ5JÒJØ,0¯I©I°d©O×,CÑ,C¡    à §¡Ñ+Ø,Ð4ð$1Ð#8ñ!&à&3°rÑ&9×%>Ñ%>Ó%@ð.ñ -Ø(,×(;Ñ(;¸AÑ(>˜Ià% d™|×1Ñ1°T·Z±ZÀÑ5E×5KÑ5KÒKØ-1¯Z©Z¸Ñ-=×-EÑ-E¡
ð!×/Ñ/°Ñ2    Ø!×1Ñ1°!Ñ4
àÐ$¨
Ò(>ØÐ$Ø" 4™L×0Ñ0‘EØ!Ð)Ø%‘Eô!.¨iÀtÔ LIÜ.¨y¯©Ó?EÜ!ŸM™M¨)°\ÈeÔTEàÐ%Ø" 4™L×0Ñ0‘EØ"Ð*Ø&‘Eô*¨*ÀDÔIEÜ.¨u¯{©{Ó;EÜ!ŸM™M¨%°È5ÔQEð Ð+°ÀÑ1C×0HÑ0HÔ0JÜ# E°·±À5ÔIGØ#(§;¡;‘LØ"Ð.°MÀRÑ4G×3LÑ3LÔ3NÜ# E°·±À5ÔIGØ#(§;¡;‘Lä# E°·±À5ÔIGØ#Ð/Ø$0°BÑ$6˜    Ø")§-¡-°°
¸EÓ"B˜Ü#3°U·[±[À%Ç+Á+Ð4NÓ#OLàŸ ™ ×(Ñ(¨CÒ/Ø!ŸK™K×,Ñ,°Ò3Ø(×-Ñ-°Ò4ð(/§}¡}˜ à×-Ñ-¨dÔ3Ø#)×#=Ñ#=Ø |¸6¿<¹<ð$>ó$F˜4“Lð×/Ñ/°Ô5Ü! &§,¡,´
Ô;Ø'+˜œ ð
/5¯l©l×.@Ñ.@ö    $ð!+ð *¨TÒ1ð#ŸL™L×9Ñ9¸*ÔEà!(ñ)ð$˜ð$ð×(Ñ(¨¸4Ð(Ö@à'+˜œ Ø'.˜ž à—M‘M ! TÒ%7¨t°A°3¨Z¸ÖAñOg    Bùòv$sÏ )P;có’—|jdk7sJ‚t|j|j|j|j¬«S)úreturn the join indexersr¬)rMrR)rRÚget_join_indexersr»rºrMròs r]Ú_get_join_indexersz"_MergeOperation._get_join_indexers`s@€ð
x‰x˜6Ò!Ð!Ð!Ü Ø × Ñ  ×!5Ñ!5¸D¿I¹IÈ4Ï8É8ô
ð    
r_cóR—|jj}|jj}|jrJ|jr>|j
dk7r/|j ||j
d|j¬«\}}}n¡|jr8|j
dk(r)t|||j|j¬«\}}}n]|jr8|j
dk(r)t|||j|j¬«\}}}n|j«\}}|jrSt|j«dkDr|j|||d¬«}nÌ|€|j«}n¹|j|«}n§|jrx|j
dk(r|j|||d¬«}nvt|j«dkDr|j|||d¬«}nH|€|j«}n5|j|«}n#|€ t|«n
t|«}t!|«}|||fS)    Nr¬T©rRÚreturn_indexersrMrXrkrYr©rR)rXr†rYrKrLrRr rMÚ_left_join_on_indexr»rºr@r…Ú_create_join_indexrQr~r>)rËÚleft_axÚright_axrßràráÚns       r]rêz_MergeOperation._get_join_infojsü€ð—)‘)—/‘/ˆØ—:‘:×#Ñ#ˆà ?Š?˜t×/Ò/°D·H±HÀÒ4FØ6=·l±lؘdŸh™h¸À4Ç9Á9ð7Có7Ñ 3ˆJ˜ ¢mð× Ò  $§(¡(¨fÒ"4Ü6Iؘ 4×#6Ñ#6¸T¿Y¹Yô7Ñ 3ˆJ˜ ¢mð_Š_ §¡¨WÒ!4Ü6Iؘ' 4×#7Ñ#7¸d¿i¹iô7Ñ 3ˆJ˜ ¢|ð-1×,CÑ,CÓ,EÑ )ˆ\˜=à×Òܐt—y‘y“> AÒ%Ø!%×!8Ñ!8ØØ Ø$Ø#ð    "9ó"‘Jð #Ð*Ø!)§¡£‘Jà!)§¡¨}Ó!=‘JØ—’Ø—8‘8˜vÒ%à!%×!8Ñ!8ØØ Ø$Ø"ð    "9ó"‘Jô˜Ÿ™“_ qÒ(Ø!%×!8Ñ!8Ø ØØ%Ø"ð    "9ó"‘Jð "Ð)Ø!(§¡£‘Jà!(§¡¨lÓ!;‘Jà$0Ð$8”C˜”L¼cÀ,Ó>OÜ*¨1Ó-
à˜<¨Ð6Ð6r_có —|j|dfvr\t|t«sL|dk(}tj|«r2t |j d¬«}|jt|g««}|€|j«S|j|«S)aÝ
        Create a join index by rearranging one index to match another
 
        Parameters
        ----------
        index : Index
            index being rearranged
        other_index : Index
            used to supply values not found in index
        indexer : np.ndarray[np.intp] or None
            how to rearrange index
        how : str
            Replacement is only necessary if indexer based on other_index.
 
        Returns
        -------
        Index
        r½rF)Úcompat) rRrwr5Únpr"r1rr‡r4rQr~)rËr†Ú other_indexÚindexerrRÚmaskrs       r]rFz"_MergeOperation._create_join_index©sx€ð4 8‰8˜˜W~Ñ %¬j¸ÄjÔ.Qð ˜b‘=ˆD܏v‰vdŒ|Ü/°· ± ÀEÔJ
ØŸ ™ ¤U¨J¨<Ó%8Ó9Ø ˆ?Ø—:‘:“<Р؏z‰z˜'Ó"Ð"r_cóN ‡ ‡—g}g}g}g}g}|j|jcŠ Šˆ fd„}ˆfd„}t|j«ryt|j«rct |j|j«D]=\}}    t |d¬«}t |    d¬«}    ||«rìtt|«}|j|«||    «r3tt|    «}    |j|    «|jd«Œ…tt|    «}    |    2|j‰j|    ««|j|    «ŒÉ|j‰jj«|j‰jj«Œ||    «sqtt|    «}    |    !|j‰j|    ««n%|j‰jj«|8||    k(r3|j|    «n!tt|    «}    |j|    «|Ctt|«}|j‰ j|««|j|«Œô|j‰ jj«|j‰ jj«Œ@nÕt|j«rV|jD]‹}
||
«r@t |
d¬«}
tt|
«}
|j|
«|jd«ŒKtt|
«}
|j‰ j|
««|j|
«Œt|jjt «rut |jjj"|jjj$«D  cgc] \} } | jj'| «‘Œ"}} } nŒ|jjjg}nit|j«rS|jD]‹}
t |
d¬«}
||
«r3tt|
«}
|j|
«|jd«ŒKtt|
«}
|j‰j|
««|j|
«Œt|jjt «rtt |jjj"|jjj$«D  cgc] \} } | jj'| «‘Œ"}} } n!|jjjg}|||||fScc} } wcc} } w)zj
        Returns
        -------
        left_keys, right_keys, join_names, left_drop, right_drop
        cóV•—t|t«xrt|«t‰«k(Srm©rwrr…)r›rXs €r]r z1_MergeOperation._get_merge_keys.<locals>.<lambda>ès ø€œJ q¬&Ó1ÒI´c¸!³fÄÀDà   Ñ6I€r_cóV•—t|t«xrt|«t‰«k(SrmrR)r›rYs €r]r z1_MergeOperation._get_merge_keys.<locals>.<lambda>és ø€œJ q¬&Ó1ÒJ´c¸!³fÄÀEÃ
Ñ6J€r_TrN)rXrYÚ_anyrIrJr
r<r    rr‡rÚ_get_label_or_level_valuesr†r#rrwr5ÚlevelsÚcodesr~)rËÚ    left_keysÚ
right_keysr¸rÐrÏÚis_lkeyÚis_rkeyÚlkÚrkÚkÚlevÚ    lev_codesrXrYs             @@r]rÅz_MergeOperation._get_merge_keysÑsù€ð&(ˆ    Ø&(ˆ
Ø%'ˆ
Ø%'ˆ
Ø$&ˆ    à—i‘i §¡ˆ ˆˆeãIˆÛJˆô — ‘ Õ ¤$ t§}¡}Õ"5ܘdŸl™l¨D¯M©MÓ:ó- ;‘BÜ" 2°TÔ:Ü" 2°TÔ:Ù˜2”;Üœi¨Ó,BØ×$Ñ$ RÔ(Ù˜r”{Ü!¤)¨RÓ0˜Ø"×)Ñ)¨"Ô-Ø"×)Ñ)¨$Õ/ô"¤(¨BÓ/˜Ø˜>Ø&×-Ñ-¨e×.NÑ.NÈrÓ.RÔSØ&×-Ñ-¨bÕ1ð'×-Ñ-¨e¯k©k×.AÑ.AÔBØ&×-Ñ-¨e¯k©k×.>Ñ.>Ö?á" 2œ;ô"¤(¨BÓ/˜Ø˜>Ø&×-Ñ-¨e×.NÑ.NÈrÓ.RÕSð'×-Ñ-¨e¯k©k×.AÑ.AÔBؘ>¨b°BªhØ&×-Ñ-¨bÕ1ä!¤)¨RÓ0˜Ø"×)Ñ)¨"Ô-ؐ~ô"¤(¨BÓ/˜Ø!×(Ñ(¨×)HÑ)HÈÓ)LÔMØ"×)Ñ)¨"Ö-ð"×(Ñ(¨¯©×);Ñ);Ô<Ø"×)Ñ)¨$¯*©*¯/©/Ö:ò[- ;ô\$—,‘,Õ Ø—\‘\ò )Ù˜1”:Ü% a°tÔ<AÜœY¨Ó*AØ×$Ñ$ QÔ'Ø×%Ñ% dÕ+ôœX qÓ)AØ×$Ñ$ T×%DÑ%DÀQÓ%GÔHØ×%Ñ% aÕ(ð )ô˜$Ÿ*™*×*Ñ*¬JÔ7ô+.ØŸ
™
×(Ñ(×/Ñ/°·±×1AÑ1A×1GÑ1Gó+÷á&˜˜Yð—K‘K×$Ñ$ YÕ/ð
óð#Ÿj™j×.Ñ.×6Ñ6Ð7’
Ü $—-‘-Õ  Ø—]‘]ò )Ü! !°4Ô8Ù˜1”:ÜœY¨Ó*AØ×%Ñ% aÔ(Ø×%Ñ% dÕ+ôœX qÓ)AØ×%Ñ% e×&FÑ&FÀqÓ&IÔJØ×%Ñ% aÕ(ð )ô˜$Ÿ)™)Ÿ/™/¬:Ô6ô+.ØŸ    ™    Ÿ™×.Ñ.°·    ±    ·±×0EÑ0Eó+÷á&˜˜Yð—K‘K×$Ñ$ YÕ/𐠠  òð"ŸY™YŸ_™_×4Ñ4Ð5    à˜* j°)¸ZÐGÐGùó?ùó,s Ï%VÕ
%V!có
—t|j|j|j«D]:\}}}t    |«r t    |«rt    |«s t    |«rŒ5t |d¬«}t |d¬«}t |jt«}t |jt«}t|j«xst|j«}t|j«xst|j«}|r5|r3tt|«}tt|«}|j|«r"Œ|s|rn|j|jk(rŒ2d|j›d|j›d|›d}t|j«rt|j«rî|jj|jjk(rŒ­t |jt «r‚t |jt «sht#|j|jg«}    t |    t «r%|    j%«}
|
j'||    d¬«}n“|j)|    «}nt |jt «rgt#|j|jg«}    t |    t «r%|    j%«}
|
j'||    d¬«}n|j)|    «}t+|j«r£t-|j«rŽt/j0d    ¬
«5|j)|j«} ddd«t/j2|«} | k(} | | j5«s$t7j8d t:t=«¬ «Œ‚t-|j«r£t+|j«rŽt/j0d    ¬
«5|j)|j«} ddd«t/j2|«} | k(} | | j5«s$t7j8d t:t=«¬ «Œ:t?j@|d¬ «t?j@|d¬ «k(r³Œl|rtC|j«stC|j«r|rn|rt|j«st|j«r_|r]t?j@|d¬ «}t?j@|d¬ «}gd¢}gd¢}||vr||vrn||vr||vs
||vr||vrtE|«‚tG|j«r tG|j«s tE|«‚tG|j«s tG|j«r tE|«‚t |jtH«r%t |jtH«s tE|«‚t |jtH«s%t |jtH«r tE|«‚t |jtH«rt |jtH«s2|jjdk(r|jjdk(rŒw|jjdk(r$|jjdk(r tE|«‚|jjdk(r$|jjdk(r tE|«‚t|j«rt|j«rŒ||jJjLvrv|r$tt|«jNjntP}|jJjS«|_%|jJ|j)|«|jJ|<||jTjLvsŒÅ|r$tt|«jNjntP}|jTjS«|_*|jT|j)|«|jT|<Œ=y#1swYŒxYw#1swYŒpxYw)NTrzYou are trying to merge on ú and z columns for key 'z2'. If you wish to proceed you should use pd.concatFrÚignore)ÚinvalidzjYou are merging on int and float columns where the float values are not equal to their int representation.)Ú
stacklevel)Úskipna)Úintegerz mixed-integerÚbooleanÚempty)ÚstringÚunicodeÚmixedÚbytesrirÚm)+r
r»rºr¸r…r<rwrr,r)r*r    r3Ú#_categories_match_up_to_permutationr(r'rrÚconstruct_array_typeÚ_from_sequencerúr%r#rLÚerrstateÚisnanrzÚwarningsÚwarnÚ UserWarningrrÚ infer_dtyper"r£r+r-rXrorþÚobjectrQrY)rËr\r]rÚ    lk_is_catÚ    rk_is_catÚlk_is_object_or_stringÚrk_is_object_or_stringrÎÚctÚcom_clsÚcastedrOÚmatchÚ inferred_leftÚinferred_rightÚ
bool_typesÚ string_typesÚtyps                   r]rÉz(_MergeOperation._maybe_coerce_merge_keysTsm€ô Ø × Ñ  ×!5Ñ!5°t·±ó
óu    @‰LˆBDôB”¤ B¤´°R´¼SÀ¼WØä˜r°Ô6ˆBܘr°Ô6ˆBä" 2§8¡8Ô-=Ó>ˆIÜ" 2§8¡8Ô-=Ó>ˆIÜ%4°R·X±XÓ%>ò&Ä/Ø—‘óCÐ "ô&5°R·X±XÓ%>ò&Ä/Ø—‘óCÐ "ñ ™YÜœ+ rÓ*Üœ+ rÓ*Ø×9Ñ9¸"Ô=Ùá™iØà—‘˜RŸX™XÒ%Ùð.¨b¯h©h¨Z°u¸R¿X¹X¸JðGØ ˜6Ð!SðUð ô  §¡Õ)Ô.>¸r¿x¹xÕ.HØ—8‘8—=‘= B§H¡H§M¡MÒ1Ùä˜bŸh™h¬Ô7Ä
Ø—H‘HœnôAô*¨2¯8©8°R·X±XÐ*>Ó?BÜ! "¤nÔ5Ø"$×"9Ñ"9Ó";˜Ø$×3Ñ3°B¸bÀuÐ3ÓM™àŸY™Y r›]™Ü §¡¬.Ô9Ü)¨2¯8©8°R·X±XÐ*>Ó?BÜ! "¤nÔ5Ø"$×"9Ñ"9Ó";˜Ø$×3Ñ3°B¸bÀuÐ3ÓM™àŸY™Y r›]˜ô$ B§H¡HÔ-´.ÀÇÁÔ2J䟙¨XÔ6ñ5ð"$§¡¨2¯8©8Ó!4˜÷    5ô ŸH™H R›L˜=DØ &™LEØ  ™;Ÿ?™?Ô,Ü Ÿ ™ ðIô(Ü'7Ó'9õ ñä! "§(¡(Ô+Ô0@ÀÇÁÔ0J䟙¨XÔ6ñ5ð"$§¡¨2¯8©8Ó!4˜÷    5ô ŸH™H R›L˜=DØ &™LEØ  ™;Ÿ?™?Ô,Ü Ÿ ™ ðIô(Ü'7Ó'9õ ñô—?‘? 2¨eÔ4¼¿¹Ø˜uô9óññ )¬]¸2¿8¹8Ô-DܘbŸh™hÔ'Ñ,Báñ)Ô-=¸b¿h¹hÔ-GÜ  §¡Ô*Ñ/Eä #§¡°¸5Ô A Ü!$§¡°¸EÔ!BÚM
ÚO ð! JÑ.°>ÀZÑ3OÙð" \Ñ1°nÈLÑ6Xà" lÒ2°}ÈLÒ7Xä$ S›/Ð)ô% R§X¡XÔ.Ô7JÈ2Ï8É8Ô7TÜ  “oÐ%Ü(¨¯©Ô2Ô7JÈ2Ï8É8Ô7TÜ  “oÐ%ܘBŸH™H¤oÔ6¼zØ—‘œ/ô@ô! “oÐ%Ü §¡¬/Ô:¼zØ—‘œ/ô@ô! “oÐ%ä˜2Ÿ8™8¤_Ô5ܘrŸx™x¬Ô9Ø—(‘(—-‘- 3Ò&¨2¯8©8¯=©=¸CÒ+?áà—‘—‘ #Ò%¨"¯(©(¯-©-¸3Ò*>Ü  “oÐ%Ø—‘—‘ #Ò%¨"¯(©(¯-©-¸3Ò*>Ü  “oÐ%ä  §¡Ô*¬¸r¿x¹xÔ/HÙðt—y‘y×(Ñ(Ñ(Ù@I”dœ;¨Ó+×6Ñ6×<Ò<ÌvØ ŸI™IŸN™NÓ,”    Ø"&§)¡)¨D¡/×"8Ñ"8¸Ó"=—    ‘    ˜$‘ؐt—z‘z×)Ñ)Ó)Ù@I”dœ;¨Ó+×6Ñ6×<Ò<ÌvØ!ŸZ™ZŸ_™_Ó.”
Ø#'§:¡:¨dÑ#3×#:Ñ#:¸3Ó#?—
‘
˜4Ó ñku    @÷B5ñ5ú÷(5ñ5úsÌ6a+Ï.a8á+a5    á8b    c
ó²—tj|«}tj|«}|j€ |€|€|jr|jrd\}}nV|jr t d«‚|jr t d«‚|j j}|jj}|j|«}t|«dk(r+t d|›d|›d|j›d|j›«‚|j|d    ¬
«jr|j|d    ¬
«jst d t|«›«‚|x}}n[|jB|€| t d «‚|js |jr t d «‚|jx}}n |…|jr t d«‚|js |€ t d«‚t|«}|jrÄt|«|jjjk7r t!d«‚dg|z}n†|„|jr t d«‚|js |€ t d«‚t|«}|jr=t|«|j jjk7r t!d«‚dg|z}t|«t|«k7r t!d«‚||fS)N)rdrdz&Must pass right_on or right_index=Truez$Must pass left_on or left_index=Truerz>No common columns to perform merge on. Merge options: left_on=z , right_on=z , left_index=z, right_index=rcrDzData columns not unique: zSCan only pass argument "on" OR "left_on" and "right_on", not a combination of both.zYCan only pass argument "on" OR "left_index" and "right_index", not a combination of both.z:Can only pass argument "left_on" OR "left_index" not both.z&Must pass "right_on" OR "right_index".zDlen(left_on) must equal the number of levels in the index of "right"z<Can only pass argument "right_on" OR "right_index" not both.z$Must pass "left_on" OR "left_index".zDlen(right_on) must equal the number of levels in the index of "left"z%len(right_on) must equal len(left_on))rÀrÁrHrKrLrrXrorYÚ intersectionr…r Ú    is_uniqueÚreprr†rÃr£)rËrIrJÚ    left_colsÚ
right_colsÚ common_colsrIs       r]rÄz'_MergeOperation._validate_left_right_onsÕ€Ü×%Ñ% gÓ.ˆÜ×&Ñ& xÓ0ˆð 7‰7‰?˜w™°8Ñ3CØŠ 4×#3Ò#3Ø$*Ñ!šØ—’Ü Ð!IÓJÐJØ×!Ò!Ü Ð!GÓHÐHð!ŸI™I×-Ñ-    Ø!ŸZ™Z×/Ñ/
Ø'×4Ñ4°ZÓ@ ܐ{Ó# qÒ(Ü$ð2Ø29°ð;$Ø$, :ð.&Ø&*§o¡oÐ%6ð7'Ø'+×'7Ñ'7Ð&8ð    :óðð"Ÿ™ {¸˜Ó@×JÒJØ%Ÿ?™?¨;¸G˜?ÓD×NÒNä$Ð'@ÄÀkÓARÐ@SÐ%TÓUÐUØ%0Ð0š(Ø W‰WÐ  ØÐ" hÐ&:Ü ðAóððŠ $×"2Ò"2Ü ðDóðð"&§¡Ð (ˆG’hØ Ð  ØŠÜ ØPóðð×#Ò#¨Ð(8Ü Ð!IÓJÐJܐG“ ˆAØ×Òܐw“< 4§:¡:×#3Ñ#3×#;Ñ#;Ò;Ü$ð<óðð!˜6 A™:‘Ø Ð !Ø×ÒÜ ØRóðð—?’? w Ü Ð!GÓHÐHܐH“ ˆA؏ŠÜx“= D§I¡I§O¡O×$;Ñ$;Ò;Ü$ð;óðð ˜& 1™*Ü ˆx‹=œC ›LÒ (ÜÐDÓEÐ Eà˜Ð Ð r_có&—|jr!|jjj}n)t    j
|j «j}|jr!|jjj}n)t    j
|j«j}|dvr*|s |s td«‚|s td«‚|s td«‚y|dvr|s td«‚y|dvr|s td«‚y|d    vrytd
|›d «‚) N)Ú
one_to_onez1:1zQMerge keys are not unique in either left or right dataset; not a one-to-one mergezAMerge keys are not unique in left dataset; not a one-to-one mergezBMerge keys are not unique in right dataset; not a one-to-one merge)Ú one_to_manyz1:mzBMerge keys are not unique in left dataset; not a one-to-many merge)Ú many_to_onezm:1zCMerge keys are not unique in right dataset; not a many-to-one merge)Ú many_to_manyzm:mú"z" is not a valid argument. Valid arguments are:
- "1:1"
- "1:m"
- "m:1"
- "m:m"
- "one_to_one"
- "one_to_many"
- "many_to_one"
- "many_to_many") rKr¾r†rˆr5Ú from_arraysr»rLr¿rºrr£)rËrPÚ left_uniqueÚ right_uniques    r]rÊz&_MergeOperation._validate_validate_kwdas=€ð ?Š?ØŸ.™.×.Ñ.×8Ñ8‰Kä$×0Ñ0°×1DÑ1DÓE×OÑOˆKà × Ò ØŸ?™?×0Ñ0×:Ñ:‰Lä%×1Ñ1°$×2FÑ2FÓG×QÑQˆLð Ð,Ñ ,Ù¡|Ü ð?óðñÜ ØWóðñ Ü ØXóðð ð
Ð/Ñ /ÙÜ ØXóððð
Ð/Ñ /ÙÜ ð.óðð ð Ð0Ñ 0Ø ôؐH:ð    #ð    #ó ð r_)
rcNNNFFT©Ú_xÚ_yFN)rXúDataFrame | SeriesrYr™rRr³rHú IndexLabel | AnyArrayLike | NonerIršrJršrKrµrLrµrMrµrNrrOr¶rPr·r¢ÚNone©r»r¹rºr¹r¢r›©r»r¹r¢r›)
rßr4ràúnpt.NDArray[np.intp] | NoneráržrQú bool | Noner¢rA©T©rQrŸr¢rA)r¢r·)rXrArYrAr¢ztuple[DataFrame, DataFrame])r•rAr¢rA)r•rAr¢r›)r•rAràržráržr¢r›)r¢ú?tuple[npt.NDArray[np.intp] | None, npt.NDArray[np.intp] | None])r¢zFtuple[Index, npt.NDArray[np.intp] | None, npt.NDArray[np.intp] | None])rX)
r†r4rMr4rNržrRrr¢r4)r¢zWtuple[list[ArrayLike], list[ArrayLike], list[Hashable], list[Hashable], list[Hashable]])r¢r›)rPr¤r¢r›)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rìÚ__annotations__rÑrÇrÈr
rærWrrórérírïrîr@rêrFrÅrÉrÄrÊrdr_r]rVrVÉs…ñð
€KØ    "Ó"ØÓð/Ó.Ø/Ó/ØÓØÓØ
ƒJØÓØ
ƒJØÓØÓØÓØ$Ó$Ø#Ó#ð *1Ø/3Ø48Ø59Ø Ø!ØØ)Ø %Ø#ðL2à ðL2ð"ðL2ð'ð    L2ð
-ð L2ð 2ð L2ð3ðL2ððL2ððL2ððL2ððL2ððL2ððL2ð
óL2ð\ Ø-ð Ø@Oð à     ó ó  ð ð6àð6ð2ð6ð3ð    6ð
ð 6ð
ò 6ó ð6ôp9ð( Øòóó ðð ðØðØ&/ðà    $òó ðð6 ò ó ð ð ò)=ó ð)=ðV ðsBàðsBð2ðsBð3ð    sBð
 
ò sBó ðsBðj
à    Hó
ð ð<7à    Oò<7ó ð<7ð| ð ð %#àð%#ðð%#ð-ð    %#ð
ð %#ð
ò %#ó ð%#ðN ð@Hð
ò@Hó ð@HðD ò|@ó ð|@ò|L!ð\ ò8ó ñ8r_rVcóT‡‡‡—t‰«t‰«k(sJd«‚t‰d«}t‰d«}|dk(r |dvr
t«S‰s5|dvr1t|d«S|dk(r |dvr
t«S‰s|dvr t|d«St‰«d    kDrOˆˆˆfd
„tt‰««D«}t    |Ž}d „|D«\}}    }
t ||    t |
«‰«\} } n
‰d} ‰d} t| «} t| «}| jr>|jr2| js |jr| j||d‰¬ «\}}}n%t| j|j‰|«\}}|t|t| ««rd }|t|t|««rd }||fS)aŸ
 
    Parameters
    ----------
    left_keys : list[ndarray, ExtensionArray, Index, Series]
    right_keys : list[ndarray, ExtensionArray, Index, Series]
    sort : bool, default False
    how : {'inner', 'outer', 'left', 'right'}, default 'inner'
 
    Returns
    -------
    np.ndarray[np.intp] or None
        Indexer into the left_keys.
    np.ndarray[np.intp] or None
        Indexer into the right_keys.
    z0left_keys and right_keys must be the same lengthr)rXrc)rYr½T)rYrc)rXr½Frbc3óF•K—|]}t‰|‰|‰¬«–—Œy­w©rkN)Ú_factorize_keys)rprIrXrYrMs  €€€r]rrz$get_join_indexers.<locals>.<genexpr>És-øèø€ò
àô ˜I a™L¨*°Q©-¸d× CÐ Cñ
ùsƒ!c3ó2K—|]}t|«–—Œy­wrm©rxrs  r]rrz$get_join_indexers.<locals>.<genexpr>Îóèø€Ò5¨œT !ŸWÑ5ùó‚rBN)r…Ú_get_empty_indexerÚ _get_no_sort_one_missing_indexerr„r
Ú_get_join_keysryr4Úis_monotonic_increasingrˆr Úget_join_indexers_non_uniquer#r)rXrYrMrRÚleft_nÚright_nÚmappedÚzippedÚllabÚrlabÚshapeÚlkeyÚrkeyrXrYr©ÚlidxÚridxs```               r]r?r?sÇú€ô, ˆy‹>œSØóò ð:à9ó:ð ô
˜1‘Ó €Fܐ*˜Q‘-Ó €GØ ‚{Ø Ð#Ñ #Ü%Ó'Ð 'Ù˜#Ð!3Ñ3Ü3°G¸TÓBÐ BØ    AŠØ Ð$Ñ $Ü%Ó'Ð 'Ù˜#Ð!2Ñ2Ü3°F¸EÓBÐ Bô ˆ9ƒ~˜Òõ
äœ3˜y›>Ó*ô
ˆôfˆÙ5¨fÔ5шˆdEô$ D¨$´°e³ ¸dÓC‰
ˆ‰dà˜‰|ˆØ˜!‰}ˆä ‹;€DÜ $‹K€Eð     ×$Ò$Ø × )Ò )Ø ^Š^˜uŸšàŸ    ™     %¨SÀ$ÈT˜    ÓR‰ ˆˆ4‘ä1Ø L‰L˜%Ÿ-™-¨¨só
‰
ˆˆdð ÐÔ,¨T´3°t³9Ô=ØˆØ ÐÔ,¨T´3°u³:Ô>ØˆØ ˆ:Ðr_cóJ—t|||¬«\}}}|dk(r tj||||¬«\}}||fS|dk(r tj||||¬«\}}||fS|dk(r tj||||¬«\}}||fS|dk(rtj|||«\}}fS)aW
    Get join indexers for left and right.
 
    Parameters
    ----------
    left : ArrayLike
    right : ArrayLike
    sort : bool, default False
    how : {'inner', 'outer', 'left', 'right'}, default 'inner'
 
    Returns
    -------
    np.ndarray[np.intp]
        Indexer into left.
    np.ndarray[np.intp]
        Indexer into right.
    rkrXrYrcr½)r«ÚlibjoinÚleft_outer_joinÚ
inner_joinÚfull_outer_join)    rXrYrMrRr¼r½Úcountr¾r¿s             r]r´r´ësπô.(¨¨e¸$Ô?Ñ€Dˆ$Ø
ˆf‚}Ü×,Ñ,¨T°4¸ÀTÔJ‰
ˆˆd𠐈:Ðð
ŠÜ×,Ñ,¨T°4¸ÀTÔJ‰
ˆˆdð
ˆ:Ðð    
ŠÜ×'Ñ'¨¨d°EÀÔE‰
ˆˆd𠐈:Ðð
ŠÜ×,Ñ,¨T°4¸Ó?‰
ˆˆdØ ˆ:Ðr_cóx—dd„}||«}|j}|j}|j}    |D]}
|
|jvr|} |} n|} |} | jj|
«} | j| }| j| }| €|}nt    j
|| d¬«}||gz}||gz}|    |
gz}    Œƒ|||    fS)aø
    *this is an internal non-public method*
 
    Returns the levels, labels and names of a multi-index to multi-index join.
    Depending on the type of join, this method restores the appropriate
    dropped levels of the joined multi-index.
    The method relies on lindexer, rindexer which hold the index positions of
    left and right, where a join was feasible
 
    Parameters
    ----------
    left : MultiIndex
        left index
    right : MultiIndex
        right index
    dropped_level_names : str array
        list of non-common level names
    join_index : Index
        the index of the join between the
        common levels of left and right
    lindexer : np.ndarray[np.intp]
        left indexer
    rindexer : np.ndarray[np.intp]
        right indexer
 
    Returns
    -------
    levels : list of Index
        levels of combined multiindexes
    labels : np.ndarray[np.intp]
        labels of combined multiindexes
    names : List[Hashable]
        names of combined multiindex levels
 
    có€—t|t«r|Stj|jg|jg¬«S)N)r )rwr5r“r#r)r†s r]Ú_convert_to_multiindexz@restore_dropped_levels_multijoin.<locals>._convert_to_multiindex:s0€Ü eœZÔ (؈Lä×)Ñ)¨5¯=©=¨/À%Ç*Á*ÀÔNÐ Nr_rr)r†r4r¢r5)rVrWr r†r$r%)rXrYÚdropped_level_namesrßÚlindexerÚrindexerrÈÚ join_levelsÚ
join_codesr¸Údropped_level_nameÚidxrNÚname_idxÚrestore_levelsrWÚ restore_codess                 r]Ú restore_dropped_levels_multijoinrÓsï€óXOñ(¨
Ó3€Jà×#Ñ#€KØ×!Ñ!€JØ×!Ñ!€Jð2ò7ÐØ  §¡Ñ +؈C؉GàˆC؈Gð—9‘9—?‘?Ð#5Ó6ˆàŸ™ HÑ-ˆð—    ‘    ˜(Ñ#ˆØ ˆ?Ø!‰Mä!ŸM™M¨%°ÀRÔHˆMð" ^Ð$4Ñ4ˆ Ø = /Ñ1ˆ
ØÐ#5Ð"6Ñ6‰
ð/7ð2 ˜
 JÐ .Ð.r_có^—eZdZdZ                                d                                                                                    dd„Zddd„Zy)    ršÚ ordered_mergeNc óR—|    |_tj|||||||||
|d¬« y)NT)rHrIrKrLrJrRrNrM)r™rVrÑ) rËrXrYrHrIrJrKrLrNr™rRs            r]rÑz_OrderedMerge.__init__js@€ð'ˆÔÜ× Ñ Ø Ø Ø ØØØ!Ø#ØØØØð    !õ     
r_có>—|j«\}}}|jdk(r5|€d}ntj|«}|€d}n2tj|«}n|j€|}|}n t    d«‚|j ||||¬«}|j |||«|S)NÚffillz#fill_method must be 'ffill' or NonerS)rêr™rÁÚ ffill_indexerr£rærî)rËrQrßràráÚleft_join_indexerÚright_join_indexerr•s        r]rWz_OrderedMerge.get_result†s¾€Ø26×2EÑ2EÓ2GÑ/ˆ
L -ð
× Ñ ˜wÒ &ØÐ#Ø$(Ñ!ä$+×$9Ñ$9¸,Ó$GÐ!ØÐ$Ø%)Ñ"ä%,×%:Ñ%:¸=Ó%IÑ"Ø × Ñ Ð %Ø ,Ð Ø!.Ñ äÐBÓCÐ Cà×)Ñ)Ø Ð)Ð+=ÀDð*ó
ˆð     ×!Ñ! &¨,¸ ÔFàˆ r_)NNNFFr–Nr½)rXr™rYr™rHr´rIr´rJr´rKrµrLrµrNrr™r·rRr³r¢r›r r¡)r£r¤r¥rìrÑrWrdr_r]ršršgs—„Ø!€Kð !%Ø%)Ø&*Ø Ø!Ø)Ø"&Ø)0ð
à ð
ð"ð
ð ð    
ð
#ð 
ð $ð 
ðð
ðð
ðð
ð ð
ð'ð
ð
ó
õ8r_ršcó0—d|›d}tt|d«S)NÚ
asof_join_Ú
_on_X_by_Y)ÚgetattrrÁ)r¯rs  r]Ú_asof_by_functionrà£s€Ø ˜    { *Ð -€DÜ ”7˜D $Ó 'Ð'r_c󬇗eZdZdZ                                                    d                                                                                            d    d„Zˆfd„Z                        d
d„Zd d„Z                        d d„Zd d„Z    ˆxZ
S)r°Ú
asof_mergec óB—||_|    |_|
|_| |_||_||_|j
dvrt d|j
›«‚t|j«sd|j›}t |«‚tj||||||||| | d¬« y)N)ÚbackwardÚforwardÚnearestzdirection invalid: z,allow_exact_matches must be boolean, passed )rHrIrJrKrLrRrNr™)
r‰r¦r§r­r®r¯rr!ršrÑ)rËrXrYrHrIrJrKrLr‰r¦r§rNrRr­r®r¯rÎs                 r]rÑz_AsOfMerge.__init__«sÁ€ð$ˆŒØˆŒ Ø ˆŒ Ø"ˆŒØ#6ˆÔ Ø"ˆŒð >‰>Ð!CÑ CÜÐ2°4·>±>Ð2BÐCÓDÐ Dôt×/Ñ/Ô0ðØ×2Ñ2Ð3ð5ð ô˜S“/Ð !ä×ÑØ Ø Ø ØØØØ!Ø#ØØØð    õ     
r_có°•—t‰|||«\}}t|«dk7r|js t    d«‚t|«dk7r|j
s t    d«‚|jr/t |jjt«r t    d«‚|j
r/t |jjt«r t    d«‚|j;|j€ |j t    d«‚|jx|_ |_ |j€|j t    d«‚|j|j€ t    d«‚|js…|d    }t |t«r |j}nƒ||jj vr%|jj#|«jn$|jjj%|«}n |jjj}|j
s…|d    }t |t«r |j}nƒ||jj vr%|jj#|«jn$|jjj%|«}n |jjj}t'|«s!t'|«st)|«s t)|«r$t    d
t+|«›d t+|«›d «‚|j´t-|j«s|jg|_ t-|j«s|jg|_ t|j«t|j«k7r t    d «‚|jt/|«z}|jt/|«z}||fS)Nrbzcan only asof on a key for leftz can only asof on a key for rightzleft can only have one indexzright can only have one indexz(Can only pass by OR left_by and right_byzmissing left_byzmissing right_byrzIncompatible merge dtype, rbz$, both sides must have numeric dtypez,left_by and right_by must be the same length)ÚsuperrÄr…rKrrLrwrXr†r5rYr‰r¦r§rrrorUr*r)r*r‰r&rx)rËrIrJÚ    left_on_0Úlo_dtypeÚ
right_on_0Úro_dtypeÚ    __class__s       €r]rÄz"_AsOfMerge._validate_left_right_onÞsø€Ü!™GÑ;¸GÀXÓNшô ˆw‹<˜1Ò  T§_¢_ÜÐ>Ó?Ð ?ä ˆx‹=˜AÒ  d×&6Ò&6ÜÐ?Ó@Ð @à ?Š?œz¨$¯)©)¯/©/¼:ÔFÜÐ;Ó<Ð <à × Ò ¤
¨4¯:©:×+;Ñ+;¼ZÔ HÜÐ<Ó=Ð =ð 7‰7Р؏|‰|Ð'¨4¯=©=Ð+DÜ Ð!KÓLÐLØ+/¯7©7Ð 2ˆDŒL˜4œ=Ø <‰<Ð  D§M¡MÐ$=ÜÐ.Ó/Ð /Ø <‰<Ð #¨¯ © Ð(=ÜÐ/Ó0Ð 0ðŠØ ™
ˆIܘ)¤VÔ,Ø$Ÿ?™?‘ð! D§I¡I×$5Ñ$5Ñ5ð—I‘I×8Ñ8¸ÓC×IÒIàŸ™Ÿ™×9Ñ9¸)ÓDñð —y‘y—‘×,Ñ,ˆHà×ÒØ! !™ˆJܘ*¤fÔ-Ø%×+Ñ+‘ð" T§Z¡Z×%7Ñ%7Ñ7ð—J‘J×9Ñ9¸*ÓE×KÒKàŸ™×)Ñ)×:Ñ:¸:ÓFñð —z‘z×'Ñ'×-Ñ-ˆHô ˜HÔ %ܘxÔ(ܘxÔ(ܘxÔ(äØ,¬T°(«^Ð,<¸Eܘ“>Ð"Ð"FðHóð ð <‰<Ð #Ü § ¡ Ô-Ø $§ ¡ ˜~” Ü § ¡ Ô.Ø!%§¡ ” ä4—<‘<Ó ¤C¨¯ © Ó$6Ò6Ü Ð!OÓPÐPà—l‘l¤T¨'£]Ñ2ˆGØ—}‘}¤t¨H£~Ñ5ˆHà˜Ð Ð r_có<—dd„}tt||««D]\}\}}||||«Œ|jr!|jjj
}n|d}|j r!|jjj
}n|d}|||d«y)Ncó’—|j|jk7r®t|jt«rWt|jt«r=d|›dt|j«›dt|j«›d}t    |«‚d|›dt|j«›dt|j«›d}t    |«‚y)Nzincompatible merge keys [z] rbz), both sides category, but not equal onesz, must be the same type)rrwr,r‰r)rXrYrûrÎs    r]Ú_check_dtype_matchzE_AsOfMerge._maybe_require_matching_dtypes.<locals>._check_dtype_match3sÀ€Øz‰z˜UŸ[™[Ò(ܘdŸj™jÔ*:Ô;Ä
Ø—K‘KÔ!1ôAð4°A°3°b¼¸d¿j¹jÓ9IÐ8JÈ%Ü § ¡ Ó,Ð-Ð-VðXðô! “oÐ%ð4°A°3°b¼¸d¿j¹jÓ9IÐ8JÈ%Ü § ¡ Ó,Ð-Ð-DðFðô! “oÐ%ð+)r_rr)rXrrYrrûÚint)r r
rKrXr†r#rLrY)    rËr»rºrðrûr\r]ÚltÚrts             r]rÇz)_AsOfMerge._maybe_require_matching_dtypes.s’€ó
    &ô2%¤S¨¸Ó%IÓJò    *‰KˆA‰xBÙ ˜r 2 qÕ )ð    *ð ?Š?Ø—‘—‘×(Ñ(‰Bà Ñ#ˆBà × Ò Ø—‘×!Ñ!×)Ñ)‰Bà  Ñ$ˆBá˜2˜r 1Õ%r_cóB—|j’|jr!|jjj}n|d}d|j›dt |j «›}t|j «s(t|t«rk|j jdvrSt|jtj«s t|«‚|jtd«kr td«‚yt|j «r;t!|j«s t|«‚|jdkr td«‚yt#|j «r;t%|j«s t|«‚|jdkr td«‚ytd«‚y)Nrzincompatible tolerance z, must be compat with type ÚmMrztolerance must be positivez'key must be integer, timestamp or float)r­rKrXr†r#r‰rr+rwr7r'ÚdatetimeÚ    timedeltarr r%r$r#r')rËr»ròrÎs    r]rÈz_AsOfMerge._validate_tolerance[sX€à >‰>Ñ %ØŠØ—Y‘Y—_‘_×,Ñ,‘à# BÑ'ð*¨$¯.©.Ð)9ð:Ü! "§(¡(›^Ð,ð.ð ô
# 2§8¡8Ô,ܘ2Ô2Ô3¸¿¹¿ ¹ ÈÑ8Mä! $§.¡.´(×2DÑ2DÔEÜ$ S›/Ð)Ø—>‘>¤I¨a£LÒ0Ü$Ð%AÓBÐBð1ô" "§(¡(Ô+Ü! $§.¡.Ô1Ü$ S›/Ð)Ø—>‘> AÒ%Ü$Ð%AÓBÐBð&ô  §¡Ô)Ü  §¡Ô0Ü$ S›/Ð)à—>‘> AÒ%Ü$Ð%AÓBÐBð&ô!Ð!JÓKÐKðC &r_có¨—t|«js6t|«j«rt    d|›d«‚t    |›d«‚t |t «r|j«}t|j«r|jd«}|St |t«r|j}|St |t«r|j«}|S)Nz"Merge keys contain null values on z sidez keys must be sortedÚi8)r4r³r0r"r£rwr7Ú_maybe_convert_datelike_arrayr+rÚviewr8Ú_datar9Úto_numpy)rËÚvaluesÚsides   r]Ú_convert_values_for_libjoinz&_AsOfMerge._convert_values_for_libjoin€s¾€ôV‹}×4Ò4ܐF‹|×ÑÔ!Ü Ð#EÀdÀVÈ5Ð!QÓRÐRÜ ˜vÐ%9Ð:Ó;Ð ;ä fÔ1Ô 2Ø×9Ñ9Ó;ˆFä ˜vŸ|™|Ô ,Ø—[‘[ Ó&ˆFðˆ ô˜¤Ô 0à—\‘\ˆFðˆ ô ˜¤Ô /Ø—_‘_Ó&ˆFð
ˆ r_c    ó—|jr |jjjn|jd}|j
r |j jjn|jd}|j|jk(sJ‚|j}|Ãt|j«s(t|t«rž|jjdvr†t|«}|jjdvrWt|t«r!|jjj }nt#|«j }|j%|«}|j&}|j)|d«}|j)|d«}|j*A|jr%|j
r|j}|j}n|jdd}|jdd}t-t/|««Dcgc]}t1||||d¬«‘Œ}}t/|«d    k(r|dd}    |dd    }
n^|D cgc]} t3j4| dd
«‘Œ} } t7d „|D««} t9| | dd¬ «}t/|d«}|d|}    ||d}
t;|    «}    t;|
«}
t=|j>«}||||    |
|j@|«St=|j>«}|||dd|j@|d«Scc}wcc} w) r>rNrõrXrYrFrkrbrøc3ó&K—|]    }|d–—Œ y­w)røNrd)rprns  r]rrz0_AsOfMerge._get_join_indexers.<locals>.<genexpr>Úsèø€Ò3 q˜a dÑ3ùs‚)r»rMÚxnull)!rKrXr†r#r»rLrYrºrr­r+rwr7r'r Ú pyarrow_dtypeÚunitr;Úas_unitÚ_valuerr¦r„r…r«rLÚ concatenateryr?rràr¯r®)rËÚ left_valuesÚ right_valuesr­rr»rºrIr·Úleft_by_valuesÚright_by_valuesrnÚarrsr»Ú group_indexÚleft_lenÚfuncs                 r]r@z_AsOfMerge._get_join_indexersšs€ð
(,§¢ˆDI‰IO‰O× #Ò #¸D×<OÑ<OÐPRÑ<Sð    ð)-×(8Ò(8ˆDJ‰J× Ñ × $Ò $¸d×>RÑ>RÐSUÑ>Vð    ð
× Ñ  L×$6Ñ$6Ò6Ð6Ð6à—N‘Nˆ    Ø Ð  ô# ;×#4Ñ#4Ô5ܘ;Ô(;Ô<Ø×%Ñ%×*Ñ*¨dÑ2ä% iÓ0    ð×$Ñ$×)Ñ)¨TÑ1ô" +Ô/BÔCØ*×0Ñ0×>Ñ>×CÑC™ä=¸kÓJ×OÑO˜Ø )× 1Ñ 1°$Ó 7Ià%×,Ñ,    ð×6Ñ6°{ÀFÓKˆ Ø×7Ñ7¸ ÀgÓNˆ ð <‰<Ñ #àŠ 4×#3Ò#3Ø!%×!4Ñ!4Ø"&×"6Ñ"6‘à!%×!4Ñ!4°Q°rÐ!:Ø"&×"6Ñ"6°q¸Ð"<ôœs >Ó2Ó3ö ð ô  Ø" 1Ñ%Ø# AÑ&ØöðˆFðô>Ó" aÒ'Ø!'¨¡¨1¡Ø"(¨¡)¨A¡,‘à7=Ö>°!œŸ™ q¨¨! uÕ-Ð>Ð>ÜÑ3¨FÔ3Ó3Ü-Ø ¨E¸ô ô˜~¨aÑ0Ó1Ø!,¨Y¨hÐ!7Ø"-¨h¨iÐ"8ä)¨.Ó9ˆNÜ*¨?Ó;ˆOô% T§^¡^Ó4ˆDÙØØØØØ×(Ñ(Øó ð ô% T§^¡^Ó4ˆDÙØØØØØ×(Ñ(ØØóð ùòMùò?s Ç9LÈ9L) NNNFFNNNr–r¬NTrä)rXr™rYr™rHr´rIr´rJr´rKrµrLrµrNrrRzLiteral['asof']r®rµr¯r¤r¢r›rœr)rþrrÿr¤r¢ú
np.ndarray©r¢ú1tuple[npt.NDArray[np.intp], npt.NDArray[np.intp]]) r£r¤r¥rìrÑrÄrÇrÈrr@Ú __classcell__)rís@r]r°r°¨süø„Ø€Kð !%Ø%)Ø&*Ø Ø!Ø ØØØ)Ø%ØØ$(Ø#ð!1
à ð1
ð"ð1
ð ð    1
ð
#ð 1
ð $ð 1
ðð1
ðð1
ðð1
ðð1
ð"ð1
ð ð!1
ð"
ó#1
ôfN!ð`+&Ø-ð+&Ø@Oð+&à     ó+&óZ#LðJØ"ðØ*-ðà    ó÷4`r_r°cóL‡‡‡—ˆˆˆfd„t‰j«D«}t|Ž}d„|D«\}}}‰r/tt    t
j |‰j««}n"d„}tt    |‰j««}t‰«D]n\}    }
‰j|    dk(} | j«sŒ)|
||    ||    dz
k(} | jdk(s | d| dk7s ||    xxdz cc<||    dz
||    | <Œpt||t|«‰«\} }| |fS)Nc3ón•K—|],}t‰j|j‰|‰¬«–—Œ.y­wrª)r«rVr#)rprIr†Ú    join_keysrMs  €€€r]rrz*_get_multiindex_indexer.<locals>.<genexpr>    s7øèø€òà ô    ˜Ÿ ™  Q™×/Ñ/°¸1±ÀD×IÐIñùsƒ25c3ó2K—|]}t|«–—Œy­wrmr­rs  r]rrz*_get_multiindex_indexer.<locals>.<genexpr>    r®r¯có*—|jddd¬«S)NrùFT©ÚsubokrQ)rú)Úas r]r z)_get_multiindex_indexer.<locals>.<lambda>
    s€˜1Ÿ8™8 D°¸D˜8ÓA€r_rrbr) r„rÃr
rxÚmaprLr~rWr r"Úsizer²ry)rr†rMr·r¸ÚrcodesÚlcodesr»Úi8copyrûÚjoin_keyrOrr¼r½s```            r]Ú_get_multiindex_indexerr#ýs ú€õäu—}‘}Ó%ô€Fô&ˆ\€FÙ5¨fÔ5Ñ€FˆFEÙ Ü”cœ"Ÿ'™' 6¨5¯;©;Ó7Ó8‰áAˆÜ”c˜& %§+¡+Ó.Ó/ˆô! Ó+ò    +‰ ˆˆ8؏{‰{˜1‰~ Ñ#ˆØ 8‰8:𘠙 e¨A¡h°¡lÑ2Ñ3ˆA؏v‰v˜Š{ ! A¡$¨!¨A©$¢,ؐa“˜A‘ “à# A™h¨™lˆF1‰IdŠOð    +ô  ¨´°e³ ¸dÓCJ€Dˆ$Ø ˆ:Ðr_có–—tjgtj¬«tjgtj¬«fS)zReturn empty join indexers.©r)rLÚarrayÚintprdr_r]r°r°    s2€ô     ‰œ2Ÿ7™7Ô#Ü
‰œ2Ÿ7™7Ô#ð ðr_có¬—tj|tj¬«}tj|dtj¬«}|r||fS||fS)aÏ
    Return join indexers where all of one side is selected without sorting
    and none of the other side is selected.
 
    Parameters
    ----------
    n : int
        Length of indexers to create.
    left_missing : bool
        If True, the left indexer will contain only -1's.
        If False, the right indexer will contain only -1's.
 
    Returns
    -------
    np.ndarray[np.intp]
        Left indexer
    np.ndarray[np.intp]
        Right indexer
    r%r)r»rr)rLÚaranger'Úfull)rIÚ left_missingrÏÚ idx_missings    r]r±r±&    sG€ô, )‰)AœRŸW™WÔ
%€CÜ—'‘' ¨b¼¿¹Ô@€KÙØ˜CÐÐØ  Ð Ðr_có,—t|t«rt|||¬«\}}n|d}|j}t    |||¬«\}}}t j ||||¬«\}    }
|st|«t|    «k7r|j|    «} | |    |
fS|d|
fS)Nrkr)    rwr5r#r#r«rÁrÂr…r~) rGrHrrMr¼r½rrrÅràrárßs             r]rErEC    sª€ô(œJÔ'Ü,¨Y¸ÀtÔL‰
ˆ‰dð
˜‰|ˆð×шä!0°°tÀ$Ô!GÑ€Hˆi˜Ü")×"9Ñ"9ؐ)˜U¨ô#Ñ€L-ñ Œs7‹|œs <Ó0Ò0à—\‘\ ,Ó/ˆ
ؘ<¨Ð6Ð6ð D˜-Ð 'Ð'r_cóÜ—t|jt«rt|jt«s@tj|jd«rltj|jd«rLt d|«j |«\}}t d|«j}t d|«j}n—t|jt«r”t|jt«rz|j|jk(rat|t«sJ‚t|t«sJ‚|j|«}t|j«}t|j«}nét|t«rØ|j|jk(r¾t|jt«rt|j«s5t|jt «rî|jj"dk(rÔddl}ddlm}t+|«}|j,}|j,}|j/|j0|j0z«j3«j5«}|j7|j8t;|«d«j=«j?t@jBd¬«|j7|j8t;|d«d«j=«j?t@jBd¬«t+|jD«}    }}|r,|jDj=d¬    «}
tG|
||«\}}|jHdkDra|dk(} | jK«} |dk(} | jK«}| rtAjL|| |    «|rtAjL|| |    «|    d
z }    |||    fSt|tN«svt|jt«r6tQ|jjR«s=t|j«r|r&|jU«\}}|jU«\}}tW|j«rc|j|jk(rJtAjX|t@jZ¬ «}tAjX|t@jZ¬ «}t]||«\}}}|t_t+|«t+|«««}t|tN«rat|tN«sJ‚|ja|jb|jd¬ «}|ja|jb|jd¬ «}nÑt|tf«rŸt|tf«sJ‚|ja|j=d
|jjR¬ «|ji«¬ «}|ja|j=d
|jjR¬ «|ji«¬ «}n"|ja|«}|ja|«}|jtAjt@jB«k(sJ|j«‚|jtAjt@jB«k(sJ|j«‚|jk«}    |r*|jljo«}
tG|
||«\}}|dk(} | jK«} |dk(} | jK«}| s|r7| rtAjL|| |    «|rtAjL|| |    «|    d
z }    |||    fS)aï
    Encode left and right keys as enumerated types.
 
    This is used to get the join indexers to be used when merging DataFrames.
 
    Parameters
    ----------
    lk : ndarray, ExtensionArray
        Left key.
    rk : ndarray, ExtensionArray
        Right key.
    sort : bool, defaults to True
        If True, the encoding is done such that the unique elements in the
        keys are sorted.
 
    Returns
    -------
    np.ndarray[np.intp]
        Left (resp. right if called with `key='right'`) labels, as enumerated type.
    np.ndarray[np.intp]
        Right (resp. left if called with `key='right'`) labels, as enumerated type.
    int
        Number of unique elements in union of left and right labels.
 
    See Also
    --------
    merge : Merge DataFrame or named Series objects
        with a database-style join.
    algorithms.factorize : Encode the object as an enumerated type
        or categorical variable.
 
    Examples
    --------
    >>> lk = np.array(["a", "c", "b"])
    >>> rk = np.array(["a", "c"])
 
    Here, the unique values are `'a', 'b', 'c'`. With the default
    `sort=True`, the encoding will be `{0: 'a', 1: 'b', 2: 'c'}`:
 
    >>> pd.core.reshape.merge._factorize_keys(lk, rk)
    (array([0, 2, 1]), array([0, 2]), 3)
 
    With the `sort=False`, the encoding will correspond to the order
    in which the unique elements first appear: `{0: 'a', 1: 'c', 2: 'b'}`:
 
    >>> pd.core.reshape.merge._factorize_keys(lk, rk, sort=False)
    (array([0, 1, 2]), array([0, 1]), 3)
    rrCÚpyarrowrNrFrS)Úzero_copy_onlyrbr%)rO)Úna_valuer)8rwrr-rÚ is_np_dtyper    Ú_ensure_matching_resosÚ_ndarrayr,r3Ú_encode_with_my_categoriesrrWr9r2r*r:Ústorager/Úpyarrow.computeÚcomputer…Ú    _pa_arrayÚ chunked_arrayÚchunksÚcombine_chunksÚdictionary_encodeÚ    fill_nullrÚslicerýrúrLr'Ú
dictionaryÚ _sort_labelsÚ
null_countr"Úputmaskr8r(Ú numpy_dtypeÚ_values_for_factorizer+ÚasarrayÚint64Ú#_convert_arrays_and_get_rizer_klassÚmaxÚ    factorizerüÚ_maskr7r0Ú    get_countÚuniquesÚto_array)r\r]rMÚpaÚpcÚlen_lkÚdcr¹rºrÅrMÚlmaskÚlanyÚrmaskÚranyr©ÚklassÚrizers                  r]r«r«_    sz€ôl    2—8‘8œ_Ô-´*¸R¿X¹XÄÔ2WÜ
/‰/˜"Ÿ(™( CÔ
(¬S¯_©_¸R¿X¹XÀsÔ-Kôo rÓ*×AÑAÀ"ÓE‰ˆˆBÜ / 2Ó &× /Ñ /ˆÜ / 2Ó &× /Ñ /Šô    2—8‘8Ô-Ô.Ü r—x‘xÔ!1Ô 2Ø H‰H˜Ÿ™Ò  ä˜"œkÔ*Ð*Ð*ܘ"œkÔ*Ð*Ð*ð× *Ñ *¨2Ó .ˆä ˜"Ÿ(™(Ó #ˆÜ ˜"Ÿ(™(Ó #Šä    BœÕ    '¨B¯H©H¸¿¹Ó,@Ü r—x‘x¤Ô ,´ÀÇÁÔ1JÜ r—x‘x¤Õ -°"·(±(×2BÑ2BÀiÓ2Oã  Ý (䘓WˆFØ—‘ˆBØ—‘ˆBà× Ñ  §¡¨R¯Y©YÑ!6Ó7ß‘Ó!ß"Ñ"Ó$ð ð— ‘ ˜RŸZ™Z¬¨f« Ñ6¸Ó;ß‘“ß‘œŸ™ eÓ,Ø— ‘ ˜RŸZ™Z¬¨f°dÓ(;Ñ<¸bÓAß‘“ß‘œŸ™ eÓ,ܐB—M‘MÓ"ð$ˆDñØŸ-™-×0Ñ0ÀÐ0ÓFÜ)¨'°4¸Ó>‘
dà}‰}˜qÒ Ø ™
Ø—y‘y“{Ø ™
Ø—y‘y“{ÙÜ—J‘J˜t U¨EÔ2ÙÜ—J‘J˜t U¨EÔ2ؘ‘
Ø˜˜uÐ$Ð $ä˜"œoÔ.ä r—x‘x¤Ô ,ä  §¡×!5Ñ!5Ô6Ü" 2§8¡8Ô,Ùð×,Ñ,Ó.‰EˆBð×,Ñ,Ó.‰EˆBä˜2Ÿ8™8Ô$¨¯©°R·X±XÒ)=ôZ‰Z˜¤"§(¡(Ô +ˆÜ Z‰Z˜¤"§(¡(Ô +ˆä7¸¸BÓ?M€Eˆ2ˆrá ”#”c˜"“gœs 2›wÓ'Ó (€Eä"”oÔ&ܘ"œoÔ.Ð.Ð.؏‰˜rŸx™x¨b¯h©hˆÓ7ˆØ‰˜rŸx™x¨b¯h©hˆÓ7‰Ü    BÔ+Ô    ,ܘ"Ô1Ô2Ð2Ð2ð‰Ø K‰K ¨"¯(©(×*>Ñ*>ˆKÓ ?ÀbÇgÁgÃiðó
ˆð‰Ø K‰K ¨"¯(©(×*>Ñ*>ˆKÓ ?ÀbÇgÁgÃiðó
‰ð‰˜rÓ"ˆØ‰˜rÓ"ˆØ :‰:œŸ™¤"§'¡'Ó*Ò *Ð6¨D¯J©JÓ6Ð *Ø :‰:œŸ™¤"§'¡'Ó*Ò *Ð6¨D¯J©JÓ6Ð *à O‰OÓ €Eá Ø—-‘-×(Ñ(Ó*ˆÜ! '¨4°Ó6‰
ˆˆdð B‰J€EØ 9‰9‹;€DØ B‰J€EØ 9‰9‹;€Dá ‰tÙ Ü J‰Jt˜U EÔ *Ù Ü J‰Jt˜U EÔ *Ø ‰
ˆà uÐ Ðr_có‚—t|j«r|j|jk7rØt|j|jg«}t|t«r|j «}t|t «s|j||d¬«}n|j|d¬«}t|t «s|j||d¬«}n:|j|d¬«}n&|j|d¬«}|j|d¬«}t|t«rt|jj}n†t|jt«r(t|jjj}nDt|jj}n&tj}t!|«}t!|«}|||fS)NFrrS)r(rrrwrrpr9rqrúr8Ú _factorizersrÂr2rDÚ libhashtableÚObjectFactorizerr )r\r]rÚclsrWs     r]rHrH
s^€ô˜Ÿ™Õ!Ø 8‰8r—x‘xÒ Ü$ b§h¡h°·±Ð%9Ó:ˆEܘ%¤Ô0Ø×0Ñ0Ó2Ü! "¤nÔ5Ø×+Ñ+¨B°eÀ%Ð+ÓH‘BàŸ™ 5¨u˜Ó5Bä! "¤nÔ5Ø×+Ñ+¨B°eÀ%Ð+ÓH‘BàŸ™ 5¨u˜Ó5‘Bà—Y‘Y˜u¨5YÓ1Ø—Y‘Y˜u¨5YÓ1Ü bœ/Ô *ô! §¡§¡Ñ/‰EÜ ˜Ÿ™¤*Ô -Ü  §¡×!5Ñ!5×!:Ñ!:Ñ;‰Eä  §¡§¡Ñ/‰Eô×-Ñ-ˆÜ ˜2Ó ˆÜ ˜2Ó ˆØ "bˆ=Ðr_có˜—t|«}tj||g«}tj||d¬«\}}|d|||d}}||fS)NT)Úuse_na_sentinel)r…rLrr$Ú    safe_sort)    rMrXrYÚllengthrr©Ú
new_labelsÚnew_leftÚ    new_rights             r]rArAA
sW€ô$‹i€GÜ ^‰^˜T 5˜MÓ *€Fä—O‘O G¨VÀTÔJM€A€zØ$ X gÐ.°
¸7¸8Ð0Dˆi€Hà YÐ Ðr_có>‡—tˆfd„tt‰«dd«D««}tj‰d|d¬«}||dj ddd¬«z}||dj ddd¬«z}td|«D]?}tj d    ¬
«5|‰|z}ddd«||||zz }||||zz }ŒA|t‰«k(r||fSt|||¬ «\}}}    |g||dz}|g||dz}|    f‰|dzŠt||‰|«S#1swYŒnxYw) Nc3ó>•K—|]}t‰d|«s|–—Œy­wrm)r@)rpr_r»s  €r]rrz!_get_join_keys.<locals>.<genexpr>T
s'øèø€òà Ü)¨%°°¨+Ô6ô     ñùsƒrrrbrùr%Frrc)Údividerk)    Únextr„r…rLÚprodrúrrr«r²)
r¹rºr»rMÚnlevÚstrider¼r½rûrÅs
  `       r]r²r²M
s[ø€ô ó䜘U› Q¨Ó+ôó €DôW‰WU˜1˜T]¨$Ô /€FØ D˜‘G—N‘N 4¨u¸5NÓAÑ A€DØ D˜‘G—N‘N 4¨u¸5NÓAÑ A€Dä 1d‹^ò!ˆÜ [‰[ Ô )ñ     Ø u˜Q‘xÑ ˆF÷     à Q‘˜&Ñ Ñ ˆØ Q‘˜&Ñ Ñ ‰ð    !ð  Œs5‹zÒØTˆzÐô(¨¨d¸Ô>Ñ€Dˆ$à ˆ6D˜˜KÑ €DØ ˆ6D˜˜KÑ €DØ ˆHu˜T˜U|Ñ #€Eä ˜$  e¨TÓ 2Ð2÷     ð     ús     DÄD    cóN—t|t«rt|t«sy||k(S)NT)rwr¤)r/r0s  r]r!r!r
s"€Ü eœSÔ !¬°E¼3Ô)?ØØ E‰>Ðr_có2—|duxrtj|ŽSrm)rÀÚ any_not_none)r›s r]rTrTx
s€Ø Dˆ=Ò 1œS×-Ñ-¨qÐ1Ð1r_cóėt|t«r|St|t«r'|j€ t    d«‚|j «St dt|«›d«‚)Nz$Cannot merge a Series without a namez.Can only merge Series or DataFrame objects, a z  was passed)rwr.r/rr£Úto_frameÚ    TypeErrorrÂ)Úobjs r]rTrT|
sZ€Ü#”|Ô$؈
Ü    CœÔ    #Ø 8‰8Ð ÜÐCÓDÐ D؏|‰|‹~ÐäØ<¼TÀ#»Y¸KÀ{Ð Só
ð    
r_cóÀ‡ —t|d¬«rt|t«rtdt    |«›d«‚|j |«Š t ‰ «dk(r||fS|\}}|s|std‰ ›«‚d ˆ fd„ }t||¬«}t||¬«}|j|«}|j|«}    g}
|js3||j«|j«zj«}
|    jsB|
j|    |    j«|j«zj««|
rtd    t|
«›d
«‚||    fS) z¶
    Suffixes type validation.
 
    If two indices overlap, add suffixes to overlapping entries.
 
    If corresponding suffix is empty, the entry is simply converted to string.
 
    F)Ú
allow_setszPassing 'suffixes' as a z:, is not supported. Provide 'suffixes' as a tuple instead.rz)columns overlap but no suffix specified: có •—|‰vr||›|›S|S)a?
        Rename the left and right indices.
 
        If there is overlap, and suffix is not None, add
        suffix, otherwise, leave it as-is.
 
        Parameters
        ----------
        x : original column name
        suffix : str or None
 
        Returns
        -------
        x : renamed column name
        rd)r›ÚsuffixÚ    to_renames  €r]Úrenamerz+_items_overlap_with_suffix.<locals>.renamer£
s$ø€ð      ‰>˜fÐ0ؐS˜˜>Ð !؈r_)rvz1Passing 'suffixes' which cause duplicate columns z is not allowed.)rvr·)r&rwÚdictrqrÂr‡r…r£rÚ_transform_indexrˆÚ
duplicatedrÚextendrr‚) rXrYrNÚlsuffixÚrsuffixrxÚlrenamerÚrrenamerrârãÚdupsrws            @r]rÙrى
soø€ô ˜¨UÕ 3´zÀ(ÌDÔ7QÜØ&¤t¨H£~Ð&6ð75ð 5ó
ð    
ð
×!Ñ! %Ó(€IÜ
ˆ9ƒ~˜ÒؐUˆ{ÐàÑ€GˆWá ™7ÜÐDÀYÀKÐPÓQÐQõô(w wÔ/€Hܐw wÔ/€Hà×#Ñ# HÓ-€GØ×$Ñ$ XÓ.€Gà €DØ × Ò ð˜×*Ñ*Ó,°$·/±/Ó2CÐ1CÑDÑE×LÑLÓNˆØ × Ò Ø  ‰ G˜W×/Ñ/Ó1°u×7GÑ7GÓ7IÐ6IÑJÑK×RÑRÓTÔUÙ ÜØ?ÄÀDà   ¸{ðKð ó
ð    
ð
GÐ Ðr_) rcNNNFFFr–NFN)rXr™rYr™rRrrHršrIršrJršrKrµrLrµrMrµrNrrQrŸrOr¶rPr·r¢rA)
NNNFFFr–NFN)rXrArYrArHršrIršrJršrKrµrLrµrMrµrNrrQrŸrOr¶rPr·r¢rA)rXr™rYr™)NNNNNNr–r½)rXr™rYr™rHr´rIr´rJr´r™r·rNrrRrr¢rA) NNNFFNNNr–NTrä)rXr™rYr™rHr´rIr´rJr´rKrµrLrµrNrr­zint | Timedelta | Noner®rµr¯r¤r¢rA)Frc)
rXr¹rYr¹rMrµrRrr¢r¢)
rXrrYrrMrµrRrr¢r) rXr5rYr5rßr4rÊúnpt.NDArray[np.intp]rËr‚r¢z)tuple[FrozenList, FrozenList, FrozenList])r¯r¤)rr¹r†r5rMrµr¢rr)rIrñr+rµr¢r)F)
rGr4rHr4rr¹rMrµr¢z?tuple[Index, npt.NDArray[np.intp] | None, npt.NDArray[np.intp]]r )r\rr]rrMrµr¢z6tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int])r\rr]rr¢z:tuple[type[libhashtable.Factorizer], ArrayLike, ArrayLike])rMrrXr‚rYr‚r¢r)
r¹ú%list[npt.NDArray[np.int64 | np.intp]]rºrƒr»rrMrµr¢z3tuple[npt.NDArray[np.int64], npt.NDArray[np.int64]])r¢rµ)rrr™r¢rA)rXr4rYr4rNrr¢ztuple[Index, Index])¢r¦Ú
__future__rÚcollections.abcrrröÚ    functoolsrÚtypingrrr    r
rertÚnumpyrLÚ pandas._libsr r r[r rÁrÚpandas._libs.librÚpandas._typingrrrrrrrrÚ pandas.errorsrÚpandas.util._decoratorsrrrÚpandas.util._exceptionsrÚpandas.core.dtypes.baserÚpandas.core.dtypes.castrÚpandas.core.dtypes.commonrr r!r"r#r$r%r&r'r(r)r*r+Úpandas.core.dtypes.dtypesr,r-Úpandas.core.dtypes.genericr.r/Úpandas.core.dtypes.missingr0r1rÞr2r3r4r5r6Úpandas.core.algorithmsÚcoreÚ
algorithmsr$Úpandas.core.arraysr7r8r9Úpandas.core.arrays.string_r:Úpandas.core.commonÚcommonrÀÚpandas.core.constructionr;r<Úpandas.core.framer=Úpandas.core.indexes.apir>Úpandas.core.sortingr?r@rAÚ pandas.corerBrCÚpandas.core.indexes.frozenrDrGÚInt64FactorizerÚlonglongÚint32ÚInt32FactorizerÚint16ÚInt16Factorizerr÷ÚInt8FactorizerÚuint64ÚUInt64FactorizerÚuint32ÚUInt32FactorizerÚuint16ÚUInt16FactorizerÚuint8ÚUInt8FactorizerÚbool_Úfloat64ÚFloat64FactorizerÚfloat32ÚFloat32FactorizerÚ    complex64ÚComplex64FactorizerÚ
complex128ÚComplex128FactorizerÚobject_r\rZÚintcÚndarrayrr^rUr–rªr±rVr?r´rÓršràr°r#r°r±rEr«rHrAr²r!rTrTrÙrdr_r]ú<module>r½sðñõ#÷óÝ÷óó  Ûã÷óõ .÷    ÷    ó    õ%÷ñõ
5å2Ý4÷÷÷õ÷÷÷÷
õ÷'Ð&÷ñõ
3ߠР÷õ)Ý1÷ñ
Ý Ý#Ý0Ý5ð‡HHˆl×*Ñ*؇KK×-Ñ-؇HHˆl×*Ñ*؇HHˆl×*Ñ*؇GGˆ\× (Ñ (؇IIˆ|×,Ñ,؇IIˆ|×,Ñ,؇IIˆ|×,Ñ,؇HHˆl×*Ñ*؇HHˆl×*Ñ*؇JJ ×.Ñ.؇JJ ×.Ñ.؇L‚L,×2Ò2؇M‚M<×4Ò4؇J‚J ×-Ò-ð€ ð&‡7‚7"—(‘(ÑØ(×8Ñ8€L—’Ñà
*Š*n e¨YР   7€ñÐ2Ó3Ù    ˆ*˜aÔ ðØ+/Ø04Ø15ØØØØ%ØØ!Øð/(Ø
ð/(à ð/(ð
ð/(ð    )ð    /(ð
.ð /(ð /ð /(ðð/(ðð/(ð ð/(ðð/(ð ð/(ðð/(ðð/(ðò/(ó!ó4ð/(ðj,0Ø04Ø15ØØØØ%ØØ!Øð4Ø
ð4à ð4ð    )ð4ð.ð    4ð
/ð 4ð ð 4ðð4ð ð4ðð4ð ð4ðð4ðð4ðó4ðn6Ø ð6Ø);ó6ðx!Ø!%Ø"&Ø Ø Ø"Ø%ØðJØ
ðJà ðJð    ðJðð    Jð
 ð JððJððJð
ðJðóJð`!Ø!%Ø"&ØØØ Ø Ø Ø%Ø(,Ø $ØðLØ
ðLà ðLð    ðLðð    Lð
 ð Lð ð LððLððLð&ðLððLððLðóL÷bQñQðnØð    KØðKàðKð ðKð
ð    Kð
Eó KðbØð     Ø
ð à ð ð ð ð
ð     ð
7ó  ðFV/Ø
ðV/à ðV/ðð    V/ð
#ð V/ð #ð V/ð/óV/ôr9Oô9óx(ô
RôRðj
ØðØ'1ðØ9=ðà6óóBðØ
ðØðà6óð<OTð(Ø ð(Ø#ð(Ø0?ð(ØGKð(àDó(ð:04ðzØðzØ ðzØ(,ðzà;ózðz"Øð"Ø ð"à?ó"ðJ    Ø ð    Ø3ð    Ø<Pð    à6ó    ð"3Ø
/ð"3à
/ð"3ð ð"3ð ð    "3ð
9ó "3óJó 2ó
 
ðAØ
ðAØðAØ)1ðAàôAr_