背景
我正在导入一个 JSON 文件,其架构如下:
{
"000001": {
"USA": {
"requests": 1234,
"RTT": 40
},
"Japan": {
"requests": 10,
"RTT": 200
}
},
"000002": {
"USA": {
"requests": 4321,
"RTT": 50
},
"Japan": {
"requests": 10,
"RTT": 150
}
}
}
导入后,我希望对此数据执行两件事:
- 执行大量分析和数学计算,NumPy 非常擅长
- 将数据转储到数据库
将其转储到数据库后,我期望有如下所示的架构:
+--------+---------+----------+-------+
| time* | country*| requests | RTT |
+--------+---------+----------+-------+
| 000001 | USA | 1234 | 40ms |
| 000001 | Japan | 10 | 200ms |
| 000002 | USA | 4321 | 50ms |
| 000002 | Japan | 20 | 150ms |
| ... | ... | ... | ... |
问题
当前要导入数据,我正在执行以下操作:
>>>import numpy as np
>>>import flatdict as fd
>>>np.array(fd.FlatDict(json_string))
array([[000001, u'USA', u'requests', 1234],
[000001, u'USA', u'RTT', 40],
[000001, u'Japan', u'requests', 10],
...,
[000002, u'USA', u'RTT', 50],
[000002, u'Japan', u'requests', 20],
[000002, u'Japan', u'RTT', 150]],
dtype='<U31')
这里的问题是,这会为每个值而不是每个键创建一个唯一的行。如果有必要,我愿意编写自己的函数来替换 flatdict
,但问题是:NumPy 可以有元组/数组/对象作为值吗?理想情况下,我想要如下输出:
>>>np.array(data)
array([[000001, u'USA', (1234, 40)],
[000001, u'Japan', (10, 200)],
[000002, u'USA', (4321, 50)],
[000002, u'Japan', (20, 150)]],
dtype='...')
但是我愿意接受:
>>>np.array(data)
array([[000001, u'USA', 1234, 40],
[000001, u'Japan', 10, 200],
[000002, u'USA', 4321, 50],
[000002, u'Japan', 20, 150]],
dtype='...')
可接受的替代解决方案
对于第一步(执行所有分析),我可以使用我现在拥有的 NumPy 数组。像 array[:,"USA","requests"]
这样的东西会返回美国所有时间的请求数量。
在第二步中,我需要将其转换为不同的格式。如果有办法的话:
array([[000001, u'USA', u'requests', 1234],
[000001, u'USA', u'RTT', 40],
[000001, u'Japan', u'requests', 10],
...,
[000002, u'USA', u'RTT', 50],
[000002, u'Japan', u'requests', 20],
[000002, u'Japan', u'RTT', 150]],
dtype='<U31')
并将其输入表单:
[[000001, u'USA', 1234, 40],
[000001, u'Japan', 10, 200],
[000002, u'USA', 4321, 50],
[000002, u'Japan', 20, 150]]
为了将其转储到数据库中,也可以
最佳答案
您在扁平化字典时遇到问题;对 flatdict
了解不多,但如果你有一个三层字典,你可以使用列表理解来扁平化它:
[[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]
#[['000002', 'USA', 4321, 50],
# ['000002', 'Japan', 10, 150],
# ['000001', 'USA', 1234, 40],
# ['000001', 'Japan', 10, 200]]
<小时/>
对于非同质数据,如果您需要在内存中进行分析,pandas
通常比numpy
更容易使用,您可以将其转换为这样的数据框:
lst = [[k, kk, d[k][kk].get('requests'), d[k][kk].get('RTT')] for k in d for kk in d[k]]
import pandas as pd
pd.DataFrame(lst, columns=['time', 'country', 'requests', 'RTT'])
关于python - NumPy 数组可以有值的元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45944827/