Как написать для l oop с мин. / Макс. Для каждой группы, а затем вычислить с этими значениями по группам для всех этих значений в группе? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть CSV-файл со следующими столбцами: UniqueWellIdentifier (UWI); Глубина; Пористость (PHI); NeutCount (NEUT).

Для каждого UWI мне нужно знать, что такое NEUT max и min, чтобы определить наклон и точку пересечения для каждой группы UWI. Каждый UWI будет иметь немного другое преобразование для использования в столбце NEUT. Таким образом, каждая скважина будет иметь разные NEUT max / min, SLOPE, INTERCEPT, и он будет использовать это преобразование для всего столбца NEUT для этой c скважины, а затем перейдет к следующей.

Это классические c шаги, на которые я ссылаюсь:

  1. SLOPE = (log (PHIHI / PHILO)) / (CPSLO - CPSHI)

  2. INTCPT = PHIHI / (10 ^ (CPSLO * SLOPE))

  3. NEUTPOR = INTCPT * 10 ^ (SLOPE * NEUT)

CPSHI = максимальное количество нейтронов (NEUT) на лунку (UWI)

CPSLO = минимальное количество нейтронов (NEUT) на лунку (UWI)

PHIHI = минимальное среднее значение PHI для всего набора данных

PHILO = минимальное среднее значение PHI для всего набора данных

Это то, что я придумал до сих пор:

q = pd.read_csv('DataFile.csv')

grouped = q.groupby(['UWI'])
for key_uwi in grouped:
    CPSHI = key_uwi.NEUT.min()
    CPSLO = key_uwi.NEUT.max()
    y = np.array([PHILO, PHIHI])
    y = 10**(y / 10.0)
    x = np.array([CPSHI, CPSHLO], 1)
    key_uwi.loc[q.UWI ==key_uwi] = key_uwi.NEUTPOR = [p[i] for i in key_uwi.NEUT]
    q['NEUTPOR'] = NEUTPOR

Я получаю сообщение об ошибке: объект 'tuple' имеет нет атрибута 'NEUT'

Большая проблема в том, что мне нужны max и min NEUT для каждой группы UWI, а затем запустить преобразование y = mx + b через весь столбец NEUT для КАЖДОГО UW Я отдельно.

Я даже не знаю, правильно ли я делаю для l oop, и я не уверен, что даже искать, чтобы найти то, что я ищу, для дополнительных Помогите. Любой пу sh в нужном направлении поможет.

1 Ответ

0 голосов
/ 06 мая 2020

Рассмотрим вызов groupby().apply(), поскольку вы выполняете вычисления с несколькими агрегатами. Ниже может потребоваться проверка на выборочных данных:

PHIHI = q.groupby(['UWI'])['XPHI'].max().mean() 
PHILO = q.groupby(['UWI'])['XPHI'].min().mean()

def calc_np(grp):
   PHI_Maxes = grp['XPHI'].max() 
   PHI_Mins = grp['XPHI'].min() 
   CPSHI = grp['NEUT'].min() 
   CPSLO = grp['NEUT'].max()

   SLOPE = (np.log(PHIHI / PHILO)) / (CPSLO - CPSHI)
   INTCPT = PHIHI / (10**(CPSLO * SLOPE))
   NEUTPOR = INTCPT * 10**(SLOPE * grp['NEUT'])

   return pd.Series(NEUTPOR)

# CALCULATE NEW COLUMN ZBY GROUP
q['NEUTPOR'] = q.groupby(['UWI']).transform(calc_np)
...