第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用嵌套 dict 展平 JSON 字符串列表

使用嵌套 dict 展平 JSON 字符串列表

莫回?zé)o 2023-07-18 13:41:31
我想對lists進行以下轉(zhuǎn)換tuple:[('1599324732926-0',? ? ?{'data': '{"timestamp":1599324732.767,? ? ? ? ? ? ? ? "receipt_timestamp":1599324732.9256856,? ? ? ? ? ? ? ? "delta":true,? ? ? ? ? ? ? ? "bid":{"338.9":0.06482,"338.67":3.95535},? ? ? ? ? ? ? ? "ask":{"339.12":2.47578,"339.13":6.43172}? ? ? ? ? ? ? ?}'? ? ?}?)?('1599324732926-1',? ? ?{'data': '{"timestamp":1599324832.767,? ? ? ? ? ? ? ? "receipt_timestamp":1599324832.9256856,? ? ? ? ? ? ? ? "delta":true,? ? ? ? ? ? ? ? "bid":{"338.8":0.06482,"338.57":3.95535},? ? ? ? ? ? ? ? "ask":{"340.12":2.47578,"340.13":6.43172}? ? ? ? ? ? ? ?}'? ? ?}?)]進入listof dicts 或 Dataframe(無論是其中之一,無論如何從一個到另一個并不復(fù)雜):[{? 'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.9,? 'size': 0.06482},?{'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.67,? 'size': 3.95535},?{'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.66,? 'size': 16.78636},?{'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.63,? 'size': 2.5},?{'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.45,? 'size': 6.06071},?{'timestamp': 1599324732.767,? 'receipt_timestamp': 1599324732.9256856,? 'delta': True,? 'side': 'ask',? 'price': 338.38,? 'size': 0.0},所以基本上,第一個 id 被刪除(實際上,它被保存在一個單獨的列表中)。其中的數(shù)據(jù)data是一個具有嵌套字典的 JSON 對象。訣竅在于“bid”和“ask”成為結(jié)果字典中名為“side”的鍵的值。嵌套字典“bid”和“ask”的鍵成為結(jié)果字典中名為“price”的鍵的值。價格的值保留名為“size”的鍵的值。我能夠單獨處理列表中的每個 JSON 元素。但列表最多可以有 600k 個元素。我詢問是否可以使用一些 pandas 或 numpy 函數(shù)來處理整個列表以加快速度?我查看了 pandas?json_normalize(),但根據(jù)給出的示例,字典的鍵是系統(tǒng)列,而在這種情況下,“價格”鍵成為“價格”列的值。你知道我該怎么做嗎?有沒有辦法首先預(yù)處理 JSON 列表,以便可以使用json_normalize().僅供參考,這是我可以編寫的用于單獨處理列表中每個元素的代碼,但我認(rèn)為這不是正確的方向。下一步是將其封裝在 for 循環(huán)中,與管理整個列表的解決方案相比,這會慢得多。
查看完整描述

2 回答

?
幕布斯6054654

TA貢獻1876條經(jīng)驗 獲得超7個贊

  • 迭代提取信息比使用pandas.json_normalize.

  • 如示例數(shù)據(jù)所示, 的值data是一種str類型,必須轉(zhuǎn)換為dict.

  • 主要任務(wù)是從和中提取每一key value對,以創(chuàng)建單獨的記錄。 'bid''ask'

    • 列表理解執(zhí)行創(chuàng)建單獨記錄的任務(wù)。

import json

import pandas


# list of tuples, where the value of data, is a string

transaction_data = [('1599324732926-0', {'data': '{"timestamp":1599324732.767, "receipt_timestamp":1599324732.9256856, "delta":true, "bid":{"338.9":0.06482,"338.67":3.95535}, "ask":{"339.12":2.47578,"339.13":6.43172}}'}),

                    ('1599324732926-1', {'data': '{"timestamp":1599324732.767, "receipt_timestamp":1599324732.9256856, "delta":true, "bid":{"338.9":0.06482,"338.67":3.95535}, "ask":{"339.12":2.47578,"339.13":6.43172}}'}),

                    ('1599324732926-2', {'data': '{"timestamp":1599324732.767, "receipt_timestamp":1599324732.9256856, "delta":true, "bid":{"338.9":0.06482,"338.67":3.95535}, "ask":{"339.12":2.47578,"339.13":6.43172}}'})]


# create a list of lists for each transaction data

# split each side, key value pair into a separate list

data_key_list = [['timestamp', 'receipt_timestamp', 'delta', 'side', 'price', 'size']]


for v in transaction_data:  # # iterate through each transaction

    data = json.loads(v[1]['data'])  # convert the string to a dict

    for side in ['bid', 'ask']:  # extract each key, value pair as a separate record

        data_key_list += [[data['timestamp'], data['receipt_timestamp'], data['delta'], side, float(k), v] for k, v in data[side].items()]


# create a dataframe

df = pd.DataFrame(data_key_list[1:], columns=data_key_list[0])


# display(df.head())

     timestamp  receipt_timestamp  delta side   price     size

0  1.59932e+09        1.59932e+09   True  bid   338.9  0.06482

1  1.59932e+09        1.59932e+09   True  bid  338.67  3.95535

2  1.59932e+09        1.59932e+09   True  ask  339.12  2.47578

3  1.59932e+09        1.59932e+09   True  ask  339.13  6.43172

4  1.59932e+09        1.59932e+09   True  bid   338.9  0.06482

轉(zhuǎn)換為字典列表

df.to_dict(orient='records')


[out]:

[{'timestamp': 1599324732.767,

  'receipt_timestamp': 1599324732.9256856,

  'delta': True,

  'side': 'bid',

  'price': 338.9,

  'size': 0.06482},

 {'timestamp': 1599324732.767,

  'receipt_timestamp': 1599324732.9256856,

  'delta': True,

  'side': 'bid',

  'price': 338.67,

  'size': 3.95535},

 {'timestamp': 1599324732.767,

  'receipt_timestamp': 1599324732.9256856,

  'delta': True,

  'side': 'ask',

  'price': 339.12,

  'size': 2.47578},

 {'timestamp': 1599324732.767,

  'receipt_timestamp': 1599324732.9256856,

  'delta': True,

  'side': 'ask',

  'price': 339.13,

  'size': 6.43172},

 ...]


查看完整回答
反對 回復(fù) 2023-07-18
?
一只斗牛犬

TA貢獻1784條經(jīng)驗 獲得超2個贊

這并不完全是您問題的答案,因為它不是 pandas 或 numpy 的實現(xiàn),但我認(rèn)為它應(yīng)該可以滿足您的需求。


嘗試看看multiprocessing.pool.Pool.map

假設(shè)您有一個函數(shù)從原始列表接收元組并返回您想要的數(shù)據(jù)字典??梢哉f它的簽名看起來像這樣:


def tuple_to_dict(input):

? ? # conversion code goes here

? ? return result_dict

然后您可以像這樣使用 multiprocessing.Pool() :


import multiprocessing



if __name__ == '__main__':


? ? input_list = [...] # your input list


? ? with multiprocessing.Pool() as pool:

? ? ? ? result_list = pool.map(tuple_to_dict, input_list)

? ? ? ? print(result_list)

筆記:

  1. Pool() 對象的創(chuàng)建應(yīng)該放在一個if __name__ == "__main__"塊或從那里調(diào)用的函數(shù)內(nèi)(遞歸) - 否則你會得到一個 RuntimeError

  2. 放置with ... as...?在那里,以便在使用結(jié)束或失敗時關(guān)閉 Pool 對象。如果您不使用“with / as”語法,請在 try/catch 塊內(nèi)使用它,并pool.close()在其finally塊中添加語句以確保池已關(guān)閉。



查看完整回答
反對 回復(fù) 2023-07-18
  • 2 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號