Анализ файла данных с Pandas, где заголовки могут изменить положение - PullRequest
0 голосов
/ 29 января 2020

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

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

Пример:

Software :SomeCorpSoft 2.3.4
Measurement Name;default
Created;2017-11-30T11:42:09Z
Scan Type;Threshold scan
Serial Number;A-SERIAL-NUM-1234
Sensor Nickname;
Trend Count;1
Trigger Level;0
Trigger Holdoff;0
start;0
end ;0

F1; 44.12; H; 8;
Time;F1 ;V 1 ;Hp 1 ;C 1 ;P 1 ;V 2 ;Hp 2 ;C 2 ;P 2 ;V 3 ;Hp 3 ;C 3 ;P 3 ;V 4 ;Hp 4 ;C 4 ;P 4 ;V 5 ;Hp 5 ;C 5 ;P 5 ;V 6 ;Hp 6 ;C 6 ;P 6 ;V 7 ;Hp 7 ;C 7 ;P 7 ;V 8 ;Hp 8 ;C 8 ;P 8 ;
0;13.448671;349.458099365;0;7.72320135575;-105.609801195;8.54580983665;-15.5168133183;0.0477259658688;101.686749515;4.46981738574;152.711715748;0.0728701513916;77.1428145399;17.8438225472;-163.940792731;0.95931622744;48.4915601658;0.525170185762;-85.3977558257;0.255517896038;-58.4781138655;2.0410204213;131.266863348;0.291022526301;-145.942080277;12.7706899744;-150.335793306;1.3724642398;-161.919972567;5.3790623792;-148.609825665;0.512542366745;-177.811876518;

Так что в этом примере мои фактические заголовки находятся в строке 14 (13, если это игнорирует пустые строки, не уверен насчет этого), где он начинается с Время (это константа, так что, может быть, какой-то лямбда-способ принять это во внимание?)

Но мне также нужно предыдущие строки, чтобы сформировать различные объекты в базе данных (например, " Created; " дает мне время измерения).

Затем мне нужно создать экземпляры объектов для каждого из заголовки. Они соответствуют приведенным ниже данным, например:

Time -> 0
F1 -> 13.448671
V1 -> 349.458099365
... so on...

Итак, у меня есть

import pandas as pd

df = pd.read_csv(file_dir)
for i in df.values:
    for x in i:
        if "Software" in x:
            software_ver = x.split(':')[1]
        if "Time" in x:
            headers = x

Но что такое "дешево"? Вероятно, есть Pandas способ сделать это. После этого я планировал сделать zip для каждой строки после заголовков, так как они все совпадают, чтобы я мог связать значения с заголовком, но, опять же, возможно, лучший способ сделать это, более эффективный.

Файлы могут иметь пару сотен тысяч строк, и мне нужно создать один экземпляр объекта для каждого элемента заголовка каждой строки. У текущего парсера у нас есть несколько минут, но мне нужно сократить это время.

1 Ответ

1 голос
/ 29 января 2020

Pandas является , а не синтаксическим анализатором. Это прекрасная библиотека, когда дело доходит до обработки данных, и она предоставляет несколько анализаторов для простых форматов данных. Этот формат файла не может быть проанализирован с помощью Pandas, по крайней мере, не просто и, вероятно, неэффективно.

Будет ли релевантным значение pandas, зависит от того, какую обработку вы хотите выполнить после. Если вы намереваетесь выполнять операции средней сложности, это может быть. Если вам нужно только заполнить таблицу базы данных, забудьте об этом.

Если требуется высокая производительность, вам, вероятно, следует забыть и Python. Это действительно отличный язык, и я действительно люблю программировать в Python. Но если требуется просто как можно быстрее проанализировать файл, я бы использовал C. И если задействована база данных, то сначала необходимо оптимизировать не синтаксический анализ файла, а доступ к базе данных.

Говоря иначе, это похоже на винт с молотком. В конце винт будет внутри доски, и если у вас есть только молоток, это может быть решением. Но лучше воспользоваться отверткой ...

...