使用python/pandas进行多属性数据管理

rn0zuynd  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(89)

我正在开发一个从大文件中提取数据的工具。这些数据可以根据称为P1和P2的2个属性进行排序,并在此形式下:

-> P1[0] : 
 |-> P2[0] : data
 |-> P2[1] : data 
 ...
-> P1[1]:
 |-> P2[0] : data
 |-> P2[1] : data 
 ...

为了更好地理解我的问题,P1可以被认为是时间,P2可以被认为是一组汽车的选择,这些汽车具有一组可以以pd的形式表示的数据。DataFrame包含一组指定的数据,希望给我们提供以下结构:

-> at t = 0s : 
 |-> car_1 : pd.DataFrame({})
 |-> car_2 : pd.DataFrame({}) 
 ...
-> at t = 1s:
 |-> car_1 : pd.DataFrame({})
 |-> car_2 : pd.DataFrame({})
 ...

在我的例子中,我选择以嵌套字典的形式表示数据,如下所示:

global_data = {0.0: {"car_1": pd.DataFrame({"data_1":[0,0,0,0],
                                            "data_1":[0,0,0,0] }),
                     "car_2": pd.DataFrame({"data_1":[0,0,0,0],
                                            "data_1":[0,0,0,0] })},
               1.0: {"car_1": pd.DataFrame({"data_1":[1,1,1,1],
                                            "data_1":[1,1,1,1] }),
                     "car_2": pd.DataFrame({"data_1":[1,1,1,1],
                                            "data_1":[1,1,1,1] })}}

但我不知道是否有更好的解决方案,因为我的目标是在一个漂亮的交互式 Jmeter 板中显示这些数据。
所以我的问题是是否有更好的解决方案来管理这些类型的数据结构?问题是,即使我搜索“高级Pandas使用教程”,我甚至不知道正确的技术词汇来找到我的问题的答案。
我希望我的问题是清楚的,你可以帮助我。先谢了。

更新:

在阅读了答案之后,我认为MultiIndex Dataframe 解决方案最适合我的需要。基于@Timeless的答案,我最终得到了以下代码:我们需要在一段时间内跟踪一组汽车的一组指标。例如,我们需要跟踪一组指标在汽车高度上随时间的演变(仅举一例)。这在代码中的翻译如下:

cars = [f"car_{i}" for i in range(1, 3)]
ts = np.arange(1, 3)
Time = [0, 1]
data = np.random.randint(0, 5, (len(ts)*len(cars)*len(Time), 5))
df = pd.DataFrame(
    data,
    index=pd.MultiIndex.from_product([Time, cars, ts]).set_names(['Times', 'cars', 'Height']),
    columns=[f"Indicator_{i}" for i in range(1, 6)]
)

wish给出了这个:

Indicator_1  Indicator_2  Indicator_3  Indicator_4  Indicator_5
Times cars  Height                                                                 
0     car_1 1                 4            0            3            3            3
            2                 1            3            2            4            0
      car_2 1                 0            4            2            1            0
            2                 1            1            0            1            4
1     car_1 1                 3            0            3            0            2
            2                 3            0            1            3            3
      car_2 1                 3            0            1            1            1
            2                 0            2            4            3            3

为了在dataframe中找到特定的元素,我们可以使用df.query()方法:df.query("Times == 0 and cars == 'car_1'")
因此,现在我需要找到一种有效的方法来显示所有这些数据在一个交互式 Jmeter 板与选择栏的时间和汽车我会更新后,当我找到一种方法。

jq6vz3qz

jq6vz3qz1#

你的问题很模糊,你的数据的格式/类型也不完全清楚(* 至少对我来说 *)。更不用说我们忽略了您如何接收和存储数据。不过,根据标题,我会使用带有分层DataFrame的 MultiIndex 来操作数据,而不是使用嵌套的dict。
我们可以从 * 评论 * 中读到:

  • 两种主要用法。一种是快速检索在时间Y* 与car_X相关的数据集
CAR, DATA = "car_2", ["data_1", "data_3"]
TIME_STEP = slice("2023-09-21 00:22:00", "2023-09-23 04:10:00")

query = df.xs(CAR).loc[TIME_STEP, DATA].rename_axis(None)

                     data_1  data_3
2023-09-21 02:00:00      44      91
2023-09-21 04:00:00      39      22
...                     ...     ...
2023-09-23 02:00:00      13      80
2023-09-23 04:00:00      89      99

[26 rows x 2 columns]
  • 或者更慢地提取所有汽车的所有时间步长的所有数据以存储在.csv中?*
df.to_csv("file.csv", sep=",", index=True) # feel free to adjust the parameters

# file.csv
cars,time_steps,data_1,data_2,data_3,data_4,data_5
car_1,2023-09-20 00:00:00,44,47,64,67,67
car_1,2023-09-20 02:00:00,9,83,21,36,87
car_1,2023-09-20 04:00:00,70,88,88,12,58
car_1,2023-09-20 06:00:00,65,39,87,46,88
...
  • ..并且最重要的是显示在 Jmeter 板中,该 Jmeter 板将允许用户在想要的时间步长显示想要的汽车的数据。
pd.options.plotting.backend = "plotly"

fig = (
    query.plot(
        title="MultiProperties Data Management", template= "plotly",
        labels=dict(index="Time-Step", value="Values", variable="Variables"),
        width=1000, height=400)
)

fig.show();

使用的输入:

data_1  data_2  data_3  data_4  data_5
car_1 2023-09-20 00:00:00      44      47      64      67      67
      2023-09-20 02:00:00       9      83      21      36      87
      2023-09-20 04:00:00      70      88      88      12      58
      2023-09-20 06:00:00      65      39      87      46      88
      2023-09-20 08:00:00      81      37      25      77      72
...                           ...     ...     ...     ...     ...
car_9 2023-09-23 14:00:00      45       3      84      83      37
      2023-09-23 16:00:00      33      60      89       7      60
      2023-09-23 18:00:00      37      84      98      16      45
      2023-09-23 20:00:00      39      33      97      65      73
      2023-09-23 22:00:00      87      68      24       6      97

[432 rows x 5 columns]
np.random.seed(0)

cars = [f"car_{i}" for i in range(1, 10)] 
ts = pd.date_range("2023-09-20 00:00:00", "2023-09-23 22:15:00", freq="2H")

df = pd.DataFrame(
    np.random.randint(0, 100, (len(ts)*len(cars), 5)),
    index=pd.MultiIndex.from_product([cars, ts]),
    columns=[f"data_{i}" for i in range(1, 6)]
)
wbrvyc0a

wbrvyc0a2#

由于您计划查询数据集,因此我建议您使用可以轻松查询给定多个条件的数据结构。我建议使用单个DataFrame,其中每一行都是表单的一条记录

[time_x, car_y, data_list]

在这里,您可以使用pandas.query()函数获取新的数据框,并将其用于 Jmeter 板。
让你的数据集尽可能简单。考虑到您当前的数据结构,我不知道如何以一种高效而简单的方式查询所需的数据。

更新

我在想一个类似的数据框

data = [[0,'car_1',[0,0,0,0]],
        [0,'car_2',[0,0,0,0]],
        [1,'car_1',[0,0,0,0]],
        [1,'car_2',[0,0,0,0]]]
         
df = pd.DataFrame(data, columns=['Time','Car','Auto Data'])
df

# Time  Car     Auto Data
# 0     car_1   [0, 0, 0, 0]
# 0     car_2   [0, 0, 0, 0]
# 1     car_1   [0, 0, 0, 0]
# 1     car_2   [0, 0, 0, 0]

相关问题