Создайте неограниченное количество фреймов данных из другой категории столбцов фреймов с данными временных рядов - PullRequest
0 голосов
/ 01 июня 2019

У меня есть три столбца во временном ряду.

Временной ряд является почасовым и значение индекса.

У меня есть несколько категорий, которые измеряются ежечасно.

У меня есть произвольные списки уровней: обычно это нечетные имена, и я могу указывать от 40 до 40000 одновременно.

У меня также есть их различные значения: для оценки 0 - 100.

Итак:

Я хочу, чтобы каждый уровень имел свой собственный 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

(один из сотен отдельных фреймов данных, которые я хочу сгенерировать, но НЕ в 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_ {уровней}?

Это данные временного ряда, которые я создам для игрушечной модели. (НО должно быть несколько datetime для каждого уровня, в отличие от здесь)


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

и тот же дф, гораздо позже ...:

               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

Таким образом, я могу затем перечислить эти фреймы данных, которые созданы ДИНАМИЧЕСКИ.

С этого момента я хотел бы добавить их в словарь, причина в том, что я хочу обучить модель временных рядов для каждого отдельного фрейма данных, чтобы у меня была другая модель для каждый из них, каждый со своим обучением и результатами.

Если возможно, могу ли я тренировать несколько DataFrames из словаря по отдельности?

Если я просто сделаю сводную таблицу или сгруппированную группу, у меня будет большой Dataframe, для которого мне придется отдельно вызывать столбцы, чтобы тренироваться по временным рядам. Так что я бы предпочел этого не делать.

Итак, как мне динамически создать:

Новые имена DataFrames из уровней, которые не все известны по значению,

каждый по имени:

df_ {level_name}:

DateTime Столбец: Score_Column:

некоторые даты ... баллы 0-100

, который затем удалит столбец 'level_name' в их собственном DataFrame, так что у меня может быть столько данных, сколько необходимо, каждый из которых будет иметь уникальное имя, программно, чтобы я мог затем взять каждый из них и затем подключить их к новой модели или как?

1 Ответ

0 голосов
/ 01 июня 2019

Если я правильно понял вашу проблему, 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, ...]

Это может оказаться более гибким, чем создание многочисленных поименованных фреймов данных, и ближе к использованию панд с отступом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...