NumPy数组可以有元组的值吗?

2024-10-02 08:28:05 发布

您现在位置:Python中文网/ 问答频道 /正文

背景

我正在导入一个JSON文件,其模式如下:

{
    "000001": {
        "USA": {
            "requests": 1234,
            "RTT": 40
        },
        "Japan": {
            "requests": 10,
            "RTT": 200
        }
    },
    "000002": {
        "USA": {
            "requests": 4321,
            "RTT": 50
        },
        "Japan": {
            "requests": 10,
            "RTT": 150
        }
    }
}

导入后,我有两件事要处理这些数据:

  1. 进行大量的分析和数学运算,这是NumPy最擅长的
  2. 将数据转储到数据库

在将其转储到数据库时,我希望出现如下模式:

+--------+---------+----------+-------+
|  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是否可以使用tuples/arararys/objects作为值?理想情况下,我希望输出如下:

>>>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]]

为了将其转储到数据库中,也可以


Tags: 数据importrttnumpy数据库asnp模式
1条回答
网友
1楼 · 发布于 2024-10-02 08:28:05

您在压平词典时遇到问题;对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'])

enter image description here

相关问题 更多 >

    热门问题