Ускорение обработки DataFrame

Имеется файл, который содержит 320 тысяч строк. В каждой строке 8 стобцов:

[state,time,tvs,tvel,kk,kq,kr]

В целом, выборка состоит из 100 различных states.

Мне нужно обработать 99 states (все, кроме 0) следующим образом: для каждой строки дата фрейма:

kr=(kr - kr0)/kr), где kr0 - kr для строки с такими же параметрами tvs, tvel, time, но в состоянии states==0

(Проще говоря - отклонение от номинального значения). В каждом из 99 состояний 3120 точек.

Суть в том, что на обработку одного из 99 состояний уходит около 100 секунд. Как можно оптимизировать расчеты и обращение к элементам дата фрейма? Может заменить loc на то-то другое? Спасибо

Я реализовал это следующим образом (последовательный перебор):

import numpy as np
import pandas as pd

names = 'путь к локальной папке'
names = glob.glob(names, recursive=True)
for i,f in enumerate(names):
    table=pd.concat([pd.read_csv(f) for i,f in enumerate(names)], ignore_index=True)
    # теперь table выглядит так, как если бы мы считали пример входных данных

vc=table.query('state==0')
dkr=table.loc[:,'kr']
krd=vc.loc[:,'kr']
itable=pd.DataFrame(None,None,['dKR'],None,None)

for _state in range (1,100):
    vacb=table.query('state==@_state & time==0')
    for i in vacb.index:
        res=100*(dkr[i]-krd[i%3120])/krd[i%3120]
        itable.loc[i]=res

UPD: Пример входных данных:

state time,tvs,tvel,kk,kq,kr
0,0,94,277,1.0832,1.225,1.32692
1,0,94,277,1.0844,1.227,1.33055
2,0,94,277,1.0828,1.217,1.31776
3,0,94,277,1.0807,1.216,1.31413
4,0,94,277,1.0791,1.217,1.31326
5,0,94,277,1.0768,1.222,1.31584
6,0,94,277,1.0742,1.224,1.31482
7,0,94,277,1.0715,1.227,1.31473
8,0,94,277,1.0682,1.230,1.31388
9,0,94,277,1.0650,1.231,1.31100

То, что выполняет мой алгоритм - это точный расчет отклонения величины kr в состояниях, отличных от 0 (states!=0). Написанный мной код работает очень долго - 100 секунд на расчет одного состояния. Я хочу увеличить скорость расчета.


Ответы (1 шт):

Автор решения: Vasilyev Marat

Заменить тип itable на array и присоединять методом append.

import numpy as np
import pandas as pd

names = 'путь к локальной папке'
names = glob.glob(names, recursive=True)
for i,f in enumerate(names):
    table=pd.concat([pd.read_csv(f) for i,f in enumerate(names)], ignore_index=True)

itable=[]
vc=table.query('state==0')
dkr=table.loc[:,'kr']
krd=vc.loc[:,'kr']

for _state in range (1,100):
    vacb=table.query('state==@_state & time==0')
    for i in vacb.index:
        res=100*(dkr[i]-krd[i%3120])/krd[i%3120]
        itable.append(res)
→ Ссылка