расщепление неочевидных грязных строк в python - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть эта строка:

Model:                ARIMA                                       BIC:                 417.2273
Dependent Variable:   D.Sales of shampoo over a three year period Log-Likelihood:      -196.17
Date:                 2018-09-24 13:20                            Scale:               1.0000
No. Observations:     35                                          Method:              css-mle
Df Model:             6                                           Sample:              02-01-1901
Df Residuals:         29                                                               12-01-1903
Converged:            1.0000                                      S.D. of innovations: 64.241
No. Iterations:       19.0000                                     HQIC:                410.098
AIC:                  406.3399

, и я хочу превратить ее в словарь.Я уже использую: split ("\ n"), и я получаю

Model: ARIMA BIC: 417.2273
Dependent Variable: D.Sales of shampoo over a three year period Log-Likelihood: -196.17
Date: 2018-09-24 13:20 Scale: 1.0000
No. Observations: 35 Method: css-mle
Df Model: 6 Sample: 02-01-1901
Df Residuals: 29 12-01-1903
Converged: 1.0000 S.D. of innovations: 64.241
No. Iterations: 19.0000 HQIC: 410.098
AIC: 406.3399

, но я не вижу хорошего способа разделения, чтобы поместить его в словарь.Может быть, я упускаю что-то очевидное?

также обратите внимание на форматирование дат рядом с 'Образец:'

Я хочу что-то вроде: {"Model": "ARIMA", "BIC": 417.2273, ...}

1 Ответ

0 голосов
/ 25 сентября 2018

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


Если длина столбцов неизвестна

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

Если размещение ключей стабильно, вы можете использовать, чтобы в первой строке были только ключи без пробелов.

lines = input_string.splitlines()
key_values = lines[0].split()  # split first line into keys and values
column_keys = key_values[::2]  # extract the keys by taking every second element
column_starts = [lines[0].find(key) for key in column_keys]  # index of each key

Достигнув этой точки, действуйте так, как если бы длина столбцов была известна.


Если длина столбцов известна

Отдельностолбцы в их начальных индексах.

column_ends = column_starts[1:] + [None]
# separate all key: value lines
key_values = [
    line[start:end]
    # ordering is important - need to parse column-first for the next step
    for start, end in zip(column_starts, column_ends)
    for line in lines
]

Поскольку Sample использует многострочное значение, мы не можем аккуратно разделить ключи от значений в двоеточии.Вместо этого мы должны отследить ранее увиденный ключ, чтобы вставить его для значений без ключа.

data = {}
for line in key_values:
    if not line:
        continue
    # check if there is a key at the start of the line
    if line[0] != ' ':
        # insert key/value pairs
        key, value = line.split(':', 1)
        data[key.strip()] = value.strip()
    else:
        # append dangling values
        value = line
        data[key.strip()] += '\n' + value.strip()

Это дает вам словарь-ключ словарь строк:

{'Model': 'ARIMA',
 'Dependent Variable': 'D.Sales of shampoo over a three year period',
 'Date': '2018-09-24 13:20',
 'No. Observations': '35',
 'Df Model': '6',
 'Df Residuals': '29',
 'Converged': '1.0000',
 'No. Iterations': '19.0000',
 'AIC': '406.3399',
 'BIC': '417.2273',
 'Log-Likelihood': '-196.17',
 'Scale': '1.0000',
 'Method': 'css-mle',
 'Sample': '02-01-1901\n12-01-1903',
 'S.D. of innovations': '64.241',
 'HQIC': '410.098'}

Если вам нужноЧтобы преобразовать значения в не-строки, я предлагаю явно преобразовать каждое поле.Вы можете использовать таблицу отправки для каждого ключа для определения преобразования.

import time

converters = {
 'Model': str, 'Dependent Variable': str,
 'Date': lambda field: time.strptime(field, '%Y-%m-%d %H:%M'),
 'No. Observations': int, 'Df Model': int, 'Df Residuals': int,
 'Converged': float, 'No. Iterations': float, 'AIC': float,
 'BIC': float, 'Log-Likelihood': float, 'Scale': float,
 'Method': str, 'Sample': str, 'S.D. of innovations': float,
 'HQIC': float
}
converted_data = {key: converters[key](data[key]) for key in data}
...