найти среднее значение всех значений, записанных за 90 дней до каждой строки и появившихся в одно и то же время - PullRequest
1 голос
/ 07 марта 2019

Мой примерный набор данных выглядит так:

Date,Flow (MGD),Velocity (ft/s),Level (Inches)
2018-03-16 12:00:00,0,0,-0.023
2018-03-16 12:15:00,0,0,0
2018-03-16 12:30:00,0,0.002,-0.012
2018-03-16 12:45:00,0,0,-0.081
2018-03-16 13:00:00,0,0,-0.123
2018-03-16 13:15:00,0.721,1.742,4.445
2018-03-16 13:30:00,0.985,2.621,5.785
2018-03-16 13:45:00,0.993,2.719,5.662
2018-03-16 14:00:00,1.005,2.68,5.762
2018-03-16 14:15:00,0.957,2.604,5.683
2018-03-16 14:30:00,0.968,2.655,5.65
2018-03-16 14:45:00,0.967,2.579,5.763
2018-03-16 15:00:00,0.939,2.607,5.6
2018-03-16 15:15:00,0.897,2.584,5.458
2018-03-16 15:30:00,0.872,2.535,5.421
2018-03-16 15:45:00,0.912,2.699,5.356
2018-03-16 16:00:00,0.836,2.458,5.38
2018-03-16 16:15:00,0.86,2.446,5.509
2018-03-16 16:30:00,0.94,2.679,5.5
2018-03-16 16:45:00,0.84,2.429,5.444
2018-03-16 17:00:00,0.95,2.629,5.613
2018-03-16 17:15:00,0.907,2.647,5.409
2018-03-16 17:30:00,0.938,2.595,5.614
2018-03-16 17:45:00,0.995,2.757,5.611
2018-03-16 18:00:00,0.949,2.613,5.633
2018-03-16 18:15:00,1.011,2.756,5.673
2018-03-16 18:30:00,1.046,2.728,5.854
2018-03-16 18:45:00,1.012,2.759,5.672
2018-03-16 19:00:00,1.072,2.862,5.778
2018-03-16 19:15:00,1.011,2.67,5.802
2018-03-16 19:30:00,1.014,2.658,5.834
2018-03-16 19:45:00,1.143,3.008,5.819
2018-03-16 20:00:00,1.115,3.016,5.704
2018-03-16 20:15:00,1.108,2.925,5.805
2018-03-16 20:30:00,1.201,3.063,5.948
2018-03-16 20:45:00,1.112,2.985,5.734
2018-03-16 21:00:00,1.053,2.805,5.767
2018-03-16 21:15:00,1.065,2.768,5.87
2018-03-16 21:30:00,1.085,2.87,5.795
2018-03-16 21:45:00,0.987,2.578,5.85
2018-03-16 22:00:00,0.996,2.792,5.565
2018-03-16 22:15:00,0.995,2.693,5.701
2018-03-16 22:30:00,1.017,2.699,5.783
2018-03-16 22:45:00,1.025,2.696,5.819
2018-03-16 23:00:00,1.011,2.666,5.81
2018-03-16 23:15:00,0.934,2.624,5.553
2018-03-16 23:30:00,0.964,2.697,5.571
2018-03-16 23:45:00,0.891,2.532,5.51
2018-03-17 00:00:00,0.935,2.689,5.466
2018-03-17 00:15:00,0.838,2.545,5.258
2018-03-17 00:30:00,0.826,2.51,5.256
2018-03-17 00:45:00,0.797,2.487,5.161
2018-03-17 01:00:00,0.673,2.229,4.947
2018-03-17 01:15:00,0.689,2.316,4.899
2018-03-17 01:30:00,0.635,2.188,4.811
2018-03-17 01:45:00,0.663,2.351,4.718
2018-03-17 02:00:00,0.619,2.28,4.591
2018-03-17 02:15:00,0.567,2.118,4.55
2018-03-17 02:30:00,0.52,1.974,4.498
2018-03-17 02:45:00,0.562,2.132,4.502
2018-03-17 03:00:00,0.548,2.096,4.472
2018-03-17 03:15:00,0.548,2.119,4.438
2018-03-17 03:30:00,0.567,2.174,4.468
2018-03-17 03:45:00,0.472,1.892,4.333
2018-03-17 04:00:00,0.504,1.985,4.387
2018-03-17 04:15:00,0.537,2.121,4.378
2018-03-17 04:30:00,0.492,1.934,4.393
2018-03-17 04:45:00,0.477,1.887,4.372
2018-03-17 05:00:00,0.52,1.979,4.488
2018-03-17 05:15:00,0.518,2.034,4.396
2018-03-17 05:30:00,0.535,2.062,4.45
2018-03-17 05:45:00,0.527,1.999,4.498
2018-03-17 06:00:00,0.535,2.11,4.379
2018-03-17 06:15:00,0.537,2.084,4.429
2018-03-17 06:30:00,0.512,1.98,4.438
2018-03-17 06:45:00,0.545,2.051,4.526
2018-03-17 07:00:00,0.666,2.259,4.864
2018-03-17 07:15:00,0.674,2.321,4.813
2018-03-17 07:30:00,0.66,2.307,4.765
2018-03-17 07:45:00,0.743,2.434,4.987
2018-03-17 08:00:00,0.761,2.462,5.032
2018-03-17 08:15:00,0.878,2.578,5.383
2018-03-17 08:30:00,0.882,2.519,5.489
2018-03-17 08:45:00,0.955,2.621,5.647
2018-03-17 09:00:00,1.119,2.864,5.934
2018-03-17 09:15:00,1.321,3.287,6.052
2018-03-17 09:30:00,1.32,3.234,6.12
2018-03-17 09:45:00,1.269,3.327,5.833
2018-03-17 10:00:00,1.283,3.134,6.134
2018-03-17 10:15:00,1.451,3.444,6.261
2018-03-17 10:30:00,1.416,3.349,6.275
2018-03-17 10:45:00,1.385,3.317,6.219

Я пытаюсь найти среднее из всех Level (Inches) значений, появившихся в одно и то же время за предыдущие 90 дней. Я хочу это значение для всех строк. Я использую этот код:

import pandas as pd
import numpy as np
import os

df = pd.read_csv('data.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)

def find_ninty_day_avg(row):
    start = row.name - pd.Timedelta(days=90)
    end = row.name
    rolling_df = df[start:end]
    grouped = rolling_df.groupby([rolling_df.index.hour, rolling_df.index.minute]).agg('mean')
    return grouped.loc[(row.name.hour, row.name.minute)]['Level (Inches)']

df['Ninty_Day_Avg_Lvl'] = df.apply(find_ninty_day_avg, axis=1)

У меня около 50000 точек данных. Мой код застрял. Я думаю, что это занимает слишком много времени. Есть ли способ сделать это?

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