Итерация создания фрейма данных и операций - PullRequest
0 голосов
/ 15 января 2019

У меня есть некоторые данные, которые я хотел бы разделить, подогнать, а затем соединить. Довольно плохо знаком с фреймами данных в пандах, так что я могу заставить код работать так, как задумано, но это ужасно. Мне было интересно, если бы у вас, ребята, была рекомендация, как бы вы ее украсили. Ниже приведен простой пример кода, представляющий то, что я делаю.

import numpy as np
import pandas as pd 
from scipy.optimize import curve_fit

def Quadratic(x, a, b, c):
    return a*x*x + b*x + c

data = pd.read_fwf('data.txt', header=None)
data.columns = ['x', 'f']

splits = [data['x'].iloc[ 0], 
    1, 3, 9, 10, 12
    data['x'].iloc[-1]]

data_s1 = data[( splits[0] <= data['x']) & (data['x'] < splits[1])]
    # Do this^ numerous times
data_s6 = data[( splits[5] <= data['x']) & (data['x'] <= splits[6])]

popt_s1, _ = curve_fit(Quadratic, data_s1['x'], data_s1['f'])
    # Do this^ numerous times
popt_s6, _ = curve_fit(Quadratic, data_s6['x'], data_s6['f'])

dfit_s1 = pd.DataFrame({'x' : data_s1['Z (mm)'],
                        'f' : Quadratic(data_s1['Z (mm)'], *popt_s1)})
    # Do this^ numerous times
dfit_s6 = pd.DataFrame({'x' : data_s6['Z (mm)'],
                        'f' : Quadratic(data_s6['Z (mm)'], *popt_s6)})

dfit = pd.concat([dfit_s1, # ... etc.
                  dfit_s6])

В двух словах я сделал следующее:

  1. Загрузить данные
  2. Создание массива от начала и до конца области данных с произвольным расположением срезов
  3. Создать новые фреймы данных, соответствующие указанному массиву разбиения
  4. Подгонка секций к функции
  5. Создание новых фреймов данных с использованием параметров подгонки
  6. Соедините их вместе, чтобы сформировать большой фрейм данных

Мой запрос на элегантность действительно относится только к частям 3-5. Это не нравится в коде и не может быть легко расширяемым (скажем, я хочу 12 разделов вместо 6). Было бы здорово, если бы я мог просто добавить элемент в разделяющий массив.

Я пытался выяснить, как обернуть их в for петли, но не могу получить чистую вещь. Я открыт для всех форм, не только для for, это был просто пример. Я хотел бы также иметь возможность создавать кадры / массивы (параметры подгонки, ковариации, подгонки). Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...