Рассчитать среднее на основе времени, прошедшего в Пандах - PullRequest
0 голосов
/ 22 апреля 2019

Я пытался задать этот вопрос ранее, но он был слишком неоднозначным, поэтому здесь снова.Я новичок в программировании, так что я все еще учусь, как задавать вопросы полезным способом.

В итоге, у меня есть pandas dataframe, который напоминает "INPUT DATA", который я хотел бы преобразовать в "DESIRED OUTPUT"", как показано ниже.

Каждая строка содержит идентификатор, дату и время.Для каждого уникального идентификатора первая строка соответствует моменту времени «ноль», а каждая последующая строка содержит значение 5 минут после предыдущей строки и т. Д.

Я хотел бы рассчитать среднее значение всех идентификаторов длякаждый истекший момент времени.Например, в «ЗАПИСИВАЕМОМ ВЫХОДЕ» Time Elapsed = 0.0 будет иметь значение 128,3 (100 + 105 + 180/3);Истекшее время = 5,0 будет иметь значение 150,0 (150 + 110 + 190/3);Time Elapsed = 10.0 будет иметь значение 133,3 (125 + 90 + 185/3) и т. Д. Для Time Elapsed = 15,20,25 и т. Д.

Я не уверен, как создать новый столбец, которыйимеет значение времени, прошедшего для каждого идентификатора (например, 0,0, 5,0, 10,0 и т. д.).Я думаю, что, как только я знаю, как это сделать, тогда я могу использовать функцию groupby для вычисления среднего значения для каждого прошедшего времени.

ВХОДНЫЕ ДАННЫЕ

ID  DateTime            Value
1   2018-01-01 15:00:00 100
1   2018-01-01 15:05:00 150
1   2018-01-01 15:10:00 125
2   2018-02-02 13:15:00 105
2   2018-02-02 13:20:00 110
2   2018-02-02 13:25:00 90
3   2019-03-03 05:05:00 180
3   2019-03-03 05:10:00 190
3   2019-03-03 05:15:00 185

ЖЕЛАЕМЫЙ ВЫХОД


Time Elapsed    Mean Value
0.0             128.3
5.0             150.0
10.0            133.3

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вот один из способов, используя transform с groupby, получить групповой ключ 'Time Elapsed', затем просто groupby получите mean

df['Time Elapsed']=df.DateTime-df.groupby('ID').DateTime.transform('first')
df.groupby('Time Elapsed').Value.mean()
Out[998]: 
Time Elapsed
00:00:00    128.333333
00:05:00    150.000000
00:10:00    133.333333
Name: Value, dtype: float64
0 голосов
/ 22 апреля 2019

Вы можете сделать это явно, воспользовавшись атрибутами datetime столбца DateTime в вашем DataFrame

Сначала получите год, месяц и день для каждого DateTime, поскольку онивсе меняется в ваших данных

df['month'] = df['DateTime'].dt.month
df['day'] = df['DateTime'].dt.day
df['year'] = df['DateTime'].dt.year

print(df)
   ID            DateTime  Value  month  day  year
1   1 2018-01-01 15:00:00    100      1    1  2018
1   1 2018-01-01 15:05:00    150      1    1  2018
1   1 2018-01-01 15:10:00    125      1    1  2018
2   2 2018-02-02 13:15:00    105      2    2  2018
2   2 2018-02-02 13:20:00    110      2    2  2018
2   2 2018-02-02 13:25:00     90      2    2  2018
3   3 2019-03-03 05:05:00    180      3    3  2019
3   3 2019-03-03 05:10:00    190      3    3  2019
3   3 2019-03-03 05:15:00    185      3    3  2019

Затем добавьте последовательный DateTime столбец счетчика (за этот пост SO )

  • счетчик вычисляется в пределах (1) каждый год, (2) затем каждый месяц и затем (3) каждый день
  • , поскольку данные кратны 5 минутам, используйте это для масштабирования значений счетчика (т. Е. Счетчик будет кратен5 минут, а не последовательность увеличивающихся целых чисел)
df['Time Elapsed'] = df.groupby(['year', 'month', 'day']).cumcount() + 1
df['Time Elapsed'] *= 5

print(df)
   ID            DateTime  Value  month  day  year  cumulative_record
1   1 2018-01-01 15:00:00    100      1    1  2018                  5
1   1 2018-01-01 15:05:00    150      1    1  2018                 10
1   1 2018-01-01 15:10:00    125      1    1  2018                 15
2   2 2018-02-02 13:15:00    105      2    2  2018                  5
2   2 2018-02-02 13:20:00    110      2    2  2018                 10
2   2 2018-02-02 13:25:00     90      2    2  2018                 15
3   3 2019-03-03 05:05:00    180      3    3  2019                  5
3   3 2019-03-03 05:10:00    190      3    3  2019                 10
3   3 2019-03-03 05:15:00    185      3    3  2019                 15

Выполните groupby над вновь добавленным столбцом счетчика

dfg = df.groupby('Time Elapsed')['Value'].mean()

print(dfg)
Time Elapsed
5     128.333333
10    150.000000
15    133.333333
Name: Value, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...