【问题标题】:Create Unlimited DataFrames from other DataFrame Column Category with Time-Series Data使用时间序列数据从其他 DataFrame 列类别创建无限 DataFrame
【发布时间】:2019-10-17 14:08:19
【问题描述】:

我在时间序列中有三列。

时间序列是每小时和索引值。

我有多个类别每小时测量一次。

我有任意级别的列表:这些通常是奇怪的名称,我一次可能会拉出 40 到 40000 个之间的任何位置。

我也有不同的值:分数 0 - 100。

所以:

我想让每个Level都有自己的DataFrame:

(完整数据帧):

df = 

              date    levels    score
2019-01-01 00:00:00    1005  99.438851
2019-01-01 01:00:00    1005  92.081975
2019-01-01 02:00:00    1005  93.032991
2019-01-01 03:00:00    1005   1.991615
2019-01-01 04:00:00    1005  12.723531
2019-01-01 05:00:00    1005  74.443313

(我想要生成的数百个单独的 DataFrame 之一,但不在 DICT 中)

df_is_1005 = 

              date      score
2019-01-01 00:00:00  99.438851
2019-01-01 01:00:00  92.081975
2019-01-01 02:00:00  93.032991
2019-01-01 03:00:00   1.991615
2019-01-01 04:00:00  12.723531
2019-01-01 05:00:00  74.443313

....但对于所有级别 .

并且 我有点问题!

我做了很多挖掘工作,并尝试制作数据帧的字典。我如何提取其中的每一个?

另外,我如何将它们分别命名为:df_of_{levels}?

这是我将为玩具模型创建的时间序列数据。 (但每个级别都应该有多个日期时间,不像这里)


import pandas as pd
from datetime import datetime
import numpy as np
import pandas as pd

date_rng = pd.date_range(start='1/1/2019', end='3/30/2019', freq='H')

df = pd.DataFrame(date_rng, columns=['date'])

df['level'] = np.random.randint(1000,1033,size=(len(date_rng)))

df['score'] = np.random.uniform(0,100,size=(len(date_rng)))

请记住,我可能处理的级别可能有数百个,它们被命名为奇怪的东西。

我会将这些时间戳记作为单独的行。

我想要的目标是拥有每个可能的级别,其中可能不仅仅是这里的少数几个级别,以动态创建数据帧。

现在:我知道我可以创建一个数据框字典。

但是如何提取每个带有个人编号的数据帧?

例如我想要

df = 

              date    levels    score
2019-01-01 00:00:00    1005  99.438851
2019-01-01 01:00:00    1005  92.081975
2019-01-01 02:00:00    1005  93.032991
2019-01-01 03:00:00    1005   1.991615
2019-01-01 04:00:00    1005  12.723531
2019-01-01 05:00:00    1005  74.443313
2019-01-01 06:00:00    1005  12.154499
2019-01-01 07:00:00    1005  96.439228
2019-01-01 08:00:00    1005  64.283731
2019-01-01 09:00:00    1005  83.165093
2019-01-01 10:00:00    1005  75.740610
2019-01-01 11:00:00    1005  25.721404
2019-01-01 12:00:00    1005  37.493829
2019-01-01 13:00:00    1005  51.783549
2019-01-01 14:00:00    1005   7.223582
2019-01-01 15:00:00    1005   0.932651
2019-01-01 16:00:00    1005  95.916686
2019-01-01 17:00:00    1005  11.579450

和同样的df,很久以后......:

               date   levels      score
2019-01-01 00:00:00    1027  99.438851
2019-01-01 01:00:00    1027  92.081975
2019-01-01 02:00:00    1027  93.032991
2019-01-01 03:00:00    1027   1.991615
2019-01-01 04:00:00    1027  12.723531
2019-01-01 05:00:00    1027  74.443313
2019-01-01 06:00:00    1027  12.154499
2019-01-01 07:00:00    1027  96.439228
2019-01-01 08:00:00    1027  64.283731
2019-01-01 09:00:00    1027  83.165093
2019-01-01 10:00:00    1027  75.740610
2019-01-01 11:00:00    1027  25.721404
2019-01-01 12:00:00    1027  37.493829
2019-01-01 13:00:00    1027  51.783549
2019-01-01 14:00:00    1027   7.223582
2019-01-01 15:00:00    1027   0.932651
2019-01-01 16:00:00    1027  95.916686
2019-01-01 17:00:00    1027  11.579450
2019-01-01 18:00:00    1027  91.226938
2019-01-01 19:00:00    1027  31.564530
2019-01-01 20:00:00    1027  39.511358
2019-01-01 21:00:00    1027  59.787468
2019-01-01 22:00:00    1027   4.666549
2019-01-01 23:00:00    1027  92.197337

...等等...

每个级别都是单独的,无论它被称为什么(可能有数百个具有随机值):

要转换成

df_{level_value_generated} =


        date           score
2019-01-01 00:00:00   8.040233
2019-01-01 01:00:00  55.736688
2019-01-01 02:00:00  37.910143
2019-01-01 03:00:00  22.907763
2019-01-01 04:00:00   4.586205
2019-01-01 05:00:00  88.090652
2019-01-01 06:00:00  50.474533
2019-01-01 07:00:00  92.890208
2019-01-01 08:00:00  70.949978
2019-01-01 09:00:00  23.191488
2019-01-01 10:00:00  60.506870
2019-01-01 11:00:00  25.689149
2019-01-01 12:00:00  49.234296
2019-01-01 13:00:00  65.369771
2019-01-01 14:00:00  55.550065
2019-01-01 15:00:00  35.112297
2019-01-01 16:00:00  45.989587
2019-01-01 17:00:00  76.829787
2019-01-01 18:00:00   5.982378
2019-01-01 19:00:00  83.603115
2019-01-01 20:00:00   5.995648
2019-01-01 21:00:00  95.658097
2019-01-01 22:00:00  21.877945
2019-01-01 23:00:00  30.428798
2019-01-02 00:00:00  72.450284
2019-01-02 01:00:00  91.947018
2019-01-02 02:00:00  66.741502
2019-01-02 03:00:00  77.535416
2019-01-02 04:00:00  29.624868
2019-01-02 05:00:00  89.652003

然后我可以列出这些动态创建的 DataFrame。

从这里开始,我想将它们添加到字典中,原因是我想在每个单独的 DataFrame 上训练一个时间序列模型,这样我就可以有一个不同的模型他们每个人,每个人都有自己的训练和输出。

如果可能的话,我可以从字典中单独训练多个 DataFrame 吗?

如果我只是做一个数据透视表或 groupby,我将拥有一个大型 Dataframe,我必须单独调用其中的列来训练时间序列。所以我宁愿不这样做。

那么,我该如何动态创建:

新命名的 DataFrames 来自值并非全部已知的级别,

每个名字:

df_{level_name}:

日期时间列:Score_Column:

一些日期...分数 0-100

然后将'level_name'列放在他们自己的DataFrame中,这样我就可以拥有尽可能多的dataframe,每个都以编程方式唯一命名,这样我就可以将其中的每一个都插入到新模型中还是什么?

【问题讨论】:

    标签: python pandas numpy dataframe dictionary


    【解决方案1】:

    如果我正确理解了您的问题,MultiIndex 应该完全符合您的要求。

    要在您的数据框上执行此操作:

    df.reset_index(inplace=True)
    df.set_index(['levels', 'date'], inplace=True)
    
    # in the case of your example above, this will produce:
    df = 
    
    levels date                     score
    1005   2019-01-01 00:00:00      99.438851
           2019-01-01 01:00:00      92.081975
           2019-01-01 02:00:00      93.032991
           2019-01-01 03:00:00      1.991615
           2019-01-01 04:00:00      12.723531
           2019-01-01 05:00:00      74.443313
           2019-01-01 06:00:00      12.154499
           2019-01-01 07:00:00      96.439228
           2019-01-01 08:00:00      64.283731
           2019-01-01 09:00:00      83.165093
           2019-01-01 10:00:00      75.740610
           2019-01-01 11:00:00      25.721404
           2019-01-01 12:00:00      37.493829
           2019-01-01 13:00:00      51.783549
           2019-01-01 14:00:00      7.223582
           2019-01-01 15:00:00      0.932651
           2019-01-01 16:00:00      95.916686
           2019-01-01 17:00:00      11.579450
    1027   2019-01-01 00:00:00      99.438851
           2019-01-01 01:00:00      92.081975
           2019-01-01 02:00:00      93.032991
           2019-01-01 03:00:00      1.991615
           2019-01-01 04:00:00      12.723531
           2019-01-01 05:00:00      74.443313
           2019-01-01 06:00:00      12.154499
           2019-01-01 07:00:00      96.439228
           2019-01-01 08:00:00      64.283731
           2019-01-01 09:00:00      83.165093
           2019-01-01 10:00:00      75.740610
           2019-01-01 11:00:00      25.721404
           2019-01-01 12:00:00      37.493829
           2019-01-01 13:00:00      51.783549
           2019-01-01 14:00:00      7.223582
           2019-01-01 15:00:00      0.932651
           2019-01-01 16:00:00      95.916686
           2019-01-01 17:00:00      11.579450
           2019-01-01 18:00:00      91.226938
           2019-01-01 19:00:00      31.564530
           2019-01-01 20:00:00      39.511358
           2019-01-01 21:00:00      59.787468
           2019-01-01 22:00:00      4.666549
           2019-01-01 23:00:00      92.197337
    #... etc
    

    然后您可以使用这些索引访问每个级别的数据:

    df.loc[1005, :]
    
      > 
    date                     score
    2019-01-01 00:00:00      99.438851
    2019-01-01 01:00:00      92.081975
    2019-01-01 02:00:00      93.032991
    2019-01-01 03:00:00      1.991615
    2019-01-01 04:00:00      12.723531
    2019-01-01 05:00:00      74.443313
    2019-01-01 06:00:00      12.154499
    2019-01-01 07:00:00      96.439228
    2019-01-01 08:00:00      64.283731
    2019-01-01 09:00:00      83.165093
    2019-01-01 10:00:00      75.740610
    2019-01-01 11:00:00      25.721404
    2019-01-01 12:00:00      37.493829
    2019-01-01 13:00:00      51.783549
    2019-01-01 14:00:00      7.223582
    2019-01-01 15:00:00      0.932651
    2019-01-01 16:00:00      95.916686
    2019-01-01 17:00:00      11.579450
    

    您还可以使用以下方法遍历数据的所有“级别”:

    for level, data in df.groupby(level=0):
       # do something to 'level'
    

    并且,如果需要,获取数据中包含的所有“级别”的列表:

    df.index.levels[0]
    
      > [1005, 1027, ...]
    

    这可能被证明比创建大量单独命名的数据框更灵活,并且更接近 pandas 的预期用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多