【发布时间】:2020-12-24 17:53:57
【问题描述】:
我想转换以下list 的tuples:
[('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}
}'
}
)
]
进入dicts 中的list 或Dataframe(任何一个,从一个到另一个并不复杂):
[{
'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},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'ask',
'price': 338.95,
'size': 0.0},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'ask',
'price': 338.96,
'size': 0.0},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'ask',
'price': 339.11,
'size': 0.0},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 339.12,
'size': 2.47578},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 339.13,
'size': 6.43172},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 339.36,
'size': 0.0},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 339.52,
'size': 6.5},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 341.18,
'size': 0.0},
{'timestamp': 1599324732.767,
'receipt_timestamp': 1599324732.9256856,
'delta': True,
'side': 'bid',
'price': 341.19,
'size': 0.0},
...
]
基本上,
- 第一个 id 被删除(实际上,它保存在一个单独的列表中)。
-
data中的数据是具有嵌套字典的 JSON 对象。 - 诀窍在于“bid”和“ask”成为结果字典中名为“side”的键的值。
- 嵌套字典“bid”和“ask”的键成为结果字典中名为“price”的键的值。
- 一个名为“size”的键的价格保持值。
我能够分别处理列表中的每个 JSON 元素。 但是列表最多可以包含 600k 个元素。 我询问是否可以使用一些 pandas 或 numpy 函数将列表作为一个整体来处理以提高速度?
我查看了 pandas json_normalize(),但根据给出的示例,dict 的键是系统列,而在这种情况下,“价格”键成为“价格”列的值。
你知道我该怎么做吗?有什么方法可以对 JSON 列表进行第一次预处理,以便使用json_normalize() 对其进行进一步处理。
仅供参考,这是我可以编写的代码来分别处理列表中的每个元素,但我认为这不是正确的方向。下一步是将其封装在一个 for 循环中,与管理整个列表的解决方案相比,这将慢得多。
import json
data_light = ('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} \
}'
}
)
var=json.loads(data_light[1]['data'])
var_bid=var['bid']
var_ask=var['ask']
mylist=list(var_bid.items())+list(var_ask.items())
it = ['ask'] * len(var_ask) + ['bid'] * len(var_bid)
timestamp=var['timestamp']
receipt_timestamp=var['receipt_timestamp']
delta=var['delta']
midx = pd.MultiIndex.from_product([[timestamp], [receipt_timestamp], [delta],it], names=['timestamp', 'receipt_timestamp', 'delta', 'side'])
df=pd.DataFrame(mylist, index=midx, columns=['price', 'size'], dtype=float)
my_dict=df.reset_index().to_dict('records')
【问题讨论】:
标签: python json pandas dictionary