zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
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
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
U
¬ý°dúã@sZUdZddlmZddlmZddlZddlmZddlZddl    Z    ddl
Z
ddl m Z ddl mZmZmZmZmZmZmZmZmZddlZddlmZddlZdd    lmZdd
lmZdd l m!Z!m"Z"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(m)Z)m*Z*dd l+m,Z,m-Z-ddl.m/Z/ddl0m1Z1m2Z2m3Z3m4Z4ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<ddl=m>Z>ddl?m@Z@ddlAmBZBddlCmDZDddlEmFZFddlGmHZHddlImJZJer¨ddl mKZKdZLdZMdZNdZOdZPdZQdeM›d eN›d eO›d eP›d eHd!d"›d eHd#›d$eQ›d%ZRd&eM›d eN›d'ZSd(eM›d eN›d eO›d eHd!›d eHd#›d)eQ›d  ZTd*d+d,d-d.d/d0d1d2g    ZUe d3d4d4¡ZVd5eWd6<d7d8œd9d:„ZXd7d;d7d<œd=d>„ZYd?ZZd5eWd@<dAZ[d5eWdB<dCZ\d5eWdD<dEZ]d5eWdF<dGZ^d5eWdH<dIdIdJœdKdL„Z_GdMdN„dNƒZ`GdOdP„dPe`ƒZaGdQdR„dRƒZbGdSdT„dTƒZcGdUdV„dVecejdƒZee,eRƒdWdWddXdWddWddXdYddZœ d[d\d\d]d\d\d^d\d_d\d`dadbdcœ ddde„ƒZfd;d;dfœdgdh„Zgdidjdidkœdldm„Zhd;dndoœdpdq„Zidrdsdrdtœdudv„Zjdnd7djdwœdxdy„Zkdd7djd\d;d{œd|d}„Zle-eHd#eHd~dd€Gdd‚„d‚ecƒƒZmdnd7d\djdƒœd„d…„Znd†djd‡dkœdˆd‰„ZoGdŠd‹„d‹ƒZpGdŒd„demƒZqGdŽd„deqƒZrdS)‘a°
Module contains tools for processing Stata files into DataFrames
 
The StataReader below was originally written by Joe Presbrey as part of PyDTA.
It has been extended and improved by Skipper Seabold from the Statsmodels
project who also developed the StataWriter and was finally added to pandas in
a once again improved version.
 
You can find more information on http://presbrey.mit.edu/PyDTA and
https://www.statsmodels.org/devel/
é)Ú annotations)ÚabcN)ÚBytesIO)Ú TracebackType)    ÚIOÚ TYPE_CHECKINGÚAnyÚAnyStrÚCallableÚFinalÚHashableÚSequenceÚcast)Ú relativedelta)Ú infer_dtype)Úmax_len_string_array)ÚCompressionOptionsÚFilePathÚ
ReadBufferÚStorageOptionsÚ WriteBuffer)ÚCategoricalConversionWarningÚInvalidColumnNameÚPossiblePrecisionLossÚValueLabelTypeMismatch)ÚAppenderÚdoc)Úfind_stack_level)Ú ensure_objectÚis_categorical_dtypeÚis_datetime64_dtypeÚis_numeric_dtype)Ú CategoricalÚ DatetimeIndexÚNaTÚ    TimestampÚisnaÚ to_datetimeÚ to_timedelta)Ú BooleanDtype)Ú IntegerDtype)Ú    DataFrame)ÚIndex)ÚSeries)Ú _shared_docs)Ú
get_handle)ÚLiteralzîVersion of given Stata file is {version}. pandas supports importing versions 105, 108, 111 (Stata 7SE), 113 (Stata 8/9), 114 (Stata 10/11), 115 (Stata 12), 117 (Stata 13), 118 (Stata 14/15/16),and 119 (Stata 15/16, over 32,767 variables).zÌconvert_dates : bool, default True
    Convert date variables to DataFrame time values.
convert_categoricals : bool, default True
    Read value labels and convert columns to Categorical/Factor variables.aindex_col : str, optional
    Column to set as index.
convert_missing : bool, default False
    Flag indicating whether to convert missing values to their Stata
    representations.  If False, missing values are replaced with nan.
    If True, columns containing missing values are returned with
    object data types and missing values are represented by
    StataMissingValue objects.
preserve_dtypes : bool, default True
    Preserve Stata datatypes. If False, numeric data are upcast to pandas
    default types for foreign data (float64 or int64).
columns : list or None
    Columns to retain.  Columns will be returned in the given order.  None
    returns all columns.
order_categoricals : bool, default True
    Flag indicating whether converted categorical data are ordered.zzchunksize : int, default None
    Return StataReader object for iterations, returns chunks with
    given number of lines.z=iterator : bool, default False
    Return StataReader object.zúNotes
-----
Categorical variables read through an iterator may not have the same
categories and dtype. This occurs when  a variable stored in a DTA
file is associated to an incomplete set of value labels that only
label a strict subset of the values.a>
Read Stata file into DataFrame.
 
Parameters
----------
filepath_or_buffer : str, path object or file-like object
    Any valid string path is acceptable. The string could be a URL. Valid
    URL schemes include http, ftp, s3, and file. For file URLs, a host is
    expected. A local file could be: ``file://localhost/path/to/table.dta``.
 
    If you want to pass in a path object, pandas accepts any ``os.PathLike``.
 
    By file-like object, we refer to objects with a ``read()`` method,
    such as a file handle (e.g. via builtin ``open`` function)
    or ``StringIO``.
Ú
Zdecompression_optionsÚfilepath_or_bufferÚstorage_optionszª
 
Returns
-------
DataFrame or StataReader
 
See Also
--------
io.stata.StataReader : Low-level reader for Stata data files.
DataFrame.to_stata: Export Stata data files.
 
a
 
Examples
--------
 
Creating a dummy stata for this example
 
>>> df = pd.DataFrame({'animal': ['falcon', 'parrot', 'falcon', 'parrot'],
...                     'speed': [350, 18, 361, 15]})  # doctest: +SKIP
>>> df.to_stata('animals.dta')  # doctest: +SKIP
 
Read a Stata dta file:
 
>>> df = pd.read_stata('animals.dta')  # doctest: +SKIP
 
Read a Stata dta file in 10,000 line chunks:
 
>>> values = np.random.randint(0, 10, size=(20_000, 1), dtype="uint8")  # doctest: +SKIP
>>> df = pd.DataFrame(values, columns=["i"])  # doctest: +SKIP
>>> df.to_stata('filename.dta')  # doctest: +SKIP
 
>>> with pd.read_stata('filename.dta', chunksize=10000) as itr: # doctest: +SKIP
>>>     for chunk in itr:
...         # Operate on a single chunk, e.g., chunk.mean()
...         pass  # doctest: +SKIP
z­Reads observations from Stata file, converting them into a dataframe
 
Parameters
----------
nrows : int
    Number of lines to read from data file, if None read whole file.
z
 
Returns
-------
DataFrame
zæClass for reading Stata dta files.
 
Parameters
----------
path_or_buf : path (string), buffer or path object
    string, path object (pathlib.Path or py._path.local.LocalPath) or object
    implementing a binary read() functions.
z
 
ú%tcú%tCú%tdú%dú%twú%tmú%tqú%thú%tyé¨ér Ú stata_epochr-©Úreturncsltjjtjj‰‰tjt ddd¡j‰tjt ddd¡j‰ˆddd‰ˆddd‰ddœ‡‡fdd    „ }ddœ‡‡fd
d „ }ddœ‡‡‡‡fd d „ }t |¡}d}| ¡rÈd}|     ¡d||<| 
tj ¡}|  d¡röt }|}|||dƒ}    nd|  d¡r0tjdtƒdt|td}    |r,t|    |<|    S|  d¡rTt }|}
|||
dƒ}    n|  d¡r†t j|d} |dd}
|| |
ƒ}    nÔ|  d¡r¸t j|d} |dd} || | ƒ}    n¢|  d¡rît j|d} |dd d} || | ƒ}    nl|  d!¡r$t j|d"} |d"d#d} || | ƒ}    n6|  d$¡rJ|} t |¡}|| |ƒ}    ntd%|›d&ƒ‚|rht|    |<|    S)'a
    Convert from SIF to datetime. https://www.stata.com/help.cgi?datetime
 
    Parameters
    ----------
    dates : Series
        The Stata Internal Format date to convert to datetime according to fmt
    fmt : str
        The format to convert to. Can be, tc, td, tw, tm, tq, th, ty
        Returns
 
    Returns
    -------
    converted : Series
        The converted dates
 
    Examples
    --------
    >>> dates = pd.Series([52])
    >>> _stata_elapsed_date_to_datetime_vec(dates , "%tw")
    0   1961-01-01
    dtype: datetime64[ns]
 
    Notes
    -----
    datetime/c - tc
        milliseconds since 01jan1960 00:00:00.000, assuming 86,400 s/day
    datetime/C - tC - NOT IMPLEMENTED
        milliseconds since 01jan1960 00:00:00.000, adjusted for leap seconds
    date - td
        days since 01jan1960 (01jan1960 = 0)
    weekly date - tw
        weeks since 1960w1
        This assumes 52 weeks in a year, then adds 7 * remainder of the weeks.
        The datetime value is the start of the week in terms of days in the
        year, not ISO calendar weeks.
    monthly date - tm
        months since 1960m1
    quarterly date - tq
        quarters since 1960q1
    half-yearly date - th
        half-years since 1960h1 yearly
    date - ty
        years since 0000
    r=r>éiéèr-r@csX| ¡ˆkr,| ¡ˆkr,td||ddSt|ddƒ}tdd„t||ƒDƒ|dSdS)    zú
        Convert year and month to datetimes, using pandas vectorized versions
        when the date range falls within the range supported by pandas.
        Otherwise it falls back to a slower but more robust method
        using datetime.
        édz%Y%m©ÚformatÚindexNcSsg|]\}}t ||d¡‘qS©r>)Údatetime)Ú.0ÚyÚm©rMúFd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/io/stata.pyÚ
<listcomp>*szX_stata_elapsed_date_to_datetime_vec.<locals>.convert_year_month_safe.<locals>.<listcomp>©rG)ÚmaxÚminr'Úgetattrr-Úzip)ÚyearÚmonthrG©ÚMAX_YEARÚMIN_YEARrMrNÚconvert_year_month_safes ÿzD_stata_elapsed_date_to_datetime_vec.<locals>.convert_year_month_safecsd| ¡ˆdkr4| ¡ˆkr4t|ddt|ddSt|ddƒ}dd    „t||ƒDƒ}t||d
SdS) z{
        Converts year (e.g. 1999) and days since the start of the year to a
        datetime or datetime64 Series
        r>ú%YrEÚd©ÚunitrGNcSs,g|]$\}}t |dd¡tt|ƒd‘qS)r>©Údays)rIrÚint)rJrKr\rMrMrNrO6sÿzW_stata_elapsed_date_to_datetime_vec.<locals>.convert_year_days_safe.<locals>.<listcomp>rP)rQrRr'r(rSrTr-)rUr`rGÚvaluerWrMrNÚconvert_year_days_safe-s þzC_stata_elapsed_date_to_datetime_vec.<locals>.convert_year_days_safecs°t|ddƒ}|dkrL| ¡ˆks,| ¡ˆkr”‡fdd„|Dƒ}t||dSnH|dkrŒ| ¡ˆksl| ¡ˆkr”‡fdd„|Dƒ}t||dSntd    ƒ‚tˆƒ‰t||d
}ˆ|S) z¾
        Convert base dates and deltas to datetimes, using pandas vectorized
        versions if the deltas satisfy restrictions required to be expressed
        as dates in pandas.
        rGNr\csg|]}ˆtt|ƒd‘qS)r_©rra©rJr\©ÚbaserMrNrOEszS_stata_elapsed_date_to_datetime_vec.<locals>.convert_delta_safe.<locals>.<listcomp>rPÚmscs"g|]}ˆtt|ƒdd‘qS)rC)Ú microsecondsrdrerfrMrNrOIszformat not understoodr])rSrQrRr-Ú
ValueErrorr'r()rgZdeltasr^rGÚvalues)Ú MAX_DAY_DELTAÚ MAX_MS_DELTAÚ MIN_DAY_DELTAÚ MIN_MS_DELTArfrNÚconvert_delta_safe<s 
ÿ z?_stata_elapsed_date_to_datetime_vec.<locals>.convert_delta_safeFTgð?©r4Útcrh©r5ZtCz9Encountered %tC format. Leaving in Stata Internal Format.©Ú
stacklevel©Údtype)r6Útdr7r\r\©r8Útwé4é©r9Útmé ©r:Útqéé©r;Úthéé©r<Útyz    Date fmt ú not understood)r%rRrUrQrIr`ÚnpÚisnanÚanyZ _reset_cacherÚastypeÚint64Ú
startswithr?ÚwarningsÚwarnrr-Úobjectr$Z    ones_likerj)ÚdatesÚfmtrZrcrpZbad_locsZhas_bad_valuesrgrhÚ
conv_datesr`rUrVZ quarter_monthZ first_monthrM)rlrmrXrnrorYrNÚ#_stata_elapsed_date_to_datetime_vecêsp.
 
 þ             
 r—Ústr)r”r•rAcs|j‰d‰ˆd‰d%ddddœ‡‡‡fdd„ }t|ƒ}|j‰| ¡rjt|ƒ}t|ƒrbttƒ||<nt||<|dkrŒ||d    d
}|jd}nD|d kr¬tj    d t
ƒd |}n$|dkrÎ||d    d
}|jˆ}n|dkr||d    d    d}d|j tj |j d}nÎ|dkr4||d    d}d|j tj |j d}nœ|dkrj||d    d}d|j tj |j dd}nf|dkr¢||d    d}d|j tj |j dk t¡}n.|dkrÀ||d    d}|j }ntd|›dƒ‚t|tjd }t d!d"¡d#}|||<t|ˆd$S)&aX
    Convert from datetime to SIF. https://www.stata.com/help.cgi?datetime
 
    Parameters
    ----------
    dates : Series
        Series or array containing datetime.datetime or datetime64[ns] to
        convert to the Stata Internal Format given by fmt
    fmt : str
        The format to convert to. Can be, tc, td, tw, tm, tq, th, ty
    lž"R:rCFÚbool)ÚdeltarUr`c s\i}t|jƒr˜|r:|ttƒ d¡}|j tj¡d|d<|sB|rbt    |ƒ}|j
j |d<|j
j |d<|r–| tj¡t |ddd tj¡}|ˆ|d<n¸t|d    d
d krH|râ|jt}d d dœ‡fdd„ }t |¡}    |    |ƒ|d<|r| dd„¡}
|
jd|d<|
j|dd|d<|rPdddœdd„} t | ¡}    |    |ƒ|d<ntdƒ‚t|ˆdS)NÚnsrCršrUrVr[rEr`F©ZskipnarIzdatetime.timedeltaÚfloat©ÚxrAcsˆ|jd|j|jS)Ni@B)r`Úsecondsri©rŸ)Ú
US_PER_DAYrMrNÚf¶szC_datetime_to_stata_elapsed_vec.<locals>.parse_dates_safe.<locals>.fcSsd|j|jS)NrD)rUrVr¡rMrMrNÚ<lambda>¼ózJ_datetime_to_stata_elapsed_vec.<locals>.parse_dates_safe.<locals>.<lambda>rDzdatetime.datetimeracSs|t |jdd¡jS)Nr>)rIrUr`r¡rMrMrNÚgÁszC_datetime_to_stata_elapsed_vec.<locals>.parse_dates_safe.<locals>.gzZColumns containing dates must contain either datetime64, datetime.datetime or null values.rP)r rwr%r?Zas_unitÚ_valuesÚviewr‹rr#Ú_datarUrVr'rZ    vectorizeÚapplyrjr+) r”ršrUr`r\Z
time_deltaZ
date_indexZ
days_in_nsr£ÚvZ
year_monthr¦©Z
NS_PER_DAYr¢rGrMrNÚparse_dates_safe sF
   ÿþ
 
 
ÿz8_datetime_to_stata_elapsed_vec.<locals>.parse_dates_saferqT)ršrsz'Stata Internal Format tC not supported.rt)r6rxry)rUr`r{r|r})rUrr>r€r‚rƒr„r†r‡rˆúFormat z! is not a known Stata date formatrvú<dóàrrP)FFF)rGr&rr-r r'r?ršr‘r’rrUr`rVrŽrarjr‹Úfloat64ÚstructÚunpack)r”r•r­Zbad_locr\r–Ú missing_valuerMr¬rNÚ_datetime_to_stata_elapsed_vecs\ ÿ. þ 
 
 
  
 "
 rµzÔ
Fixed width strings in Stata .dta files are limited to 244 (or fewer)
characters.  Column '{0}' does not satisfy this restriction. Use the
'version=117' parameter to write the newer (Stata 13 and later) format.
Úexcessive_string_length_errorz™
Column converted from {0} to {1}, and some data are outside of the lossless
conversion range. This may result in a loss of precision in the saved data.
Úprecision_loss_doczä
Stata value labels (pandas categories) must be strings. Column {0} contains
non-string labels which will be converted to strings.  Please check that the
Stata data file created has not lost information due to duplicate labels.
Úvalue_label_mismatch_doca;
Not all pandas column names were valid Stata variable names.
The following replacements have been made:
 
    {0}
 
If this is not what you expect, please make sure you have Stata-compliant
column names in your DataFrame (strings only, max 32 characters, only
alphanumerics and underscores, no Stata reserved words)
Úinvalid_name_docaï
One or more series with value labels are not fully labeled. Reading this
dataset with an iterator results in categorical variable with different
categories. This occurs since it is not possible to know all possible values
until the entire dataset has been read. To avoid this warning, you can either
read dataset without an iterator, or manually convert categorical data by
``convert_categoricals`` to False and then accessing the variable labels
through the value_labels method of the reader.
Úcategorical_conversion_warningr+©ÚdatarAc    CsŽd}tjtjtjftjtjtjftjtjtjftjtjtjftj    tjtj
ff}t   dd¡d}t   dd¡d}|D]ü}t ||jttfƒ}||}| ¡}|rô|| ¡}    |     ¡rÚt ||jtƒrÈdnd}
|
|j|    |f<|| ||jj¡||<||j} |D]„} | | dkr|| ¡t | d¡jkr<| d} n| d    } | d    tjkrr|| ¡d
krrt d d ¡}|| | ¡||<q| tjkrÐ|| ¡d ks¸|| ¡dkrD|| tj¡||<nt| tjkr|| ¡dks|| ¡dkrD|| tj¡||<n,| tjkr¤|| ¡dkr^|| ¡dkr^|| tj¡||<nD|| tj
¡||<|| ¡d
ks–|| ¡dkrDt dd ¡}n | tjtj
fkrDt ||¡ ¡rÚtd|›dƒ‚|| ¡} | tjkr| |kr|| tj
¡||<n2| tj
krD| |krDtd|›d| ›d|›dƒ‚|rr| ¡rrtj||jj }||j||f<qr|rŠt!j"|t#t$ƒd|S)a-
    Checks the dtypes of the columns of a pandas DataFrame for
    compatibility with the data types and ranges supported by Stata, and
    converts if necessary.
 
    Parameters
    ----------
    data : DataFrame
        The DataFrame to check and convert
 
    Notes
    -----
    Numeric columns in Stata must be one of int8, int16, int32, float32 or
    float64, with some additional value restrictions.  int8 and int16 columns
    are checked for violations of the value restrictions and upcast if needed.
    int64 data is not usable in Stata, and so it is downcast to int32 whenever
    the value are in the int32 range, and sidecast to float64 when larger than
    this range.  If the int64 values are outside of the range of those
    perfectly representable as float64 values, a warning is raised.
 
    bool columns are cast to int8.  uint columns are converted to int of the
    same size if there is no loss in precision, otherwise are upcast to a
    larger type.  uint64 is currently not supported since it is concerted to
    object in a DataFrame.
    Úú<fóÿÿÿ~rr¯óÿÿÿÿÿÿßFr>r†lÚuint64r±rDéÿÿÿéäé€ÿÿéäÿÿé€lüÿÿÿrzColumn zM contains infinity or -infinitywhich is outside the range supported by Stata.z has a maximum value (z() outside the range supported by Stata (ú)rt)%r‹Zbool_Úint8Úuint8Úint16Zuint16Úint32Zuint32rrÁr±r²r³Ú
isinstancerwr*r)r&rÚlocrŽZ numpy_dtyperQZiinfor·rFrRÚfloat32ÚisinfrjÚStataMissingValueÚBASE_MISSING_VALUESÚnamer‘r’rr)r¼ÚwsZconversion_dataÚ float32_maxÚ float64_maxÚcolZis_nullable_intÚorigZ orig_missingÚ missing_locZfvrwZc_datarbÚsentinelrMrMrNÚ_cast_to_stata_types's„    ûú
 
 
  $ $ $$
ÿ  
ÿýrÚc@s<eZdZdZdddddœdd„Zd    d
„Zd d d œdd„ZdS)ÚStataValueLabelzé
    Parse a categorical column and prepare formatted output
 
    Parameters
    ----------
    catarray : Series
        Categorical Series to encode
    encoding : {"latin-1", "utf-8"}
        Encoding to use for value labels.
    úlatin-1r-úLiteral[('latin-1', 'utf-8')]ÚNone)ÚcatarrayÚencodingrAcCs^|dkrtdƒ‚|j|_||_|jj}ttt     t
|ƒ¡|ƒƒ|_ |j j dd„d|  ¡dS)N©rÜúutf-8ú%Only latin-1 and utf-8 are supported.cSs|dS©NrrMr¡rMrMrNr¤²r¥z*StataValueLabel.__init__.<locals>.<lambda>©Úkey)rjrÒÚlabnameÚ    _encodingÚcatÚ
categoriesÚlistrTr‹ZarangeÚlenÚ value_labelsÚsortÚ_prepare_value_labels)ÚselfrßràrêrMrMrNÚ__init__§sÿzStataValueLabel.__init__cCs4d|_g|_d|_tjgtjd|_tjgtjd|_d|_g}g}|j    D]Ž}|d}t
|t ƒs‚t |ƒ}t j t |j¡ttƒd| |j¡}| |j¡|jt|ƒd7_| |d¡|j |¡|jd7_qJ|jdkrìtdƒ‚tj|tjd|_tj|tjd|_dd|jd|j|j|_d    S)
zEncode value labels.rrvr>rti}zaStata value labels for a single variable must have a combined length less than 32,000 characters.ér‚N)Útext_lenÚtxtÚnr‹ÚarrayrËÚoffÚvalrìrírÌr˜r‘r’r¸rFrçrrÚencoderèÚappendrj)rðÚoffsetsrkÚvlÚcategoryrMrMrNrï¶s<
 
 
ý   
ÿz%StataValueLabel._prepare_value_labelsr˜Úbytes)Ú    byteorderrAc Cs |j}tƒ}d}| t |d|j¡¡t|jƒdd… |¡}|dkrLdnd}t    ||dƒ}| |¡t
dƒD]}| t d    |¡¡qp| t |d|j ¡¡| t |d|j ¡¡|j D]}| t |d|¡¡q¾|jD]}    | t |d|    ¡¡qà|jD]}
| |
|¡q| ¡S)
a!
        Generate the binary representation of the value labels.
 
        Parameters
        ----------
        byteorder : str
            Byte order of the output
 
        Returns
        -------
        value_label : bytes
            Bytes containing the formatted value label
        óÚiNé )râÚutf8é€r>rƒÚc)rèrÚwriter²Úpackrìr˜rçrùÚ
_pad_bytesÚrangerõrór÷rørôÚgetvalue) rðrÿràÚbioÚ    null_byterçZlab_lenrÚoffsetrbÚtextrMrMrNÚgenerate_value_labelâs&
 
 
 
z$StataValueLabel.generate_value_labelN)rÜ)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rñrïrrMrMrMrNrۛs
 ÿ,rÛc@s&eZdZdZd dddddœdd    „Zd
S) ÚStataNonCatValueLabela 
    Prepare formatted version of value labels
 
    Parameters
    ----------
    labname : str
        Value label name
    value_labels: Dictionary
        Mapping of values to labels
    encoding : {"latin-1", "utf-8"}
        Encoding to use for value labels.
    rÜr˜údict[float, str]rÝrÞ)rçríràrAcCs>|dkrtdƒ‚||_||_t| ¡dd„d|_| ¡dS)NrárãcSs|dSrärMr¡rMrMrNr¤1r¥z0StataNonCatValueLabel.__init__.<locals>.<lambda>rå)rjrçrèÚsortedÚitemsrírï)rðrçríràrMrMrNrñ%sÿzStataNonCatValueLabel.__init__N)rÜ)rrrrrñrMrMrMrNrsürc@s(eZdZUdZiZded<dZded<eD]4Zdee<edd    ƒD]Z    de
d
e    ƒee    e<q@q*d Z d ed <e   dd¡dZded<ed    ƒD]dZ    e   de ¡dZdee<e    dkrÈeee
d
e    ƒ7<e   de  de¡¡deZe  de¡Z qŒdZd ed<e   dd¡dZed    ƒD]hZ    e   de¡dZdee<e    dkrTeee
d
e    ƒ7<e   de  de¡¡deZe  de¡Zqddde   de ¡de   de¡ddœZded<ddd œd!d"„Zed#d$œd%d&„ƒZedd$œd'd(„ƒZd#d$œd)d*„Zd#d$œd+d,„Zd-d.d/œd0d1„Zed2dd3œd4d5„ƒZd6S)7rÐa”
    An observation's missing value.
 
    Parameters
    ----------
    value : {int, float}
        The Stata missing value code
 
    Notes
    -----
    More information: <https://www.stata.com/help.cgi?missing>
 
    Integer missing values make the code '.', '.a', ..., '.z' to the ranges
    101 ... 127 (for int8), 32741 ... 32767  (for int16) and 2147483621 ...
    2147483647 (for int32).  Missing values for floating point data types are
    more complex but the pattern is simple to discern from the following table.
 
    np.float32 missing values (float in Stata)
    0000007f    .
    0008007f    .a
    0010007f    .b
    ...
    00c0007f    .x
    00c8007f    .y
    00d0007f    .z
 
    np.float64 missing values (double in Stata)
    000000000000e07f    .
    000000000001e07f    .a
    000000000002e07f    .b
    ...
    000000000018e07f    .x
    000000000019e07f    .y
    00000000001ae07f    .z
    rÚMISSING_VALUES)éeéåéåÿÿr ÚbasesÚ.r>éé`órþÚ float32_basez<isrraÚ    incrementr¾r°Ú float64_baseÚqsr¯rrr)rÈrÊrËrÎr±rÑrrÞ©rbrAcCs.||_|dkrt|ƒnt|ƒ}|j||_dS)Nl)Ú_valuerarrÚ_str©rðrbrMrMrNrñ€szStataMissingValue.__init__r˜r@cCs|jS)z²
        The Stata representation of the missing value: '.', '.a'..'.z'
 
        Returns
        -------
        str
            The representation of the missing value.
        )r'©rðrMrMrNÚstring†s
zStataMissingValue.stringcCs|jS)z³
        The binary representation of the missing value.
 
        Returns
        -------
        {int, float}
            The binary representation of the missing value.
        )r&r)rMrMrNrb’s
zStataMissingValue.valuecCs|jS©N)r*r)rMrMrNÚ__str__žszStataMissingValue.__str__cCst|ƒ›d|›dS)Nú(rÇ)Útyper)rMrMrNÚ__repr__¡szStataMissingValue.__repr__rr™)ÚotherrAcCs&t|t|ƒƒo$|j|jko$|j|jkSr+)rÌr.r*rb)rðr0rMrMrNÚ__eq__¤s
 
ÿ
ýzStataMissingValue.__eq__únp.dtype)rwrAcCs„|jtjkr|jd}nh|jtjkr0|jd}nP|jtjkrH|jd}n8|jtjkr`|jd}n |jtjkrx|jd}ntdƒ‚|S)NrÈrÊrËrÎr±zUnsupported dtype)    r.r‹rÈrÑrÊrËrÎr±rj)ÚclsrwrbrMrMrNÚget_base_missing_value«s          z(StataMissingValue.get_base_missing_valueN)rrrrrÚ__annotations__rÚbr    rÚchrr!r²r³r"rærZ    int_valuer#rÑrñÚpropertyr*rbr,r/r1Ú classmethodr4rMrMrMrNrÐ6sR
%      
û  rÐc@seZdZddœdd„ZdS)Ú StataParserrÞr@c Cs¾ttttddƒdd„tddƒDƒƒƒdt tj¡fdt tj¡fdt tj¡fdt tj    ¡fd    t tj
¡fgƒ|_ t tj ¡t tj
¡t tj    ¡t tj¡t tj¡t tj¡d
œ|_ tttdƒƒtd ƒƒ|_d d ddddd
œ|_d}d}d}d}dddt     t d|¡d¡t     t d|¡d¡ft 
t d|¡d¡t 
t d|¡d¡fdœ|_ddddd    dœ|_ddd t     t dd!¡d¡t 
t dd"¡d¡dœ|_d#d$d%d&d'd(d)œ|_d*|_dS)+Nr>éõcSsg|]}t dt|ƒ¡‘qS)Úa)r‹rwr˜)rJrrMrMrNrOÎsz(StataParser.__init__.<locals>.<listcomp>éûéüéýéþéÿ)é€éöÿé÷ÿéøÿéùÿéúÿZbhlfdÚQr\r£ÚlÚhr6sÿÿÿþr¿sÿÿÿÿÿÿïÿrÀ)rÂrD)rÄrÃ)rÆrÅr¾rr¯)r6rJrIr£r\)ébéiéléfrDrrrr r°Úi1Úi2Úi4Zf4Zf8Úu8)r6rJrIr£r\rH)<Z    aggregateröÚbooleanÚbreakÚbyteZcaseZcatchÚclassZ    colvectorÚcomplexÚconstÚcontinueÚdefaultZdelegateÚdeleteZdoÚdoubleÚelseZ    eltypedefÚendÚenumÚexplicitÚexportZexternalrÚforZfriendÚfunctionÚglobalÚgotoÚifÚinlineraÚlocalÚlongÚNULLZpragmaZ    protectedZquadZ    rowvectorÚshortZtypedefÚtypenameZvirtualZ_allZ_NZ_skipÚ_bÚ_pizstr#ÚinZ_predZstrLZ_coefZ_rcZusingZ_consZ_seÚwithZ_n)ÚdictrërTr    r‹rwrÈrÊrËrÎr±Ú    DTYPE_MAPrÉÚ DTYPE_MAP_XMLÚtupleÚTYPE_MAPÚ TYPE_MAP_XMLr²r³Ú VALID_RANGEÚOLD_TYPE_MAPPINGrÚNUMPY_TYPE_MAPÚRESERVED_WORDS)rðZ float32_minrÔZ float64_minrÕrMrMrNrñ½sz"ûÿÿ
 
 
 
 
 
úù þþøû ÿû
ú
zStataParser.__init__N)rrrrñrMrMrMrNr:¼sr:csøeZdZUeZded<d‡dddd    ddd
dd d d ddœ ‡fdd„ Zddœdd„Zddœdd„Zddœdd„Z    dddddœdd„Z
ddœdd „Z ddœd!d"„Z d#dœd$d%„Z d#dœd&d'„Zd#dœd(d)„Zd#dœd*d+„Zd#dœd,d-„Zd#dœd.d/„Zd#dœd0d1„Zd#dœd2d3„Zd4dœd5d6„Zd#d7d8œd9d:„Zddœd;d<„Zddœd=d>„Zd#d?d@œdAdB„ZdCdœdDdE„ZdCdœdFdG„ZdCdœdHdI„ZdCdœdJdK„Zd#dœdLdM„ZdNdœdOdP„ZdNdœdQdR„Z d#dœdSdT„Z!d4ddUœdVdW„Z"dXdœdYdZ„Z#d[d#d\œd]d^„Z$d4dNd_œd`da„Z%ddœdbdc„Z&ddœddde„Z'dfdœdgdh„Z(dˆd dfdiœdjdk„Z)e*e+ƒd‰d dldld    dldld
dldfdmœ    dndo„ƒZ,dfddfdpœdqdr„Z-dfdfdsœdtdu„Z.dfdvdfdwœdxdy„Z/dfdzdvddfd{œd|d}„Z0e1dNdœd~d„ƒZ2e1dNdœd€d„ƒZ3d‚dœdƒd„„Z4dzdœd…d†„Z5‡Z6S)ŠÚ StataReaderz    IO[bytes]Ú _path_or_bufTNFÚinferúFilePath | ReadBuffer[bytes]r™ú
str | NoneúSequence[str] | Noneú
int | NonerrrÞ) Ú path_or_bufÚ convert_datesÚconvert_categoricalsÚ    index_colÚconvert_missingÚpreserve_dtypesÚcolumnsÚorder_categoricalsÚ    chunksizeÚ compressionr3rAc sÖtƒ ¡g|_||_||_||_||_||_||_||_    ||_
|
|_ | |_ d|_ |    |_d|_d|_|jdkrvd|_nt|    tƒrˆ|    dkrtdƒ‚d|_d|_d|_d|_d|_d|_d|_d|_d|_ttjƒ|_ dS)Nr½Fr>rz.chunksize must be a positive integer when set.)!ÚsuperrñÚ
_col_sizesÚ_convert_datesÚ_convert_categoricalsÚ
_index_colÚ_convert_missingÚ_preserve_dtypesÚ_columnsÚ_order_categoricalsÚ_original_path_or_bufÚ _compressionÚ_storage_optionsrèÚ
_chunksizeÚ_using_iteratorÚ_enteredrÌrarjÚ _close_fileÚ_has_string_dataZ_missing_valuesÚ_can_read_value_labelsÚ_column_selector_setÚ_value_labels_readÚ
_data_readÚ_dtypeÚ _lines_readÚ_set_endiannessÚsysrÿÚ_native_byteorder) rðr‚rƒr„r…r†r‡rˆr‰rŠr‹r3©Ú    __class__rMrNrñ`s<
 
zStataReader.__init__r@cCst|dƒs| ¡dS)zK
        Ensure the file has been opened and its header data read.
        r|N)ÚhasattrÚ
_open_filer)rMrMrNÚ _ensure_open“s
zStataReader._ensure_openc    Cs–|jstjdttƒdt|jd|jd|jd}t    |j
dƒrX|j
  ¡rX|j
|_ |j |_n*|t|j
 ¡ƒ|_ W5QRX|j j |_| ¡| ¡dS)z^
        Open the file (with compression options, etc.), and read header information.
        zStataReader is being used without using a context manager. Using StataReader as a context manager is the only supported method.rtÚrbF)r3Úis_textr‹ÚseekableN)ršr‘r’ÚResourceWarningrr/r•r—r–r¨Úhandler­r|Úcloser›rÚreadÚ _read_headerÚ _setup_dtype)rðÚhandlesrMrMrNr©šs*üû
 
zStataReader._open_filecCs
d|_|S)zenter context managerT)ršr)rMrMrNÚ    __enter__¹szStataReader.__enter__ztype[BaseException] | NonezBaseException | NonezTracebackType | None)Úexc_typeÚ    exc_valueÚ    tracebackrAcCs|jr| ¡dSr+)r›)rðr¶r·r¸rMrMrNÚ__exit__¾szStataReader.__exit__cCs$tjdttƒd|jr | ¡dS)zØClose the handle if its open.
 
        .. deprecated: 2.0.0
 
           The close method is not part of the public API.
           The only supported way to use StataReader is to use it as a context manager.
        z¹The StataReader.close() method is not part of the public API and will be removed in a future version without notice. Using StataReader as a context manager is the only supported method.rtN)r‘r’Ú FutureWarningrr›r)rMrMrNr°ÇsûzStataReader.closecCs|jdkrd|_nd|_dS)zC
        Set string encoding which depends on file version
        évrÜrâN)Ú_format_versionrèr)rMrMrNÚ _set_encodingÙs
zStataReader._set_encodingracCst d|j d¡¡dS)Nr6r>r©r²r³r|r±r)rMrMrNÚ
_read_int8âszStataReader._read_int8cCst d|j d¡¡dS)NÚBr>rr¾r)rMrMrNÚ _read_uint8åszStataReader._read_uint8cCs t |j›d|j d¡¡dS)NÚHr†r©r²r³Ú
_byteorderr|r±r)rMrMrNÚ _read_uint16èszStataReader._read_uint16cCs t |j›d|j d¡¡dS)NÚIr‚rrÃr)rMrMrNÚ _read_uint32ëszStataReader._read_uint32cCs t |j›d|j d¡¡dS)NrHròrrÃr)rMrMrNÚ _read_uint64îszStataReader._read_uint64cCs t |j›d|j d¡¡dS)NrJr†rrÃr)rMrMrNÚ _read_int16ñszStataReader._read_int16cCs t |j›d|j d¡¡dS)Nrr‚rrÃr)rMrMrNÚ _read_int32ôszStataReader._read_int32cCs t |j›d|j d¡¡dS)Nr$ròrrÃr)rMrMrNÚ _read_int64÷szStataReader._read_int64rþcCst d|j d¡¡dS)Nrr>rr¾r)rMrMrNÚ _read_char8úszStataReader._read_char8ztuple[int, ...])ÚcountrAcCs&t |j›d|›|j d|¡¡S)NrJr†rÃ)rðrÍrMrMrNÚ_read_int16_countýsþzStataReader._read_int16_countcsXˆ ¡}|dkrˆ ¡n
ˆ |¡tdd„ˆjDƒƒdkˆ_‡fdd„ˆjDƒˆ_dS)Nó<cSsg|]}t|ƒtkr|‘qSrM)r.ra©rJrŸrMrMrNrO
s z,StataReader._read_header.<locals>.<listcomp>rcsg|]}ˆ |¡‘qSrM)Ú    _calcsize©rJÚtypr)rMrNrO s)rÌÚ_read_new_headerÚ_read_old_headerrìÚ_typlistrœr)rðÚ
first_charrMr)rNr²s 
 
zStataReader._read_headercCs|j d¡t|j d¡ƒ|_|jdkr:ttj|jdƒ‚| ¡|j d¡|j d¡dkrbdnd|_|j d    ¡|jd
kr†|     ¡n| 
¡|_ |j d ¡|  ¡|_ |j d ¡| ¡|_|j d ¡| ¡|_|j d¡|j d¡|j d¡| ¡d|_| ¡d|_| ¡d|_| ¡d|_| ¡d |_| ¡|_|j d¡| ¡d|_| ¡d |_| ¡d|_| |j¡\|_|_|j  |j¡| !¡|_"|j  |j¡| #|j d¡dd…|_$|j  |j¡| %¡|_&|j  |j¡| '¡|_(|j  |j¡| )¡|_*dS)Nrrƒ©éur»éw©ÚversionésMSFú>ú<ér»r|é ééròéé
é    r‡ér>éÿÿÿÿ)+r|r±rar¼rjÚ_version_errorrFr½rÄrÅrÇÚ_nvarÚ    _get_nobsÚ_nobsÚ_get_data_labelÚ _data_labelÚ_get_time_stampÚ _time_stamprËZ_seek_vartypesZ_seek_varnamesZ_seek_sortlistZ _seek_formatsÚ_seek_value_label_namesÚ_get_seek_variable_labelsZ_seek_variable_labelsÚ_data_locationÚ _seek_strlsÚ_seek_value_labelsÚ _get_dtypesrÖÚ    _dtyplistÚseekÚ _get_varlistÚ_varlistrÎÚ_srtlistÚ _get_fmtlistÚ_fmtlistÚ _get_lbllistÚ_lbllistÚ_get_variable_labelsÚ_variable_labelsr)rMrMrNrÔsP 
  ÿ 
 
 
 
 
 
 
zStataReader._read_new_headerz,tuple[list[int | str], list[str | np.dtype]])Ú seek_vartypesrAcsxˆj |¡‡fdd„tˆjƒDƒ}dddœ‡fdd„ ‰‡fdd„|Dƒ}dd    dœ‡fd
d „ ‰‡fd d„|Dƒ}||fS) Ncsg|] }ˆ ¡‘qSrM)rÅ©rJÚ_r)rMrNrOKsz+StataReader._get_dtypes.<locals>.<listcomp>raú    int | str)rÓrAc
sR|dkr |Sz ˆj|WStk
rL}ztd|›dƒ|‚W5d}~XYnXdS)Néýúcannot convert stata types [ú])rvÚKeyErrorrj©rÓÚerrr)rMrNr£Ms  z"StataReader._get_dtypes.<locals>.fcsg|] }ˆ|ƒ‘qSrMrMrÐ)r£rMrNrOUszstr | np.dtypec
sV|dkrt|ƒSz ˆj|WStk
rP}ztd|›dƒ|‚W5d}~XYnXdS)Nrzcannot convert stata dtype [r)r˜rsr    rjr
r)rMrNr¦Ws  z"StataReader._get_dtypes.<locals>.gcsg|] }ˆ|ƒ‘qSrMrMrÐ)r¦rMrNrO_s)r|rør    rê)rðrZ raw_typlistÚtyplistÚdtyplistrM)r£r¦rðrNröGs zStataReader._get_dtypesz    list[str]cs,ˆjdkrdnd‰‡‡fdd„tˆjƒDƒS)Nr»é!écsg|]}ˆ ˆj ˆ¡¡‘qSrM©Ú_decoder|r±r©r6rðrMrNrOfsz,StataReader._get_varlist.<locals>.<listcomp>©r¼r    rêr)rMrrNrùcszStataReader._get_varlistcsNˆjdkrd‰n$ˆjdkr d‰nˆjdkr0d‰nd‰‡‡fdd    „tˆjƒDƒS)
Nr»é9éqé1éhrr|csg|]}ˆ ˆj ˆ¡¡‘qSrMrrrrMrNrOssz,StataReader._get_fmtlist.<locals>.<listcomp>rr)rMrrNrüis
 
 
zStataReader._get_fmtlistcs>ˆjdkrd‰nˆjdkr d‰nd‰‡‡fdd„tˆjƒDƒS)Nr»rrMrræcsg|]}ˆ ˆj ˆ¡¡‘qSrMrrrrMrNrO}sz,StataReader._get_lbllist.<locals>.<listcomp>rr)rMrrNrþvs 
 
zStataReader._get_lbllistcsdˆjdkr$‡fdd„tˆjƒDƒ}n<ˆjdkrH‡fdd„tˆjƒDƒ}n‡fdd„tˆjƒDƒ}|S)Nr»csg|]}ˆ ˆj d¡¡‘qS)iArrr)rMrNrOsz4StataReader._get_variable_labels.<locals>.<listcomp>rLcsg|]}ˆ ˆj d¡¡‘qS)éQrrr)rMrNrO…scsg|]}ˆ ˆj d¡¡‘qS)rrrr)rMrNrO‰sr)rðZvlblistrMr)rNrs
 
ÿ
 
ÿ
ÿz StataReader._get_variable_labelscCs|jdkr| ¡S| ¡SdS)Nr»)r¼rÈrÇr)rMrMrNrëŽs
zStataReader._get_nobsr˜cCsz|jdkr$| ¡}| |j |¡¡S|jdkrH| ¡}| |j |¡¡S|jdkrd| |j d¡¡S| |j d¡¡SdS)Nr»rÙrLrr)r¼rÅrr|r±r¿©rðZstrlenrMrMrNrí”s
 
 
zStataReader._get_data_labelcCsn|jdkr$| ¡}|j |¡ d¡S|jdkrH| ¡}| |j |¡¡S|jdkrd| |j d¡¡Stƒ‚dS)Nr»rârÙré)r¼r¿r|r±ÚdecoderrjrrMrMrNrï s
 
 
zStataReader._get_time_stampcCsN|jdkr.|j d¡|jd|jddS|jdkrD| ¡dStƒ‚dS)NrÙròréér»)r¼r|r±rñrêrËrjr)rMrMrNrò¬s 
 
 z%StataReader._get_seek_variable_labels)r×rAc
s¢t|dƒˆ_ˆjdkr*ttjˆjdƒ‚ˆ ¡ˆ ¡dkrBdndˆ_ˆ ¡ˆ_ˆj     
d¡ˆ  ¡ˆ_ ˆ  ¡ˆ_ˆ ¡ˆ_ˆ ¡ˆ_ˆjdkrªdd    „ˆj     
ˆj ¡Dƒ}nVˆj     
ˆj ¡}tj|tjd
}g}|D].}|ˆjkrð| ˆj|¡qÐ| |d ¡qÐz‡fd d    „|Dƒˆ_WnJtk
rb}z*d  dd    „|Dƒ¡}td|›dƒ|‚W5d}~XYnXz‡fdd    „|Dƒˆ_WnJtk
rÆ}z*d  dd    „|Dƒ¡}td|›dƒ|‚W5d}~XYnXˆjdkrð‡fdd    „tˆj ƒDƒˆ_n‡fdd    „tˆj ƒDƒˆ_ˆ ˆj d¡dd…ˆ_ˆ ¡ˆ_ ˆ !¡ˆ_"ˆ #¡ˆ_$ˆjdkr’ˆ ¡}    ˆjdkrlˆ %¡}
nˆ &¡}
|    dkr‚q’ˆj     
|
¡qNˆj     '¡ˆ_(dS)Nr)rrLrMéorérésrÛr>rÞrßrMcSsg|] }t|ƒ‘qSrM)ra©rJrrMrMrNrOÊsz0StataReader._read_old_header.<locals>.<listcomp>rvécsg|]}ˆj|‘qSrM)rurÒr)rMrNrOÖsú,cSsg|] }t|ƒ‘qSrM©r˜rÐrMrMrNrOØsrrcsg|]}ˆj|‘qSrM)rrrÒr)rMrNrOÛscSsg|] }t|ƒ‘qSrMr$rÐrMrMrNrOÝszcannot convert stata dtypes [csg|]}ˆ ˆj d¡¡‘qS)rrrr)rMrNrOáscsg|]}ˆ ˆj d¡¡‘qS)rærrr)rMrNrOåsrèr))rar¼rjrérFr½r¿rÄZ    _filetyper|r±rÅrêrërìrírîrïrðr‹Ú
frombufferrÉrxrúrÖÚjoinr÷r    rúrÎrûrürýrþrÿrrrÊrÉÚtellró) rðr×r ÚbufZtyplistbÚtpr Z invalid_typesZinvalid_dtypesZ    data_typeZdata_lenrMr)rNrÕ¸sd
 
 
 
 
 
 
 
$$ 
ÿ
 
ÿ
 
 
 
 
zStataReader._read_old_headerr2cCsŽ|jdk    r|jSg}t|jƒD]\\}}||jkr`tt|ƒ}| d|›|j›|j|›f¡q| d|›d|›f¡qt     |¡|_|jS)z"Map between numpy and state dtypesNÚsÚS)
r¡Ú    enumeraterÖryrr˜rúrÄr‹rw)rðÚdtypesrrÓrMrMrNr³s
 
 
& zStataReader._setup_dtyper©r•rAcCst|tƒr|St |j|¡Sr+)rÌrar²ÚcalcsizerÄ©rðr•rMrMrNrÑs
zStataReader._calcsize©r*rAcCsd| d¡d}z| |j¡WStk
r^|j}d|›d}tj|ttƒd| d¡YSXdS)Nrrz@
One or more strings in the dta file could not be decoded using zÍ, and
so the fallback encoding of latin-1 is being used.  This can happen when a file
has been incorrectly encoded by Stata or some other software. You should verify
the string values returned are correct.rtrÜ)Ú    partitionrrèÚUnicodeDecodeErrorr‘r’ÚUnicodeWarningr)rðr*ràÚmsgrMrMrNrsÿýzStataReader._decodec Csê| ¡|jrdS|jdkr,d|_i|_dS|jdkrF|j |j¡n.|jdk    sTt‚|j    |jj
}|j |j |¡d|_i|_|jdkrž|j  d¡dkržqà|j  d¡}|s²qà|jdkrÐ|  |j  d¡¡}n|  |j  d¡¡}|j  d    ¡| ¡}| ¡}tj|j  d|¡|j›d
|d }tj|j  d|¡|j›d
|d }t |¡}||}||}|j  |¡}    i|j|<t|ƒD]H}
|
|d krœ||
d n|} |  |    ||
| …¡|j|||
<q~|jdkr€|j  d ¡q€d|_dS)NrMTrÙés</valr‚rrrƒrQ©rwrÍr>r‡)rªrŸr¼Ú_value_label_dictr|rørõr¡ÚAssertionErrorrìÚitemsizerór±rrÇr‹r%rÄZargsortr    ) rðr ZslengthrçrõZtxtlenr÷røÚiirôrr^rMrMrNÚ_read_value_labels-sb
 
 
 
 
ÿ
ÿ
 
 ÿ
zStataReader._read_value_labelscCs|j |j¡ddi|_|j d¡dkr,q|jdkr@| ¡}nr|j d¡}|jdkrZdnd}|jd    kr†|d
|…|d d|…}n|d
|…|d |d…}t     d |¡d
}| 
¡}|  ¡}|j |¡}|d krì|d
d…  |j ¡}nt|ƒ}||jt|ƒ<qdS)NÚ0r½rƒsGSOrÙrr»r†rßrr‚rHé‚rè)r|rørôÚGSOr±r¼rÈrÄr²r³rÁrÇrrèr˜)rðZv_or(Zv_sizerÓÚlengthÚvaZ
decoded_varMrMrNÚ _read_strlsfs&
 
 
 
 zStataReader._read_strlsr+cCsd|_|j|jdS)NT©Únrows)r™r±r˜r)rMrMrNÚ__next__…szStataReader.__next__)ÚsizerAcCs|dkr|j}|j|dS)a
        Reads lines from Stata file and returns as dataframe
 
        Parameters
        ----------
        size : int, defaults to None
            Number of lines to read.  If None, reads whole file.
 
        Returns
        -------
        DataFrame
        NrC)r˜r±)rðrFrMrMrNÚ    get_chunk‰s zStataReader.get_chunkz bool | None)    rDrƒr„r…r†r‡rˆr‰rAc        s”| ¡|jdkr2|dkr2d|_d|_t|jdS|dkr@|j}|dkrN|j}|dkr\|j}|dkrj|j    }|dkrx|j
}|dkr†|j }|dkr”|j }|dkr¢|j}|j dkrÀ|jsÀd|_| ¡|jdk    sÎt‚|j}    |j|j|    j}
||    j} t| |
ƒ} | dkr|r| ¡t‚|j|    j} |j |j| ¡t||j|jƒ} tj|j | ¡|    | d}|j| 7_|j|jkr†d|_d|_|j|jkr | ¡  ¡}|r®| ¡t!|ƒdkrÊt|jd}nt "|¡}t#|jƒ|_$|dkrt%|j| |jƒ}t#|ƒ|_&|dk    r| '||¡}t(||j)ƒD]0\}}t*|ƒt+kr(||j,|j-dd||<q(| .|¡}t /dd„|j0Dƒ¡d}|j&}d    }g}|D]‚}|j0|dk    r|j$|}||j1}    |    t 1t2¡krþ|    |j0|krþd}| 3|t4||||j0|ƒf¡n| 3|||f¡q|r(t 5t6|ƒ¡}~| 7||¡}|r˜d
d d œd d„‰t /‡fdd„|j8Dƒ¡d}|D](}|j$|}t9|||j8|ƒ||<qn|r¾|j dkr¾| :||j;|j<|¡}|svg}d    }|D]}||j1}    |    t 1tj=¡t 1tj>¡fkrt 1tj?¡}    d}n8|    t 1tj@¡t 1tjA¡t 1tjB¡fkrFt 1tjC¡}    d}| 3||| D|    ¡f¡qÐ|rvt 5t6|ƒ¡}|dk    r| E| F|¡¡}|S)NrT©rˆrÙr7)Z convert_dtypecSsg|] }|dk    ‘qSr+rM)rJZdtyprMrMrNrOúsz$StataReader.read.<locals>.<listcomp>Fr˜r™ržcst‡fdd„tDƒƒS)Nc3s|]}ˆ |¡VqdSr+)r)rJr•r¡rMrNÚ    <genexpr>sz;StataReader.read.<locals>.any_startswith.<locals>.<genexpr>)rÚ _date_formatsr¡rMr¡rNÚany_startswithsz(StataReader.read.<locals>.any_startswithcsg|] }ˆ|ƒ‘qSrMrMrЩrKrMrNrOsrM)Grªrìrr r+rúrŽrr‘r’r“r”rr¼rŸrBr¡r9r¢r:rRr<Ú StopIterationr|rørór‹r%r±rÄr¥ZbyteswapÚ newbyteorderrìZ from_recordsr,rˆr    rGÚ_do_select_columnsrTrÖr.rarªrÚ _insert_strlsÚwherer÷rwr“rúr-Ú    from_dictrqÚ_do_convert_missingrýr—Ú_do_convert_categoricalsr8rÿÚfloat16rÎr±rÈrÊrËrrŽZ    set_indexÚpop)rðrDrƒr„r…r†r‡rˆr‰rwZ max_read_lenÚread_lenr Ú
read_linesÚraw_datar¼ÚrngrÖrÓZcols_ÚixZrequires_type_conversionÚdata_formattedrÚcolsZ retyped_dataÚconvertrMrLrNr±šsê  
 
 
 
ÿ 
 
 
 
 
 
 
 ÿ 
ÿ ÿ
 
 
 
ý 
zStataReader.read)r¼r†rAcCsRi}t|ƒD]\}}|j|}||jkr,q tt|ƒ}|j|\}}||}    |    j}
|
|k|
|kB} |  ¡slq |rØt t     | ¡¡d} tj
|    | dd\} }t |    t d}t| ƒD]&\}}t |ƒ}| ||k}||j|<q®nJ|    j}|tjtjfkrôtj}t |    |d}|jjds| ¡}tj|j| <|||<q |rN| ¡D]\}}|||<q:|S)NrT)Zreturn_inverservZ    WRITEABLE)r,rÖrwrr˜r§rr‹ZnonzeroZasarrayÚuniquer-r“rÐÚilocrwrÎr±ÚflagsÚcopyÚnanr)rðr¼r†Ú replacementsrÚcolnamer•ZnminZnmaxZseriesZsvalsÚmissingrØZumissingZ umissing_locÚ replacementÚjZumr´rÍrwrÖrbrMrMrNrS9s@
 
 
 
 zStataReader._do_convert_missingr»csltˆdƒrtˆjƒdkr|StˆjƒD]@\}}|dkr8q&‡fdd„|jdd…|fDƒ|jdd…|f<q&|S)Nr?rrHcsg|]}ˆjt|ƒ‘qSrM)r?r˜)rJÚkr)rMrNrOosz-StataReader._insert_strls.<locals>.<listcomp>)r¨rìr?r,rÖr`)rðr¼rrÓrMr)rNrPhs0zStataReader._insert_strlsú Sequence[str])r¼rˆrAc CsÞ|jsÖt|ƒ}t|ƒt|ƒkr&tdƒ‚| |j¡}|rRd t|ƒ¡}td|›ƒ‚g}g}g}g}    |D]P}
|j |
¡} |     |j
| ¡|     |j | ¡|     |j | ¡|         |j | ¡qf||_
||_ ||_ |    |_ d|_||S)Nz"columns contains duplicate entriesz, z<The following columns were not found in the Stata data set: T)ržÚsetrìrjÚ
differencerˆr&rëZget_locrúr÷rÖrýrÿ) rðr¼rˆZ
column_setÚ    unmatchedZjoinedr r ÚfmtlistÚlbllistrÖrrMrMrNrOrs4 ÿ zStataReader._do_select_columnszdict[str, dict[float, str]])r¼Úvalue_label_dictror‰rAc Cs¨t| ¡ƒ}g}t||ƒD]v\}}||kr€||}    t t|     ¡ƒ¡}
||} |  |
¡} |jrn|  ¡rn|
} n|jr†tj    t
t t ƒdd} t | | |d}| dkrÔg}|jD]&}||    krÆ| |    |¡qª| |¡qªn t|     ¡ƒ}z| |¡}Wnptk
r^}zPt|dd ¡}t|j|dkƒ}dd |¡}d    |›d
|›d}t|ƒ|‚W5d}~XYnXt||jdd }| ||f¡q| |||f¡qtt|ƒdd}|S) zC
        Converts categorical columns to Categorical type.
        rtN)rêZorderedF)rbr>zQ--------------------------------------------------------------------------------
r1z
Value labels for column a are not unique. These cannot be converted to
pandas categoricals.
 
Either read the file with `convert_categoricals` set to False or use the
low level interface in `StataReader` to separately read the values and the
value_labels.
 
The repeated labels are:
)rGrb)rëÚkeysrTr‹röÚisinr™Úallr‘r’rºrrr"rêrúrkZrename_categoriesrjr-Z value_countsrGr&r+rq)rðr¼rpror‰ríZcat_converted_datarÖÚlabelrürqÚcolumnZ key_matchesZinitial_categoriesZcat_datarêrýr ZvcZ repeated_catsZrepeatsr5Z
cat_seriesrMrMrNrT’s\
 
 
ýÿ
 ÿ    ÷ z$StataReader._do_convert_categoricalscCs| ¡|jS)z2
        Return data label of Stata file.
        )rªrîr)rMrMrNÚ
data_labelßszStataReader.data_labelcCs| ¡|jS)z2
        Return time stamp of Stata file.
        )rªrðr)rMrMrNÚ
time_stampçszStataReader.time_stampzdict[str, str]cCs| ¡tt|j|jƒƒS)z†
        Return a dict associating each variable name with corresponding label.
 
        Returns
        -------
        dict
        )rªrqrTrúrr)rMrMrNÚvariable_labelsïszStataReader.variable_labelscCs|js| ¡|jS)z‹
        Return a nested dict associating each variable name to its value and label.
 
        Returns
        -------
        dict
        )rŸr<r8r)rMrMrNríúszStataReader.value_labels)
TTNFTNTNr}N)N)NNNNNNNN)7rrrÚ_stata_reader_docrr5rñrªr©rµr¹r°r½r¿rÁrÅrÇrÈrÉrÊrËrÌrÎr²rÔrörùrürþrrërírïròrÕr³rÑrr<rBrErGrÚ_read_method_docr±rSrPrOrTr8rvrwrxríÚ __classcell__rMrMr¦rNr{[sŠ
ô*3         8        K9÷"/
 M r{TFr}) rƒr„r…r†r‡rˆr‰rŠÚiteratorr‹r3r~r™rr€rrrzDataFrame | StataReader) r2rƒr„r…r†r‡rˆr‰rŠr|r‹r3rAc CsNt|||||||||| |
d } |    s&|r*| S| |  ¡W5QR£SQRXdS)N)
rƒr„r…r†r‡rˆr‰rŠr3r‹)r{r±) r2rƒr„r…r†r‡rˆr‰rŠr|r‹r3ÚreaderrMrMrNÚ
read_statas"õr~)Ú
endiannessrAcCs4| ¡dkrdS| ¡dkr dStd|›dƒ‚dS)N)rßÚlittlerß)rÞÚbigrÞz Endianness rŠ)Úlowerrj)rrMrMrNr£-s
  r£r    ra)rÒr@rAcCs2t|tƒr|d|t|ƒS|d|t|ƒS)zQ
    Take a char string and pads it with null bytes until it's length chars.
    rú)rÌrþrì©rÒr@rMrMrNr6s
rr2r.cCs(|dkrt tj¡Std|›dƒ‚dS)zK
    Convert from one of the stata date formats to a type in TYPE_MAP.
    )rrr4rxr6rzr8r~r9rr:r…r;r‰r<r®z not implementedN)r‹rwr±ÚNotImplementedError)r•rMrMrNÚ_convert_datetime_to_stata_type?s r†rqzlist[Hashable])rƒÚvarlistrAcCsvi}|D]h}|| d¡s*d||||<||krL| | |¡||i¡qt|tƒs^tdƒ‚| |||i¡q|S)Nú%z0convert_dates key must be a column or an integer)rÚupdaterGrÌrarj)rƒr‡Znew_dictrærMrMrNÚ_maybe_convert_to_int_keysXs
rŠ)rwrurAcCsˆ|jtjkr$tt|jƒƒ}t|dƒS|jtjkr4dS|jtjkrDdS|jtj    krTdS|jtj
krddS|jtj krtdSt d|›dƒ‚d    S)
aõ
    Convert dtype types to stata types. Returns the byte of the given ordinal.
    See TYPE_MAP and comments for an explanation. This is also explained in
    the dta spec.
    1 - 244 are strings of this length
                         Pandas    Stata
    251 - for int8      byte
    252 - for int16     int
    253 - for int32     long
    254 - for float32   float
    255 - for double    double
 
    If there are dates to convert, then dtype will already have the correct
    type inserted.
    r>rAr@r?r>r=ú
Data type ú not supported.N© r.r‹Úobject_rrr§rQr±rÎrËrÊrÈr…)rwrur:rMrMrNÚ_dtype_to_stata_typefs 
     rr)ruÚ dta_versionÚ
force_strlrAcCsÀ|dkrd}n d}|rdS|jtjkrntt|jƒƒ}||krX|dkrHdStt |j    ¡ƒ‚dt
t |dƒƒdS|tj kr|dS|tj krŠd    S|tjkr˜d
S|tjtjfkr¬d Std |›d ƒ‚dS)a¢
    Map numpy dtype to stata's default format for this type. Not terribly
    important since users can change this in Stata. Semantics are
 
    object  -> "%DDs" where DD is the length of the string.  If not a string,
                raise ValueError
    float64 -> "%10.0g"
    float32 -> "%9.0g"
    int64   -> "%9.0g"
    int32   -> "%12.0g"
    int16   -> "%8.0g"
    int8    -> "%8.0g"
    strl    -> "%9s"
    rÙéôrz%9srˆr>r*z%10.0gz%9.0gz%12.0gz%8.0gr‹rŒN)r.r‹rŽrrr§rjr¶rFrÒr˜rQr±rÎrËrÈrÊr…)rwrurr‘Ú max_str_lenr:rMrMrNÚ_dtype_to_default_stata_fmtŠs* 
 
 
r”Úcompression_optionsÚfname)r3r•cs,eZdZUdZdZdZded<dcdd    œd
d d d dddd dddddœ ‡fdd„Zdddœdd„Zdddœdd„Z    d dd œd!d"„Z
d d d œd#d$„Z d d d œd%d&„Z dd'œd(d)„Z ddd*œd+d,„Zd d d œd-d.„Zd/dd0œd1d2„Zd dd œd3d4„Zdd'œd5d6„Zdd'œd7d8„Zdd'œd9d:„Zdd'œd;d<„Zdd'œd=d>„Zdd'œd?d@„Zdd'œdAdB„Zdd'œdCdD„Zdd'œdEdF„ZddddddGœdHdI„Zdd'œdJdK„Zdd'œdLdM„Zdd'œdNdO„Zdd'œdPdQ„Zdd'œdRdS„Z dd'œdTdU„Z!d d d œdVdW„Z"dXd'œdYdZ„Z#dXdd[œd\d]„Z$e%ddd^œd_d`„ƒZ&ddd^œdadb„Z'‡Z(S)eÚ StataWritera½
    A class for writing Stata binary dta files
 
    Parameters
    ----------
    fname : path (string), buffer or path object
        string, path object (pathlib.Path or py._path.local.LocalPath) or
        object implementing a binary write() functions. If using a buffer
        then the buffer will not be automatically closed after the file
        is written.
    data : DataFrame
        Input to save
    convert_dates : dict
        Dictionary mapping columns containing datetime types to stata internal
        format to use when writing the dates. Options are 'tc', 'td', 'tm',
        'tw', 'th', 'tq', 'ty'. Column can be either an integer or a name.
        Datetime columns that do not have a conversion type specified will be
        converted to 'tc'. Raises NotImplementedError if a datetime column has
        timezone information
    write_index : bool
        Write the index to Stata dataset.
    byteorder : str
        Can be ">", "<", "little", or "big". default is `sys.byteorder`
    time_stamp : datetime
        A datetime to use as file creation date.  Default is the current time
    data_label : str
        A label for the data set.  Must be 80 characters or smaller.
    variable_labels : dict
        Dictionary containing columns as keys and variable labels as values.
        Each label must be 80 characters or smaller.
    {compression_options}
 
        .. versionadded:: 1.1.0
 
        .. versionchanged:: 1.4.0 Zstandard support.
 
    {storage_options}
 
        .. versionadded:: 1.2.0
 
    value_labels : dict of dicts
        Dictionary containing columns as keys and dictionaries of column value
        to labels as values. The combined length of all labels for a single
        variable must be 32,000 characters or smaller.
 
        .. versionadded:: 1.4.0
 
    Returns
    -------
    writer : StataWriter instance
        The StataWriter instance has a write_file method, which will
        write the file to the given `fname`.
 
    Raises
    ------
    NotImplementedError
        * If datetimes contain timezone information
    ValueError
        * Columns listed in convert_dates are neither datetime64[ns]
          or datetime.datetime
        * Column dtype is not representable in Stata
        * Column listed in convert_dates is not in DataFrame
        * Categorical label contains more than 32,000 characters
 
    Examples
    --------
    >>> data = pd.DataFrame([[1.0, 1]], columns=['a', 'b'])
    >>> writer = StataWriter('./data_file.dta', data)
    >>> writer.write_file()
 
    Directly write a zip file
    >>> compression = {{"method": "zip", "archive_name": "data_file.dta"}}
    >>> writer = StataWriter('./data_file.zip', data, compression=compression)
    >>> writer.write_file()
 
    Save a DataFrame with dates
    >>> from datetime import datetime
    >>> data = pd.DataFrame([[datetime(2000,1,1)]], columns=['date'])
    >>> writer = StataWriter('./date_data_file.dta', data, {{'date' : 'tw'}})
    >>> writer.write_file()
    r’rÜrÝrèNTr}©ríúFilePath | WriteBuffer[bytes]r+údict[Hashable, str] | Noner™rúdatetime.datetime | Nonerrú'dict[Hashable, dict[float, str]] | NonerÞ) r–r¼rƒÚ write_indexrÿrwrvrxr‹r3rírAc  s®tƒ ¡||_|dkrin||_||_||_||_||_| |_g|_    t
j gt d|_ |    |_d|_i|_| |¡|
|_|dkr†tj}t|ƒ|_||_t
jt
jt
jdœ|_dS)Nrv)r?r>r=)rŒrñr¼rŽÚ _write_indexrðrîrÚ_non_cat_value_labelsÚ _value_labelsr‹rör™Ú_has_value_labelsr–Ú _output_fileÚ_converted_namesÚ_prepare_pandasr3r¤rÿr£rÄÚ_fnamerËrÊrÈZtype_converters) rðr–r¼rƒrrÿrwrvrxr‹r3rír¦rMrNrñ    s(
 
 
zStataWriter.__init__r˜)Úto_writerAcCs|jj | |j¡¡dS)zS
        Helper to call encode before writing to file for Python 3 compat.
        N)r´r¯rrùrè)rðr¦rMrMrNÚ_write7    szStataWriter._writerþr%cCs|jj |¡dS)z?
        Helper to assert file is open before writing.
        N)r´r¯rr(rMrMrNÚ _write_bytes=    szStataWriter._write_byteszlist[StataNonCatValueLabel]r»cCsšg}|jdkr|S|j ¡D]x\}}||jkr:|j|}n$||jkrNt|ƒ}ntd|›dƒ‚t||jƒs|td|›dƒ‚t    |||j
ƒ}|  |¡q|S)zc
        Check for value labels provided for non-categorical columns. Value
        labels
        NzCan't create value labels for z!, it wasn't found in the dataset.z6, value labels can only be applied to numeric columns.) rŸrr£rˆr˜r    r!rwrjrrèrú)rðr¼Únon_cat_value_labelsrçÚlabelsreÚsvlrMrMrNÚ_prepare_non_cat_value_labelsC    s$
 
 
 
 
ÿ
ÿ z)StataWriter._prepare_non_cat_value_labelsc
s@‡fdd„ˆDƒ}t|ƒsˆS|jt |¡O_tj}g}tˆ|ƒD]ê\}}|rtˆ||jd}|j     
|¡ˆ|j j j }|tjkr’tdƒ‚ˆ|j j j ¡}    |     ¡||ƒkrþ|tjkrÌt  tj¡}n$|tjkrät  tj¡}n t  tj¡}tj|    |d}    ||ƒ|    |    dk<| 
||    f¡qF| 
|ˆ|f¡qFt t|ƒ¡S)zŠ
        Check for categorical columns, retain categorical information for
        Stata file and convert categorical data to int
        csg|]}tˆ|jƒ‘qSrM)rrw©rJrÖ©r¼rMrNrOi    sz5StataWriter._prepare_categoricals.<locals>.<listcomp>)ràzCIt is not possible to export int64-based categorical data to Stata.rvrè)rr¡r‹rörÐr4rTrÛrèr rúréÚcodesrwrrjr§rbrQrÈrÊrËr±r+rRrq)
rðr¼Zis_catr4r\rÖZ
col_is_catr«rwrkrMr®rNÚ_prepare_categoricalsd    s6 
ÿ
 
 z!StataWriter._prepare_categoricalscCsZ|D]P}||j}|tjtjfkr|tjkr8|jd}n
|jd}|| |¡||<q|S)z†
        Checks floating point data columns for nans, and replaces these with
        the generic Stata for missing value (.)
        r£r\)rwr‹rÎr±rÚfillna)rðr¼rrwrgrMrMrNÚ _replace_nansŽ    s
 
 
zStataWriter._replace_nansr@cCsdS)zNo-op, forward compatibilityNrMr)rMrMrNÚ_update_strl_namesŸ    szStataWriter._update_strl_names©rÒrAcCsR|D]H}|dks|dkr|dks(|dkr|dks8|dkr|dkr| |d¡}q|S)aŠ
        Validate variable names for Stata export.
 
        Parameters
        ----------
        name : str
            Variable name
 
        Returns
        -------
        str
            The validated name with invalid characters replaced with
            underscores.
 
        Notes
        -----
        Stata 114 and 117 support ascii characters in a-z, A-Z, 0-9
        and _.
        ÚAÚZr<Úzr=Ú9r)Úreplace©rðrÒrrMrMrNÚ_validate_variable_name¢    s"ÿÿþþýýüz#StataWriter._validate_variable_namecCs¦i}t|jƒ}|dd…}d}t|ƒD]Ê\}}|}t|tƒsDt|ƒ}| |¡}||jkr`d|}d|dkrxdkr„nnd|}|dtt|ƒdƒ…}||ksè|     |¡dkràdt|ƒ|}|dtt|ƒdƒ…}|d7}q¢|||<|||<q&t
|ƒ|_|j r<t ||ƒD],\}    }
|    |
kr|j |
|j |    <|j |
=q|r”g} |  ¡D]"\}}|›d|›} |  | ¡qNt d     | ¡¡} tj| ttƒd
||_| ¡|S) aÌ
        Checks column names to ensure that they are valid Stata column names.
        This includes checks for:
            * Non-string names
            * Stata keywords
            * Variables that start with numbers
            * Variables with names that are too long
 
        When an illegal variable name is detected, it is converted, and if
        dates are exported, the variable name is propagated to the date
        conversion dictionary
        Nrrr=r¸rr>z   ->   z
    rt)rërˆr,rÌr˜r»rzrRrìrÍr,rŽrTrrúr¹rFr&r‘r’rrr£r³)rðr¼Zconverted_namesrˆZoriginal_columnsZduplicate_var_idrhrÒÚ    orig_namerÚoZconversion_warningr5rÓrMrMrNÚ_check_column_namesÀ    sR 
 
 
 
 
 
 
 
 ýzStataWriter._check_column_namesr-©r-rAcCsRg|_g|_| ¡D]8\}}|j t||j|ƒ¡|j t||j|ƒ¡qdSr+)rnr rrúr”r¼r)rðr-rÖrwrMrMrNÚ_set_formats_and_types    
s
z"StataWriter._set_formats_and_typesc
Cst| ¡}|jr$| ¡}t|tƒr$|}| |¡}t|ƒ}| |¡}t     d|j
d¡|_ |  |¡}dd„|Dƒ}|j  |¡}|j |O_ |j |¡| |¡}|j
\|_|_||_|j  ¡|_|j}|D]&}||jkrÖqÆt||ƒrÆd|j|<qÆt|j|jƒ|_|jD]"}t|j|ƒ}    t |    ¡||<q| ¡| |¡|jdk    rp|jD]"}t|tƒrL|j||j |<qLdS)NFr>cSsg|]
}|j‘qSrM)rç)rJr«rMrMrNrO+
sz/StataWriter._prepare_pandas.<locals>.<listcomp>rr)!rbržZ reset_indexrÌr+r¾rÚr²r‹ÚrepeatÚshaper¡r¬rˆrrr Úextendr°ÚnobsÚnvarr¼Útolistr‡r-rŽr rŠr†rwÚ_encode_stringsrÀrarn)
rðr¼Útempr©Znon_cat_columnsZhas_non_cat_val_labelsr-rÖræÚnew_typerMrMrNr¤
sJ
 
 
 
 
 
  ÿ
 
 
 zStataWriter._prepare_pandasc    CsÀ|j}t|dgƒ}t|jƒD]ž\}}||ks||kr6q|j|}|j}|jtjkrt|dd}|dksˆt    |ƒdksˆ|j
}t d|›dƒ‚|j|j   |j¡}tt|jƒƒ|jkr||j|<qdS)    zõ
        Encode strings in dta-specific encoding
 
        Do not encode columns marked for date conversion or for strL
        conversion. The strL converter independently handles conversion and
        also accepts empty string arrays.
        Ú _convert_strlTrœr*rzColumn `a` cannot be exported.
 
Only string-like object arrays
containing all strings or a mix of strings and None can be exported.
Object arrays containing only null values are prohibited. Other object
types cannot be exported and must first be converted to one of the
supported types.N)rŽrSr,r¼rwr.r‹rŽrrìrÒrjr˜rùrèrrr§Ú_max_string_length)    rðrƒÚ convert_strlrrÖrurwZinferred_dtypeÚencodedrMrMrNrÇR
s, 
  ÿÿ ÿÿzStataWriter._encode_stringsc Cs˜t|jd|jd|jdt|_|jjddk    rV|jjtƒ|_|j_|jj     
|jj¡z˜|j |j |j d| ¡| ¡| ¡| ¡| ¡| ¡| ¡| ¡| ¡| ¡}| |¡| ¡| ¡| ¡| ¡| ¡Wnštk
rˆ}zz|j ¡t|jt t!j"fƒrtt!j# $|j¡rtzt! %|j¡Wn2t&k
rrt'j(d|j›dt)t*ƒd    YnX|‚W5d}~XYnXW5QRXdS)
z>
        Export DataFrame object to Stata dta format.
        ÚwbF)r‹r¬r3ÚmethodN)rvrwz!This save was not successful but z. could not be deleted. This file is not valid.rt)+r/r¥r–r3r´r‹r¯rr¢Zcreated_handlesrúÚ _write_headerrîrðÚ
_write_mapÚ_write_variable_typesÚ_write_varnamesÚ_write_sortlistÚ_write_formatsÚ_write_value_label_namesÚ_write_variable_labelsÚ_write_expansion_fieldsÚ_write_characteristicsÚ _prepare_dataÚ _write_dataÚ _write_strlsÚ_write_value_labelsÚ_write_file_close_tagÚ_closeÚ    Exceptionr°rÌr˜ÚosÚPathLikeÚpathÚisfileÚunlinkÚOSErrorr‘r’r®r)rðÚrecordsÚexcrMrMrNÚ
write_filew
s\ûÿ
 
ÿ ü zStataWriter.write_filecCsF|jdk    rBt|jjtƒst‚|jj|j}|j_|jj | ¡¡dS)zÌ
        Close the file if it was created by the writer.
 
        If a buffer or file-like object was passed in, for example a GzipFile,
        then leave this file open for the caller to close.
        N)r¢rÌr´r¯rr9rr
)rðr rMrMrNr߬
s
zStataWriter._closecCsdS©úNo-op, future compatibilityNrMr)rMrMrNrѹ
szStataWriter._write_mapcCsdSrêrMr)rMrMrNrÞ¼
sz!StataWriter._write_file_close_tagcCsdSrêrMr)rMrMrNrÙ¿
sz"StataWriter._write_characteristicscCsdSrêrMr)rMrMrNrÜÂ
szStataWriter._write_strlscCs| tddƒ¡dS)z"Write 5 zeros for expansion fieldsr½r6N)r§rr)rMrMrNrØÅ
sz#StataWriter._write_expansion_fieldscCs"|jD]}| | |j¡¡qdSr+)r r¨rrÄ)rðrürMrMrNrÝÉ
s
zStataWriter._write_value_labels©rvrwrAc CsH|j}| t dd¡¡| |dkr(dp*d¡| d¡| d¡| t |d|j¡dd…¡| t |d    |j¡dd
…¡|dkr¢| | td d ƒ¡¡n| | t|dd …d ƒ¡¡|dkrÔt    j     
¡}nt |t    j    ƒsèt d ƒ‚ddddddddddddg }dd„t |ƒDƒ}| d¡||j| d¡}| | |¡¡dS)Nr6rrÞúúrƒrJr†rr‚r½éPú"time_stamp should be datetime typeÚJanÚFebÚMarÚAprÚMayÚJunÚJulÚAugÚSepÚOctÚNovÚDeccSsi|]\}}|d|“qSrHrM©rJrrVrMrMrNÚ
<dictcomp>ü
sz-StataWriter._write_header.<locals>.<dictcomp>ú%d ú     %Y %H:%M)rÄr¨r²rr§rÅrÄÚ_null_terminate_bytesrrIÚnowrÌrjr,ÚstrftimerV)rðrvrwrÿÚmonthsÚ month_lookupÚtsrMrMrNrÐÍ
sJ
 
  ÿ  ôÿþÿzStataWriter._write_headercCs"|jD]}| t d|¡¡qdS)NrÀ)r r¨r²r)rðrÓrMrMrNrÒ s
z!StataWriter._write_variable_typescCs6|jD]*}| |¡}t|dd…dƒ}| |¡qdS)Nrr)r‡Ú_null_terminate_strrr§)rðrÒrMrMrNrÓ s
 
zStataWriter._write_varnamescCs"tdd|jdƒ}| |¡dS)Nr½r†r>)rrÅr§)rðZsrtlistrMrMrNrÔ szStataWriter._write_sortlistcCs |jD]}| t|dƒ¡qdS)Nr)rnr§rr0rMrMrNrÕ s
zStataWriter._write_formatscCs`t|jƒD]P}|j|rJ|j|}| |¡}t|dd…dƒ}| |¡q
| tddƒ¡q
dS)Nrrr½)r    rÅr¡r‡rrr§)rðrrÒrMrMrNrÖ s
 
 
 z$StataWriter._write_value_label_namescCs¤tddƒ}|jdkr2t|jƒD]}| |¡qdS|jD]f}||jkr”|j|}t|ƒdkrdtdƒ‚tdd„|Dƒƒ}|s‚tdƒ‚| t|dƒ¡q8| |¡q8dS)Nr½rrïú.Variable labels must be 80 characters or fewercss|]}t|ƒdkVqdS)éN)Úordr!rMrMrNrI4 sz5StataWriter._write_variable_labels.<locals>.<genexpr>zKVariable labels must contain only characters that can be encoded in Latin-1)    rrr    rÅr§r¼rìrjrs)rðÚblankrrÖrtZ    is_latin1rMrMrNr×& s"
 
 
 
 
 ÿz"StataWriter._write_variable_labelscCs|S)rërM)rðr¼rMrMrNÚ_convert_strls> szStataWriter._convert_strlsz np.recarrayc Cs|j}|j}|j}|jdk    rNt|ƒD](\}}||kr$t|||j|ƒ||<q$| |¡}i}|jtt    j
ƒk}t|ƒD]€\}}||}||j krÒ||  d¡j t|fd||<d|›}    |    ||<|| |    ¡||<qt||j}
|sì|
 |j¡}
|
||<qt|jd|dS)Nr½)Úargsr+F)rGZ column_dtypes)r¼r rŽr,rµrnr rÄr£r¤rÿrËr±rªrrŽrwrNZ
to_records) rðr¼r rƒrrÖr-Znative_byteorderrÓÚstyperwrMrMrNrÚB s2
ÿ
 
 
 
 
 
zStataWriter._prepare_data)rçrAcCs| | ¡¡dSr+)r¨Útobytes©rðrçrMrMrNrÛb szStataWriter._write_datar1cCs |d7}|S)NrƒrM)r*rMrMrNre szStataWriter._null_terminate_strcCs| |¡ |j¡Sr+)rrùrè)rðr*rMrMrNrj sz!StataWriter._null_terminate_bytes)NTNNNNr}N)NN))rrrrrËrèr5rñr§r¨r¬r°r²r³r»r¾rÀr¤rÇrérßrÑrÞrÙrÜrØrÝrÐrÒrÓrÔrÕrÖr×r rÚrÛÚ staticmethodrrr{rMrMr¦rNr—·s`
R õ ó,&!*IB%5 ý7  r—)rwrur‘rAcCs |rdS|jtjkr<tt|jƒƒ}t|dƒ}|dkr8|SdS|jtjkrLdS|jtjkr\dS|jtj    krldS|jtj
kr|dS|jtj krŒdSt d    |›d
ƒ‚d S) a
    Converts dtype types to stata types. Returns the byte of the given ordinal.
    See TYPE_MAP and comments for an explanation. This is also explained in
    the dta spec.
    1 - 2045 are strings of this length
                Pandas    Stata
    32768 - for object    strL
    65526 - for int8      byte
    65527 - for int16     int
    65528 - for int32     long
    65529 - for float32   float
    65530 - for double    double
 
    If there are dates to convert, then dtype will already have the correct
    type inserted.
    rBr>rrCrDrErFrGr‹rŒNr)rwrur‘r:rMrMrNÚ_dtype_to_stata_type_117n s& 
     rú str | bytesrþcCs(t|tƒrt|dƒ}|d|t|ƒS)zU
    Takes a bytes instance and pads it with null bytes until it's length chars.
    râr)rÌr˜rþrìr„rMrMrNÚ_pad_bytes_new˜ s
 
rc@sVeZdZdZddddddd    œd
d „Zd dd œdd„Zddœdd„Zdddœdd„ZdS)ÚStataStrLWriteraÑ
    Converter for Stata StrLs
 
    Stata StrLs map 8 byte values to strings which are stored using a
    dictionary-like format where strings are keyed to two values.
 
    Parameters
    ----------
    df : DataFrame
        DataFrame to convert
    columns : Sequence[str]
        List of columns names to convert to StrL
    version : int, optional
        dta version.  Currently supports 117, 118 and 119
    byteorder : str, optional
        Can be ">", "<", "little", or "big". default is `sys.byteorder`
 
    Notes
    -----
    Supports creation of the StrL block of a dta file for dta versions
    117, 118 and 119.  These differ in how the GSO is stored.  118 and
    119 store the GSO lookup value as a uint32 and a uint64, while 117
    uses two uint32s. 118 and 119 also encode all strings as unicode
    which is required by the format.  117 uses 'latin-1' a fixed width
    encoding that extends the 7-bit ascii table with an additional 128
    characters.
    rÙNr+rjrarrÞ)ÚdfrˆrÜrÿrAcCsž|dkrtdƒ‚||_||_||_ddi|_|dkr:tj}t|ƒ|_d}d}d|_    |dkrjd    }d}d
|_    n|d krxd }nd }ddd||_
||_ ||_ dS)NrØz,Only dta versions 117, 118 and 119 supportedr½©rrrÆrHrârÙr‚rÜr»r‡r6r†rò) rjZ_dta_verrrˆÚ
_gso_tabler¤rÿr£rÄrèÚ_o_offetÚ _gso_o_typeÚ _gso_v_type)rðrrˆrÜrÿZ
gso_v_typeZ
gso_o_typeZo_sizerMrMrNrñ¾ s,
 
zStataStrLWriter.__init__ztuple[int, int])rærAcCs|\}}||j|Sr+)r)rðrær«r½rMrMrNÚ _convert_keyß szStataStrLWriter._convert_keyz,tuple[dict[str, tuple[int, int]], DataFrame]r@csü|j}|j}t|jƒ‰||j}‡fdd„|jDƒ}tj|jtjd}t|     ¡ƒD]x\}\}}t|ƒD]b\}    \}
} ||
} | dkr†dn| } | 
| d¡} | dkr¶| d|df} | || <|  | ¡|||    f<qfqRt|jƒD]\}}
|dd…|f||
<qÖ||fS)aø
        Generates the GSO lookup table for the DataFrame
 
        Returns
        -------
        gso_table : dict
            Ordered dictionary using the string found as keys
            and their lookup position (v,o) as values
        gso_df : DataFrame
            DataFrame where strl columns have been converted to
            (v,o) values
 
        Notes
        -----
        Modifies the DataFrame in-place.
 
        The DataFrame returned encodes the (v,o) values as uint64s. The
        encoding depends on the dta version, and can be expressed as
 
        enc = v + o * 2 ** (o_size * 8)
 
        so that v is stored in the lower bits and o is in the upper
        bits. o_size is
 
          * 117: 4
          * 118: 6
          * 119: 5
        csg|]}|ˆ |¡f‘qSrMrPr­rHrMrNrO sz2StataStrLWriter.generate_table.<locals>.<listcomp>rvNr½r>) rrrërˆr‹ÚemptyrÂrÁr,ZiterrowsÚgetr)rðÚ    gso_tableZgso_dfÚselectedZ    col_indexrqr½ÚidxÚrowrhrÖr«rørærrMrHrNÚgenerate_tableã s$
 
 zStataStrLWriter.generate_tablezdict[str, tuple[int, int]]rþ)rrAcCsòtƒ}tddƒ}t |jdd¡}t |jdd¡}|j|j}|j|j}|jd}| ¡D]Š\}    }
|
dkrpq^|
\} } | |¡| t || ¡¡| t || ¡¡| |¡t|    dƒ} | t |t    | ƒd    ¡¡| | ¡| |¡q^| 
¡S)
aç
        Generates the binary blob of GSOs that is written to the dta file.
 
        Parameters
        ----------
        gso_table : dict
            Ordered dictionary (str, vo)
 
        Returns
        -------
        gso : bytes
            Binary content of dta file to be placed between strl tags
 
        Notes
        -----
        Output format depends on dta version.  117 uses two uint32s to
        express v and o while 118+ uses a uint32 for v and a uint64 for o.
        r?ÚasciirÀr>rrÆrrâr>) rrþr²rrÄrrrrrìr
)rðrr ZgsoZgso_typeÚnullZv_typeZo_typeZlen_typeZstrlZvor«r½Z utf8_stringrMrMrNÚ generate_blob s(
 
 
 
 
 
 zStataStrLWriter.generate_blob)rÙN)rrrrrñrr#r&rMrMrMrNr¡ s û!3rcsleZdZdZdZdZdFddœdd    d
d d d d d
ddddddœ ‡fdd„Zeddddœdd„ƒZdddœdd„Z    dGd d ddœd d!„Z
dd"œd#d$„Z dd"œd%d&„Z dd"œd'd(„Z dd"œd)d*„Zdd"œd+d,„Zdd"œd-d.„Zdd"œd/d0„Zdd"œd1d2„Zdd"œd3d4„Zdd"œd5d6„Zdd"œd7d8„Zdd"œd9d:„Zdd"œd;d<„Zdd"œd=d>„Zd    d    d?œd@dA„ZdBddCœdDdE„Z‡ZS)HÚStataWriter117a«
    A class for writing Stata binary dta files in Stata 13 format (117)
 
    Parameters
    ----------
    fname : path (string), buffer or path object
        string, path object (pathlib.Path or py._path.local.LocalPath) or
        object implementing a binary write() functions. If using a buffer
        then the buffer will not be automatically closed after the file
        is written.
    data : DataFrame
        Input to save
    convert_dates : dict
        Dictionary mapping columns containing datetime types to stata internal
        format to use when writing the dates. Options are 'tc', 'td', 'tm',
        'tw', 'th', 'tq', 'ty'. Column can be either an integer or a name.
        Datetime columns that do not have a conversion type specified will be
        converted to 'tc'. Raises NotImplementedError if a datetime column has
        timezone information
    write_index : bool
        Write the index to Stata dataset.
    byteorder : str
        Can be ">", "<", "little", or "big". default is `sys.byteorder`
    time_stamp : datetime
        A datetime to use as file creation date.  Default is the current time
    data_label : str
        A label for the data set.  Must be 80 characters or smaller.
    variable_labels : dict
        Dictionary containing columns as keys and variable labels as values.
        Each label must be 80 characters or smaller.
    convert_strl : list
        List of columns names to convert to Stata StrL format.  Columns with
        more than 2045 characters are automatically written as StrL.
        Smaller columns can be converted by including the column name.  Using
        StrLs can reduce output file size when strings are longer than 8
        characters, and either frequently repeated or sparse.
    {compression_options}
 
        .. versionadded:: 1.1.0
 
        .. versionchanged:: 1.4.0 Zstandard support.
 
    value_labels : dict of dicts
        Dictionary containing columns as keys and dictionaries of column value
        to labels as values. The combined length of all labels for a single
        variable must be 32,000 characters or smaller.
 
        .. versionadded:: 1.4.0
 
    Returns
    -------
    writer : StataWriter117 instance
        The StataWriter117 instance has a write_file method, which will
        write the file to the given `fname`.
 
    Raises
    ------
    NotImplementedError
        * If datetimes contain timezone information
    ValueError
        * Columns listed in convert_dates are neither datetime64[ns]
          or datetime.datetime
        * Column dtype is not representable in Stata
        * Column listed in convert_dates is not in DataFrame
        * Categorical label contains more than 32,000 characters
 
    Examples
    --------
    >>> data = pd.DataFrame([[1.0, 1, 'a']], columns=['a', 'b', 'c'])
    >>> writer = pd.io.stata.StataWriter117('./data_file.dta', data)
    >>> writer.write_file()
 
    Directly write a zip file
    >>> compression = {"method": "zip", "archive_name": "data_file.dta"}
    >>> writer = pd.io.stata.StataWriter117(
    ...     './data_file.zip', data, compression=compression
    ...     )
    >>> writer.write_file()
 
    Or with long strings stored in strl format
    >>> data = pd.DataFrame([['A relatively long string'], [''], ['']],
    ...                     columns=['strls'])
    >>> writer = pd.io.stata.StataWriter117(
    ...     './data_file_with_long_strings.dta', data, convert_strl=['strls'])
    >>> writer.write_file()
    rrÙNTr}r˜r™r+ršr™rr›úSequence[Hashable] | NonerrrœrÞ) r–r¼rƒrrÿrwrvrxrÌr‹r3rírAc  sLg|_|    dk    r|j |    ¡tƒj||||||||| |
| d i|_d|_dS)N)rÿrwrvrxrír‹r3r¥)rÊrÃrŒrñÚ_mapÚ
_strl_blob) rðr–r¼rƒrrÿrwrvrxrÌr‹r3rír¦rMrNrñ± s$ õ zStataWriter117.__init__rr˜rþ)røÚtagrAcCs<t|tƒrt|dƒ}td|ddƒ|td|ddƒS)zSurround val with <tag></tag>rârßrÞz</)rÌr˜rþ)rør+rMrMrNÚ_tagÖ s
 
zStataWriter117._tag)r+rAcCs&|jjdk    st‚|jj ¡|j|<dS)z.Update map location for tag with file positionN)r´r¯r9r'r))rðr+rMrMrNÚ _update_mapÝ szStataWriter117._update_maprìc CsÒ|j}| tddƒ¡tƒ}| | tt|jƒdƒd¡¡| | |dkrNdpPdd¡¡|jdkrfd    nd
}| | t     |||j
¡d ¡¡|jd kr˜d
nd }| | t     |||j ¡d¡¡|dk    rÐ|dd…nd}|  |j ¡}|jd krîdnd    }    t     ||    t|ƒ¡}
|
|}| | |d¡¡|dkr6tj ¡}nt|tjƒsLtdƒ‚dddddddddddd g } d!d"„t| ƒDƒ} | d#¡| |j| d$¡} d%t| dƒ}| | |d&¡¡| | | ¡d'¡¡dS)(zWrite the file headerz <stata_dta>râÚreleaserÞZMSFZLSFrÿr»rÂrÆÚKrÙrHÚNNrïr½rÀrtrðrñròrórôrõrör÷rørùrúrûrücSsi|]\}}|d|“qSrHrMrýrMrMrNrþ sz0StataWriter117._write_header.<locals>.<dictcomp>rÿróÚ    timestampÚheader)rÄr¨rþrrr,r˜Ú _dta_versionr²rrÅrÄrùrèrìrIrrÌrjr,rrVr
)rðrvrwrÿr Z    nvar_typeZ    nobs_sizertZ encoded_labelZ
label_sizeZ    label_lenrrrZstata_tsrMrMrNrÐâ sT   
 ôÿþÿzStataWriter117._write_headerr@cCsŽ|js2d|jj ¡dddddddddddddœ|_|jj |jd¡tƒ}|j ¡D]}| t     |j
d|¡¡qV|  |  |  ¡d¡¡dS)zÇ
        Called twice during file write. The first populates the values in
        the map with 0s.  The second call writes the final map locations when
        all blocks have been written.
        r)Z
stata_dataÚmapÚvariable_typesÚvarnamesÚsortlistÚformatsÚvalue_label_namesrxÚcharacteristicsr¼ÚstrlsríÚstata_data_closeú end-of-filer5rHN)r)r´r¯r'rørrkrr²rrÄr¨r,r
)rðr rørMrMrNrÑ s*
òzStataWriter117._write_mapcCsN| d¡tƒ}|jD]}| t |jd|¡¡q| | |     ¡d¡¡dS)Nr6rÂ)
r-rr rr²rrÄr¨r,r
)rðr rÓrMrMrNrÒ: s
 
 
z$StataWriter117._write_variable_typescCsz| d¡tƒ}|jdkrdnd}|jD]6}| |¡}t|dd… |j¡|dƒ}| |¡q(|     | 
|  ¡d¡¡dS)Nr7rÙrrr>) r-rr4r‡rrrùrèrr¨r,r
)rðr Zvn_lenrÒrMrMrNrÓA s
 
 
 zStataWriter117._write_varnamescCs@| d¡|jdkrdnd}| | d||jdd¡¡dS)Nr8rÚr†r‚rr>)r-r4r¨r,rÅ)rðZ    sort_sizerMrMrNrÔL s
zStataWriter117._write_sortlistcCs`| d¡tƒ}|jdkrdnd}|jD]}| t| |j¡|ƒ¡q(| |     | 
¡d¡¡dS)Nr9rÙrr) r-rr4rnrrrùrèr¨r,r
)rðr Zfmt_lenr•rMrMrNrÕQ s 
 
zStataWriter117._write_formatscCs–| d¡tƒ}|jdkrdnd}t|jƒD]N}d}|j|rH|j|}| |¡}t|dd…     |j
¡|dƒ}|  |¡q,|  |  | ¡d¡¡dS)Nr:rÙrrr½r>)r-rr4r    rÅr¡r‡rrrùrèrr¨r,r
)rðr Úvl_lenrrÒÚ encoded_namerMrMrNrÖY s
 
 
 
 z'StataWriter117._write_value_label_namesc     Cs"| d¡tƒ}|jdkrdnd}td|dƒ}|jdkrnt|jƒD]}| |¡qD| |     | 
¡d¡¡dS|j D]’}||jkrü|j|}t |ƒdkr t dƒ‚z| |j¡}Wn4tk
rä}zt d|j›ƒ|‚W5d}~XYnX| t||dƒ¡qt| |¡qt| |     | 
¡d¡¡dS)    NrxrÙrïi@r½r>rzDVariable labels must contain only characters that can be encoded in )r-rr4rrr    rÅrr¨r,r
r¼rìrjrùrèÚUnicodeEncodeError)    rðr r?r rrÖrtrÍr rMrMrNr×h s2
 
 
 
 
 
ÿý z%StataWriter117._write_variable_labelscCs | d¡| | dd¡¡dS)Nr;r¥)r-r¨r,r)rMrMrNrÙˆ s
z%StataWriter117._write_characteristicscCs0| d¡| d¡| | ¡¡| d¡dS)Nr¼s<data>s</data>)r-r¨rrrMrMrNrÛŒ s
 
zStataWriter117._write_datacCs"| d¡| | |jd¡¡dS)Nr<)r-r¨r,r*r)rMrMrNrÜ’ s
zStataWriter117._write_strlscCsdS)zNo-op in dta 117+NrMr)rMrMrNrØ– sz&StataWriter117._write_expansion_fieldscCsX| d¡tƒ}|jD]&}| |j¡}| |d¡}| |¡q| | | ¡d¡¡dS)NríZlbl)    r-rr rrÄr,rr¨r
)rðr rüZlabrMrMrNrÝ™ s
 
   z"StataWriter117._write_value_labelscCs(| d¡| tddƒ¡| d¡dS)Nr=z </stata_dta>râr>)r-r¨rþr)rMrMrNrÞ¢ s
z$StataWriter117._write_file_close_tagcCs8|j ¡D](\}}||jkr
|j |¡}||j|<q
dS)z†
        Update column names for conversion to strl if they might have been
        changed to comply with Stata naming rules
        N)r£rrÊrG)rðr×Únewr!rMrMrNr³§ s
 z!StataWriter117._update_strl_namesr»csJ‡fdd„t|ƒDƒ}|rFt||ˆjd}| ¡\}}|}| |¡ˆ_|S)zg
        Convert columns to StrLs if either very large or in the
        convert_strl variable
        cs,g|]$\}}ˆj|dks$|ˆjkr|‘qS)rB)r rÊ)rJrrÖr)rMrNrO· s
þz1StataWriter117._convert_strls.<locals>.<listcomp>rÛ)r,rr4r#r&r*)rðr¼Z convert_colsZsswÚtabZnew_datarMr)rNr ² s
þ  zStataWriter117._convert_strlsr-r¿cCsjg|_g|_| ¡D]P\}}||jk}t||j||j|d}|j |¡|j t||j||ƒ¡qdS)N)rr‘)    r rnrrÊr”r¼r4rúr)rðr-rÖrwr‘r•rMrMrNrÀÄ s
ü ÿz%StataWriter117._set_formats_and_types)    NTNNNNNr}N)NN)rrrrrËr4rñrr,r-rÐrÑrÒrÓrÔrÕrÖr×rÙrÛrÜrØrÝrÞr³r rÀr{rMrMr¦rNr'V sJWôò.%ý:       r'csfeZdZUdZdZded<dddœd    d
d d d dd d dddddddœ‡fdd„Zdddœdd„Z‡ZS)ÚStataWriterUTF8u
    Stata binary dta file writing in Stata 15 (118) and 16 (119) formats
 
    DTA 118 and 119 format files support unicode string data (both fixed
    and strL) format. Unicode is also supported in value labels, variable
    labels and the dataset label. Format 119 is automatically used if the
    file contains more than 32,767 variables.
 
    Parameters
    ----------
    fname : path (string), buffer or path object
        string, path object (pathlib.Path or py._path.local.LocalPath) or
        object implementing a binary write() functions. If using a buffer
        then the buffer will not be automatically closed after the file
        is written.
    data : DataFrame
        Input to save
    convert_dates : dict, default None
        Dictionary mapping columns containing datetime types to stata internal
        format to use when writing the dates. Options are 'tc', 'td', 'tm',
        'tw', 'th', 'tq', 'ty'. Column can be either an integer or a name.
        Datetime columns that do not have a conversion type specified will be
        converted to 'tc'. Raises NotImplementedError if a datetime column has
        timezone information
    write_index : bool, default True
        Write the index to Stata dataset.
    byteorder : str, default None
        Can be ">", "<", "little", or "big". default is `sys.byteorder`
    time_stamp : datetime, default None
        A datetime to use as file creation date.  Default is the current time
    data_label : str, default None
        A label for the data set.  Must be 80 characters or smaller.
    variable_labels : dict, default None
        Dictionary containing columns as keys and variable labels as values.
        Each label must be 80 characters or smaller.
    convert_strl : list, default None
        List of columns names to convert to Stata StrL format.  Columns with
        more than 2045 characters are automatically written as StrL.
        Smaller columns can be converted by including the column name.  Using
        StrLs can reduce output file size when strings are longer than 8
        characters, and either frequently repeated or sparse.
    version : int, default None
        The dta version to use. By default, uses the size of data to determine
        the version. 118 is used if data.shape[1] <= 32767, and 119 is used
        for storing larger DataFrames.
    {compression_options}
 
        .. versionadded:: 1.1.0
 
        .. versionchanged:: 1.4.0 Zstandard support.
 
    value_labels : dict of dicts
        Dictionary containing columns as keys and dictionaries of column value
        to labels as values. The combined length of all labels for a single
        variable must be 32,000 characters or smaller.
 
        .. versionadded:: 1.4.0
 
    Returns
    -------
    StataWriterUTF8
        The instance has a write_file method, which will write the file to the
        given `fname`.
 
    Raises
    ------
    NotImplementedError
        * If datetimes contain timezone information
    ValueError
        * Columns listed in convert_dates are neither datetime64[ns]
          or datetime.datetime
        * Column dtype is not representable in Stata
        * Column listed in convert_dates is not in DataFrame
        * Categorical label contains more than 32,000 characters
 
    Examples
    --------
    Using Unicode data and column names
 
    >>> from pandas.io.stata import StataWriterUTF8
    >>> data = pd.DataFrame([[1.0, 1, 'á´¬']], columns=['a', 'β', 'ĉ'])
    >>> writer = StataWriterUTF8('./data_file.dta', data)
    >>> writer.write_file()
 
    Directly write a zip file
    >>> compression = {"method": "zip", "archive_name": "data_file.dta"}
    >>> writer = StataWriterUTF8('./data_file.zip', data, compression=compression)
    >>> writer.write_file()
 
    Or with long strings stored in strl format
 
    >>> data = pd.DataFrame([['ᴀ relatively long Åtring'], [''], ['']],
    ...                     columns=['strls'])
    >>> writer = StataWriterUTF8('./data_file_with_long_strings.dta', data,
    ...                          convert_strl=['strls'])
    >>> writer.write_file()
    râzLiteral['utf-8']rèNTr}r˜r™r+ršr™rr›r(rrrrœrÞ)r–r¼rƒrrÿrwrvrxrÌrÜr‹r3rírAc s~|
dkr |jddkrdnd}
n0|
dkr2tdƒ‚n|
dkrP|jddkrPtdƒ‚tƒj||||||||| |    | | d |
|_dS)    Nr>iÿr»rÚ)r»rÚz"version must be either 118 or 119.zKYou must use version 119 for data sets containing more than32,767 variables)
rƒrrÿrwrvrxrírÌr‹r3)rÂrjrŒrñr4)rðr–r¼rƒrrÿrwrvrxrÌrÜr‹r3rír¦rMrNrñ:s.
ÿôzStataWriterUTF8.__init__r˜r´cCs€|D]v}t|ƒdkrL|dks$|dkrL|dks4|dkrL|dksD|dkrL|dksndt|ƒkrdd    ksnn|d
kr| |d¡}q|S) aÕ
        Validate variable names for Stata export.
 
        Parameters
        ----------
        name : str
            Variable name
 
        Returns
        -------
        str
            The validated name with invalid characters replaced with
            underscores.
 
        Notes
        -----
        Stata 118+ support most unicode characters. The only limitation is in
        the ascii range where the characters supported are a-z, A-Z, 0-9 and _.
        rrµr¶r<r·r=r¸réÀ>õ×õ÷)r
r¹rºrMrMrNr»fs4
þýýüüûûúøø    ÷ z'StataWriterUTF8._validate_variable_name)
NTNNNNNNr}N)    rrrrrèr5rñr»r{rMrMr¦rNrDÕ s 
b óñ0,rD)rF)srÚ
__future__rÚ collectionsrrIÚiorrár²r¤ÚtypesrÚtypingrrrr    r
r r r rr‘Zdateutil.relativedeltarÚnumpyr‹Zpandas._libs.librZpandas._libs.writersrZpandas._typingrrrrrZ pandas.errorsrrrrZpandas.util._decoratorsrrZpandas.util._exceptionsrZpandas.core.dtypes.commonrrr r!Zpandasr"r#r$r%r&r'r(Zpandas.core.arrays.booleanr)Zpandas.core.arrays.integerr*Zpandas.core.framer+Zpandas.core.indexes.baser,Zpandas.core.seriesr-Zpandas.core.shared_docsr.Zpandas.io.commonr/r0réZ_statafile_processing_params1Z_statafile_processing_params2Z_chunksize_paramsZ_iterator_paramsZ _reader_notesZ_read_stata_docrzryrJr?r5r—rµr¶r·r¸r¹rºrÚrÛrrÐr:ÚIteratorr{r~r£rr†rŠrr”r—rrrr'rDrMrMrMrNÚ<module>s     ,     $            ÿñðïî
íìá:ùøø    ÷
ö õ ôò'l    t| 4ó,$        %ÿ-
þ8*    6