zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
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
U
¬ý°dÿDã @sþddlmZddlmZmZddlZddlZddlmZm    Z    m
Z
ddl Z ddl mZddlmZmZddlZddlmZddd    œd
d „Zd)dddddœdd„Zddddddœdd„Zddddœdd„Zd*ddddœdd„Zd+dd!d"d#d#d$ddd%d&œ    d'd(„ZdS),é)Ú annotations)ÚabcÚ defaultdictN)ÚAnyÚ DefaultDictÚIterable©Úconvert_json_to_lines)Ú IgnoreRaiseÚScalar)Ú    DataFrameÚstr)ÚsÚreturncCs0|ddks|ddkr|S|dd…}t|ƒS)zJ
    Helper function that converts JSON lists to line delimited JSON.
    rú[éÿÿÿÿú]ér)r©rúPd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/io/json/_normalize.pyÚconvert_to_line_delimitss rÚÚ.Úintz
int | None)ÚprefixÚsepÚlevelÚ    max_levelc
Csâd}t|tƒr|g}d}g}|D]°}t |¡}| ¡D]Ž\}    }
t|    tƒsPt|    ƒ}    |dkr^|    } n |||    } t|
tƒr„|dk    r ||kr |dkr6| |    ¡}
|
|| <q6| |    ¡}
| t|
| ||d|ƒ¡q6|     |¡q |rÞ|dS|S)a
    A simplified json_normalize
 
    Converts a nested dict into a flat dict ("record"), unlike json_normalize,
    it does not attempt to extract a subset of the data.
 
    Parameters
    ----------
    ds : dict or list of dicts
    prefix: the prefix, optional, default: ""
    sep : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
    level: int, optional, default: 0
        The number of levels in the json string.
 
    max_level: int, optional, default: None
        The max depth to normalize.
 
    Returns
    -------
    d - dict or list of dicts, matching `ds`
 
    Examples
    --------
    >>> nested_to_record(
    ...     dict(flat1=1, dict1=dict(c=1, d=2), nested=dict(e=dict(c=1, d=2), d=2))
    ... )
    {'flat1': 1, 'dict1.c': 1, 'dict1.d': 2, 'nested.e.c': 1, 'nested.e.d': 2, 'nested.d': 2}
    FTrNr)
Ú
isinstanceÚdictÚcopyÚdeepcopyÚitemsr ÚpopÚupdateÚnested_to_recordÚappend) ÚdsrrrrZ    singletonZnew_dsÚdZnew_dÚkÚvZnewkeyrrrr%*s8,
 
 
 
ÿÿ
 
 r%rúdict[str, Any])ÚdataÚ
key_stringÚnormalized_dictÚ    separatorrcCszt|tƒrn| ¡D]X\}}|›|›|›}|sZtjdkrPddlm}|||ƒ}n
| |¡}t||||dqn|||<|S)a3
    Main recursive function
    Designed for the most basic use case of pd.json_normalize(data)
    intended as a performance improvement, see #15621
 
    Parameters
    ----------
    data : Any
        Type dependent on types contained within nested Json
    key_string : str
        New key (with separator(s) in) for data
    normalized_dict : dict
        The new normalized/flattened Json dict
    separator : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
    )éé    r)Ú removeprefix©r,r-r.r/)rrr"ÚsysÚ version_infoZpandas.util._str_methodsr2Ú_normalise_json)r,r-r.r/ÚkeyÚvalueZnew_keyr2rrrr6{s 
 
 
ü
r6)r,r/rcCs8dd„| ¡Dƒ}tdd„| ¡Dƒdi|d}||–S)aw
    Order the top level keys and then recursively go to depth
 
    Parameters
    ----------
    data : dict or list of dicts
    separator : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
 
    Returns
    -------
    dict or list of dicts, matching `normalised_json_object`
    cSs i|]\}}t|tƒs||“qSr©rr©Ú.0r)r*rrrÚ
<dictcomp>¸s
z+_normalise_json_ordered.<locals>.<dictcomp>cSs i|]\}}t|tƒr||“qSrr9r:rrrr<ºs
rr3)r"r6)r,r/Z    top_dict_Z nested_dict_rrrÚ_normalise_json_ordered©sür=zdict | list[dict]zdict | list[dict] | Any)r'rrcs@i}t|tƒrt|ˆd}n t|tƒr<‡fdd„|Dƒ}|S|S)a˜
    A optimized basic json_normalize
 
    Converts a nested dict into a flat dict ("record"), unlike
    json_normalize and nested_to_record it doesn't do anything clever.
    But for the most basic use cases it enhances performance.
    E.g. pd.json_normalize(data)
 
    Parameters
    ----------
    ds : dict or list of dicts
    sep : str, default '.'
        Nested records will generate names separated by sep,
        e.g., for sep='.', { 'foo' : { 'bar' : 0 } } -> foo.bar
 
    Returns
    -------
    frame : DataFrame
    d - dict or list of dicts, matching `normalised_json_object`
 
    Examples
    --------
    >>> _simple_json_normalize(
    ...     {
    ...         "flat1": 1,
    ...         "dict1": {"c": 1, "d": 2},
    ...         "nested": {"e": {"c": 1, "d": 2}, "d": 2},
    ...     }
    ... )
    {'flat1': 1, 'dict1.c': 1, 'dict1.d': 2, 'nested.e.c': 1, 'nested.e.d': 2, 'nested.d': 2}
 
    )r,r/csg|]}t|ˆd‘qS)©r)Ú_simple_json_normalize)r;Úrowr>rrÚ
<listcomp>òsz*_simple_json_normalize.<locals>.<listcomp>)rrr=Úlist)r'rZnormalised_json_objectZnormalised_json_listrr>rr?Âs+
 
r?Úraisezstr | list | Nonez"str | list[str | list[str]] | Nonez
str | Noner
r )    r,Ú record_pathÚmetaÚ meta_prefixÚ record_prefixÚerrorsrrrc sþd"dddddœ‡fdd„ ‰ddd    d
œ‡fd d „ ‰t|tƒrD|sDtƒSt|tƒrV|g}n$t|tjƒrvt|tƒsvt|ƒ}nt‚|d kr²|d kr²|d kr²ˆ    d kr²ˆd kr²tt|ˆ dƒS|d krât    dd„|DƒƒrÚt
|ˆ ˆd}t|ƒSt|tƒsò|g}|d krg}nt|tƒs|g}dd„|Dƒ‰g‰
g‰t tƒ‰‡ fdd„ˆDƒ‰d#dddœ‡‡‡‡‡‡‡‡‡
‡ f
dd„ ‰ˆ||iddtˆ
ƒ}ˆ    d k    r¢|j ‡    fdd„d}ˆ  ¡D]N\}    }
|d k    rÄ||    }    |    |krÞtd|    ›d ƒ‚tj|
td! ˆ¡||    <qª|S)$a´
    Normalize semi-structured JSON data into a flat table.
 
    Parameters
    ----------
    data : dict or list of dicts
        Unserialized JSON objects.
    record_path : str or list of str, default None
        Path in each object to list of records. If not passed, data will be
        assumed to be an array of records.
    meta : list of paths (str or list of str), default None
        Fields to use as metadata for each record in resulting table.
    meta_prefix : str, default None
        If True, prefix records with dotted (?) path, e.g. foo.bar.field if
        meta is ['foo', 'bar'].
    record_prefix : str, default None
        If True, prefix records with dotted (?) path, e.g. foo.bar.field if
        path to records is ['foo', 'bar'].
    errors : {'raise', 'ignore'}, default 'raise'
        Configures error handling.
 
        * 'ignore' : will ignore KeyError if keys listed in meta are not
          always present.
        * 'raise' : will raise KeyError if keys listed in meta are not
          always present.
    sep : str, default '.'
        Nested records will generate names separated by sep.
        e.g., for sep='.', {'foo': {'bar': 0}} -> foo.bar.
    max_level : int, default None
        Max number of levels(depth of dict) to normalize.
        if None, normalizes all levels.
 
    Returns
    -------
    frame : DataFrame
    Normalize semi-structured JSON data into a flat table.
 
    Examples
    --------
    >>> data = [
    ...     {"id": 1, "name": {"first": "Coleen", "last": "Volk"}},
    ...     {"name": {"given": "Mark", "family": "Regner"}},
    ...     {"id": 2, "name": "Faye Raker"},
    ... ]
    >>> pd.json_normalize(data)
        id name.first name.last name.given name.family        name
    0  1.0     Coleen      Volk        NaN         NaN         NaN
    1  NaN        NaN       NaN       Mark      Regner         NaN
    2  2.0        NaN       NaN        NaN         NaN  Faye Raker
 
    >>> data = [
    ...     {
    ...         "id": 1,
    ...         "name": "Cole Volk",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ...     {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
    ...     {
    ...         "id": 2,
    ...         "name": "Faye Raker",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ... ]
    >>> pd.json_normalize(data, max_level=0)
        id        name                        fitness
    0  1.0   Cole Volk  {'height': 130, 'weight': 60}
    1  NaN    Mark Reg  {'height': 130, 'weight': 60}
    2  2.0  Faye Raker  {'height': 130, 'weight': 60}
 
    Normalizes nested data up to level 1.
 
    >>> data = [
    ...     {
    ...         "id": 1,
    ...         "name": "Cole Volk",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ...     {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
    ...     {
    ...         "id": 2,
    ...         "name": "Faye Raker",
    ...         "fitness": {"height": 130, "weight": 60},
    ...     },
    ... ]
    >>> pd.json_normalize(data, max_level=1)
        id        name  fitness.height  fitness.weight
    0  1.0   Cole Volk             130              60
    1  NaN    Mark Reg             130              60
    2  2.0  Faye Raker             130              60
 
    >>> data = [
    ...     {
    ...         "state": "Florida",
    ...         "shortname": "FL",
    ...         "info": {"governor": "Rick Scott"},
    ...         "counties": [
    ...             {"name": "Dade", "population": 12345},
    ...             {"name": "Broward", "population": 40000},
    ...             {"name": "Palm Beach", "population": 60000},
    ...         ],
    ...     },
    ...     {
    ...         "state": "Ohio",
    ...         "shortname": "OH",
    ...         "info": {"governor": "John Kasich"},
    ...         "counties": [
    ...             {"name": "Summit", "population": 1234},
    ...             {"name": "Cuyahoga", "population": 1337},
    ...         ],
    ...     },
    ... ]
    >>> result = pd.json_normalize(
    ...     data, "counties", ["state", "shortname", ["info", "governor"]]
    ... )
    >>> result
             name  population    state shortname info.governor
    0        Dade       12345   Florida    FL    Rick Scott
    1     Broward       40000   Florida    FL    Rick Scott
    2  Palm Beach       60000   Florida    FL    Rick Scott
    3      Summit        1234   Ohio       OH    John Kasich
    4    Cuyahoga        1337   Ohio       OH    John Kasich
 
    >>> data = {"A": [1, 2]}
    >>> pd.json_normalize(data, "A", record_prefix="Prefix.")
        Prefix.0
    0          1
    1          2
 
    Returns normalized data with columns prefixed with the given string.
    Fr+z
list | strÚboolzScalar | Iterable)ÚjsÚspecÚextract_recordrc
sª|}z:t|tƒr4|D]}|dkr(t|ƒ‚||}qn||}Wnftk
r¤}zH|rftd|›dƒ|‚ˆdkr|tjWY¢Std|›d|›dƒ|‚W5d}~XYnX|S)zInternal function to pull fieldNzKey zS not found. If specifying a record_path, all elements of data should have the path.Úignorez) not found. To replace missing values of z% with np.nan, pass in errors='ignore')rrBÚKeyErrorÚnpÚnan)rJrKrLÚresultÚfieldÚe)rHrrÚ _pull_field„s.
 
ÿýÿýz#json_normalize.<locals>._pull_fieldrB)rJrKrcsFˆ||dd}t|tƒsBt |¡r(g}nt|›d|›d|›dƒ‚|S)z¶
        Internal function to pull field for records, and similar to
        _pull_field, but require to return list. And will raise error
        if has non iterable value.
        T)rLz has non list value z
 for path z. Must be list or null.)rrBÚpdZisnullÚ    TypeError)rJrKrQ)rTrrÚ _pull_records¡s
 
ÿz%json_normalize.<locals>._pull_recordsNr>css |]}dd„| ¡DƒVqdS)cSsg|]}t|tƒ‘qSrr9)r;ÚxrrrrAÎsz,json_normalize.<locals>.<genexpr>.<listcomp>N)Úvalues)r;ÚyrrrÚ    <genexpr>Îsz!json_normalize.<locals>.<genexpr>©rrcSs g|]}t|tƒr|n|g‘qSr)rrB)r;ÚmrrrrAàsz"json_normalize.<locals>.<listcomp>csg|]}ˆ |¡‘qSr)Újoin)r;Úvalr>rrrAçsrrÚNone)rrc    st|tƒr|g}t|ƒdkr‚|D]^}tˆˆƒD]*\}}|dt|ƒkr.ˆ||dƒ||<q.ˆ||d|dd…||ddq n’|D]Œ}ˆ||dƒ}‡‡    fdd„|Dƒ}ˆ t|ƒ¡tˆˆƒD]B\}}|dt|ƒkræ||}nˆ|||d…ƒ}ˆ| |¡qĈ |¡q†dS)Nrrr©rcs(g|] }t|tƒr t|ˆˆdn|‘qS)r\)rrr%)r;Úr)rrrrrAösþÿz>json_normalize.<locals>._recursive_extract.<locals>.<listcomp>)rrÚlenÚzipr&Úextend)    r,ÚpathZ    seen_metarÚobjr_r7ZrecsZmeta_val)
Ú_metarTrWÚ_recursive_extractÚlengthsrÚ    meta_keysÚ    meta_valsÚrecordsrrrriés(
 ( ü
z*json_normalize.<locals>._recursive_extractracs ˆ›|›S)Nr)rX)rGrrÚ<lambda> óz json_normalize.<locals>.<lambda>)ÚcolumnszConflicting metadata name z, need distinguishing prefix )Zdtype)F)r)rrBr rrrr ÚNotImplementedErrorr?Úanyr%rÚrenamer"Ú
ValueErrorrOÚarrayÚobjectÚrepeat) r,rDrErFrGrHrrrQr)r*r) rhrTrWrirHrjrrkrlrGrmrrÚjson_normalize÷sfÿ
 
ÿþýüû
 
 (
 
 
 
ÿrx)rrrN)r)NNNNrCrN)Ú
__future__rÚ collectionsrrr r4ÚtypingrrrÚnumpyrOZpandas._libs.writersr    Zpandas._typingr
r ZpandasrUr rr%r6r=r?rxrrrrÚ<module>s6   ûQ.þ7ø