Ускорение обработки 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 шт):
Заменить тип 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)