В фрейме данных временных рядов, как выполнять ежедневные вычисления и хранить в одном столбце? - PullRequest
0 голосов
/ 21 апреля 2019

Мой фрейм данных содержит данные временных рядов за много дней.Я хочу выполнять ежедневные вычисления и хранить их в одном столбце.

Например:

Dataframe
----------------------------
Timeseries              A 
2019-01-24 14:03:00    10 
2019-01-24 14:04:00    20
2019-01-24 14:05:00    15
2019-01-25 14:06:00     9
2019-01-25 14:07:00    18
2019-01-25 14:08:00    12

Я хочу создать новый столбец с именем на единицу A puA, который содержит значение A/ Amax, где Amax - максимальное значение среди A в этот день.Ниже приведен фрагмент моего кода:

dates_list = ['2019-01-24','2019-01-25']  #Extract uniques dates list
    for i in dates_list:
        df['puA'] = df['A'].loc[i]/df['A'].loc[i].max()

Мой текущий вывод:

Timeseries             nA            puA
2019-01-24 14:03:00    10            NaN
2019-01-24 14:04:00    20            NaN
2019-01-24 14:05:00    15            NaN
2019-01-25 14:06:00    n9     9/18 = 0.5
2019-01-25 14:07:00    18    18/18 = 1.0
2019-01-25 14:08:00    12    12/18 = 0.6

Он сохраняется только на последнюю дату, а не на всех с них.

Я хочу выводить как

Timeseries              A     puA
2019-01-24 14:03:00    10    0.50 
2019-01-24 14:04:00    20    1.00
2019-01-24 14:05:00    15    0.75
2019-01-25 14:06:00     9    0.50
2019-01-25 14:07:00    18    1.00
2019-01-25 14:08:00    12    0.60

Как добиться этого вывода?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Хотя я вижу, что вы нашли свой ответ, ваше решение кажется очень уродливым. Позвольте мне показать вам более чистый подход к пандам.

Сначала вам нужно будет создать новый столбец с именем date.

df['date'] = df['Timeseries'].dt.date ##
print(df)

          Timeseries   A        date
0 2019-01-24 14:03:00  10  2019-01-24
1 2019-01-24 14:04:00  20  2019-01-24
2 2019-01-24 14:05:00  15  2019-01-24
3 2019-01-25 14:06:00   9  2019-01-25
4 2019-01-25 14:07:00  18  2019-01-25
5 2019-01-25 14:08:00  12  2019-01-25

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

grouped_df = df.groupby(df['date']).max().reset_index()[['date', 'A']]
grouped_df.columns = ['date', 'max_A']
print(grouped_df)

         date  max_A
0  2019-01-24     20
1  2019-01-25     18

Теперь вы можете использовать функцию df.merge () , чтобы объединить 2 кадра данных в столбце

merged_df = df.merge(grouped_df, on='date')
print(merged_df)

           Timeseries   A        date  max_A
0 2019-01-24 14:03:00  10  2019-01-24     20
1 2019-01-24 14:04:00  20  2019-01-24     20
2 2019-01-24 14:05:00  15  2019-01-24     20
3 2019-01-25 14:06:00   9  2019-01-25     18
4 2019-01-25 14:07:00  18  2019-01-25     18
5 2019-01-25 14:08:00  12  2019-01-25     18

Теперь для каждой строки в кадре данных у вас есть A и max_A. Просто создайте новый столбец, разделив A/max_A

merged_df['puA'] = merged_df['A']/merged_df['max_A']
print(merged_df)

           Timeseries   A        date  max_A       puA
0 2019-01-24 14:03:00  10  2019-01-24     20  0.500000
1 2019-01-24 14:04:00  20  2019-01-24     20  1.000000
2 2019-01-24 14:05:00  15  2019-01-24     20  0.750000
3 2019-01-25 14:06:00   9  2019-01-25     18  0.500000
4 2019-01-25 14:07:00  18  2019-01-25     18  1.000000
5 2019-01-25 14:08:00  12  2019-01-25     18  0.666667

Этот мой друг - путь панд. Он не содержит никаких уродливых циклов и жестко закодированных строк.

0 голосов
/ 21 апреля 2019

После проб и ошибок я нашел ответ:

dates_list = ['2019-01-24','2019-01-25']  #Extract uniques dates list
    for i in dates_list:
        rows_of_interest = [ind for ind, a in enumerate(df.index) if a.strftime("%Y-%m-%d") in i]
        df['puA'][rows_of_interest] = df['A'].loc[i]/df['A'].loc[i].max()

Мой вывод:

Timeseries              A     puA
2019-01-24 14:03:00    10    0.50 
2019-01-24 14:04:00    20    1.00
2019-01-24 14:05:00    15    0.75
2019-01-25 14:06:00     9    0.50
2019-01-25 14:07:00    18    1.00
2019-01-25 14:08:00    12    0.60
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...