Как итеративно суммировать элементы одного столбца в кадре данных - PullRequest
0 голосов
/ 09 июля 2019

Я новичок. У меня есть фрейм данных, который содержит ежегодные данные о электрической нагрузке с разрешением 5 минут для 100 потребителей (каждый CSV имеет> 100 000 линий). Для конкретного клиента мне нужно найти скользящий максимальный получасовой спрос на каждый месяц. Поскольку мои данные за каждые 5 минут, я агрегирую 6 записей в мощность нагрузки колонки (кВт) подряд

ID  Date_time   load power (kW)
0   1/01/2018 0:00  0.191566105
1   1/01/2018 0:05  0.193145833
2   1/01/2018 0:10  0.192853152
3   1/01/2018 0:15  0.270974475
4   1/01/2018 0:20  0.290183338
5   1/01/2018 0:25  0.185485805
6   1/01/2018 0:30  0.208431765
7   1/01/2018 0:35  0.269577658
8   1/01/2018 0:40  0.268412758
9   1/01/2018 0:45  0.286095837
10  1/01/2018 0:50  0.301008341
11  1/01/2018 0:55  0.390496602
12  1/01/2018 1:00  0.406787652
13  1/01/2018 1:05  0.229862502
14  1/01/2018 1:10  0.190870833
15  1/01/2018 1:15  0.190224999

Значения мощности нагрузки (кВт) необходимо суммировать для 6 записей (5 минут * 6 = 30 минут) подряд, чтобы индекс 0-5, индекс 1-6, 2-7 ... и найдите максимум в столбце succ_6 для каждого месяца

ID  Date_time   load power (kW) succ_6
0   1/01/2018 0:00  0.191566105 1.324208707
1   1/01/2018 0:05  0.193145833 1.341074367
2   1/01/2018 0:10  0.192853152 1.417506192
3   1/01/2018 0:15  0.270974475 1.493065799
4   1/01/2018 0:20  0.290183338 1.508187161
5   1/01/2018 0:25  0.185485805 1.519012164
6   1/01/2018 0:30  0.208431765 1.724022961
7   1/01/2018 0:35  0.269577658 1.922378848
8   1/01/2018 0:40  0.268412758 1.882663692
9   1/01/2018 0:45  0.286095837 1.805121767
10  1/01/2018 0:50  0.301008341 1.70925093
11  1/01/2018 0:55  0.390496602 1.604063424
12  1/01/2018 1:00  0.406787652 1.408709679
13  1/01/2018 1:05  0.229862502 1.192568766
14  1/01/2018 1:10  0.190870833 1.236928491
15  1/01/2018 1:15  0.190224999 1.321553317

Это должно быть сделано за каждый месяц

например 0-5, 1-6,2-7,3-8 ......

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

def monthly_hh_maximum (df_input, filenames,file_path):
    # to store maximum half hourly demand (m_max) for each consumer for each month of year (m_o_y)
    df_m_hh_max =pd.DataFrame(columns=['filename','m_o_y','m_max'])
    # 100 consumers, 100 filenames
    for filename in filenames: 
        print(filename)
        #finds out unique months of year from date in given time series data
        month_o_year=df_input[filename]['Date_conv'].unique()  
        #looping over months of year for one consumer
        for m_o_y in month_o_year:
            # find out the number of days in the given month
            df_input_m_o_y_len=((df_input[filename].loc[df_input[filename]['Date_conv']==m_o_y]))['Date_conv'].size 
            df_temp=df_input[filename].loc[df_input[filename]['Date_conv']==m_o_y]
            print(df_input_m_o_y_len)
            monthly_mm=0 
            for i in range (0,df_input_m_o_y_len-6):
                #Next line retrieves a view of dataframe which has data for that particular
                # month and iteratively sums successive 6 elements of column load power to find the maximum 
                monthly_mm_temp= ((df_input[filename].loc[df_input[filename]['Date_conv']==m_o_y]))['load power (kW)'].iloc[i:i+6].sum()
                print(i)
                print(monthly_mm_temp)
                print(m_o_y)
                if(monthly_mm>monthly_mm_temp):
                    monthly_mm=monthly_mm
                else:
                    monthly_mm=monthly_mm_temp
            df_m_hh_max['filename']=filename
            df_m_hh_max['m_o_y'] = m_o_y
            df_m_hh_max['m_max'] = monthly_mm

Я пытаюсь сократить время вычислений, поскольку у меня ограниченные ресурсы, и я понимаю, что мой код неэффективен.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Используя приведенные выше предложения @Dan и @Zipa, здесь у меня есть столбец str month, по которому я группирую его по месяцам, а затем генерирую roll_sum для каскадного окна с 6 элементами в каждом. Затем снова группируем по месяцам и генерируем максимальные значения, а затем уникальные значения. Я генерирую все эти значения для проверки результатов. Окончательный код будет намного короче.

def demand_a_savings (df_input, filenames,file_path):
    for filename in filenames:
        df_input[filename]['rolling_sum_b'] = df_input[filename].groupby('Month')['load power (kW)'].transform(lambda x: x.rolling(6,6).sum())
        df_input[filename]['max_value_b']=df_input[filename].groupby('Month')['rolling_sum_b'].transform(lambda x:x.max())
        print(df_input[filename]['max_value_b'].unique())
0 голосов
/ 09 июля 2019

Учитывая, что ваш пример трудно читать, я предполагаю, что это то, что вы ищете:

df = pd.DataFrame({'value': np.random.randint(1, 10, 50)})
df['customer'] = (df.index // (df.shape[0] / 2) + 1).astype(int)

Выше будут созданы случайные данные для 2 клиентов. Теперь код:

rm = df.groupby('customer').value.rolling(6, 1).max()

Приведенное выше сгруппирует ваши данные в группы 6 с минимальным вхождением 1 (которое вы можете удалить и получить NaN).

Наконец, чтобы добавить это как столбец, используйте:

df.assign(rolling_max=rm.reset_index(level=0, drop=True))

Идея для max взята из здесь .

EDIT

Учитывая ваш пример, теперь я бы использовал это:

df['succ_6'] = df['load power (kW)'][::-1].rolling(6, 1).sum()
df.groupby(df['Date_time'].dt.strftime('%B'))['succ_6'].max()

#Date_time
#January    1.922379
#Name: succ_6, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...