Чтение большого текстового файла в фрейм данных для анализа данных в Python - PullRequest
0 голосов
/ 02 октября 2018

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

У меня большой текстовый файл (от 50 000 до 5 000 000 строк текста).Мне нужно обработать каждую строку этого файла и записать его в Dataframe, чтобы я мог провести некоторый анализ данных на них.

В информационном фрейме 9 столбцов, в основном, с плавающей точкой, а некоторые строки - нет.строк ~ нет.строк во входном файле

В настоящее время я читаю этот файл построчно, используя «with open ..», а затем использую регулярное выражение для извлечения необходимых данных и записи их в виде строки во фрейм данных.Поскольку это происходит через цикл For, его выполнение занимает вечность.

Каков наилучший способ сделать это?Любые указатели или примеры программ?Должен ли я даже использовать фрейм данных?

Вот мой код.

    def gcodetodf(self):


    with open(self.inputfilepath, 'r') as ifile:

        lflag = False
        for item in ifile:

            layermatch = self.layerpattern.match(item)
            self.tlist = item.split(' ')
            self.clist = re.split(r"(\w+)", item)

            if layermatch and (str(self.tlist[2][:-1]) == 'end' or int(self.tlist[2][:-1]) == (self.endlayer + 1)):
                break

            if (layermatch and int(self.tlist[2][:-1]) == self.startlayer) or lflag is True:
                lflag = True
                # clist = re.split(r"(\w+)", item)

                map_gcpat = {bool(self.gonepattern.match(item)): self.gc_g1xyef,
                             bool(self.gepattern.match(item)): self.gc_g1xye,
                             bool(self.gtrpattern.match(item)): self.gc_g1xyf,
                             bool(self.resetextpattern.match(item)): self.gc_g92e0,
                             bool(self.ftpattern.match(item)): self.gc_ftype,
                             bool(self.toolcompattern.match(item)): self.gc_toolcmt,
                             bool(self.layerpattern.match(item)): self.gc_laycmt,
                             bool(self.zpattern.match(item)): self.gc_g1z}

                map_gcpat.get(True, self.contd)()

    # print(self.newdataframe)

пример функции, которая записывает данные в кадр данных, выглядит следующим образом:

def gc_g1xye(self):
    self.newdataframe = self.newdataframe.append(
        {'Xc': float(self.tlist[1][1:]), 'Yc': float(self.tlist[2][1:]), 'Zc': self.gc_z,
         'E': float(self.tlist[3][1:]),
         'F': None, 'FT': self.ft_var, 'EW': self.tc_ew, 'LH': self.tc_lh, 'Layer': self.cmt_layer},
        ignore_index=True)

пример входного файла:

........
G1 X159.8 Y140.2 E16.84505
G1 X159.8 Y159.8 E17.56214
M204 S5000
M205 X30 Y30
G0 F2400 X159.6 Y159.8
G0 X159.33 Y159.33
G0 X159.01 Y159.01
M204 S500
M205 X20 Y20
;TYPE:SKIN
G1 F1200 X140.99 Y159.01 E18.22142
G1 X140.99 Y140.99 E18.8807
G1 X159.01 Y140.99 E19.53999
G1 X159.01 Y159.01 E20.19927
M204 S5000
M205 X30 Y30
G0 F2400 X150.21 Y150.21
M204 S500
M205 X20 Y20
G1 F1200 X149.79 Y150.21 E20.21464
G1 X149.79 Y149.79 E20.23
G1 X150.21 Y149.79 E20.24537
G1 X150.21 Y150.21 E20.26073
M204 S5000
M205 X30 Y30
G0 F2400 X150.61 Y150.61
M204 S500
M205 X20 Y20
G1 F1200 X149.39 Y150.61 E20.30537
G1 X149.39 Y149.39 E20.35
G1 X150.61 Y149.39 E20.39464
..........

1 Ответ

0 голосов
/ 03 октября 2018

Помните, что DataFrame.append возвращает копию вашего старого DataFrame с добавленными новыми строками: он не работает на месте.Построение построчно DataFrame с использованием append будет работать в O (n ^ 2) вместо O (n), что довольно плохо, если у вас 5 миллионов строк ...

Что вы хотите сделатьвместо этого следует сначала добавить каждую строку в список (список слов в порядке), а затем создать объект DataFrame из этого, как только будет выполнен весь анализ.Это будет намного быстрее, потому что добавление в список выполняется за постоянное время, поэтому ваша общая сложность должна быть O (n).

def gc_g1xye(self):
    self.data.append(
        {'Xc': float(self.tlist[1][1:]), 'Yc': float(self.tlist[2][1:]), 'Zc': self.gc_z,
         'E': float(self.tlist[3][1:]),
         'F': None, 'FT': self.ft_var, 'EW': self.tc_ew, 'LH': self.tc_lh, 'Layer': self.cmt_layer})

...

# Once the parsing is done:
self.newdataframe = pd.DataFrame(self.data)

Это лучший способ сделать это?Это выглядит как хорошее начало для меня.Вы должны использовать DataFrame?Исходя из того, что вы говорите, что хотите делать с данными после их анализа, DataFrame звучит как хороший вариант.

В качестве случайного несвязанного совета я рекомендую пакет tqdm для отображения индикатора выполнения вашего цикла for.Он очень прост в использовании и помогает вам определить, стоит ли ждать окончания цикла!

...