Techlog Python

Последнее сообщение
katamaran 17 7
Янв 18

Добрый день, коллеги.

Пара вопросов:

1. По каким материалам осваивать python в Techlog? Может существуют подробные описания python для Techlog, как писать скрипты, какие классы есть, какие свойства и пр?

2. Как написать скрипт, который будет выполнять разные действия (например вычислять кривую) по разным формулам для различных зон?

Спасибо.

Celebrity 1677 13
Янв 18 #1

а у вас уже хорошие навки в самом питоне, как языке прогромирования?

Петя Ботев 936 9
Янв 18 #2

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

kealon 120 12
Янв 18 #3

ага, ещё и базовые примеры есть

katamaran 17 7
Янв 18 #4

В хэлпе ответ на второй вопрос найти не удалось. Подскажите, может смотрю не туда?

Спасибо.

Петя Ботев 936 9
Янв 18 #5

На второй вопрос рекомендую использовать стандартные скрипты Техлога. Там тьма примеров начиная от расчета глинистости по ГК (это же примерно то что Вам надо?) . Где их найти понимаете?

katamaran 17 7
Янв 18 #6

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

Дело в том, что у меня в каждой скважине есть две зоны - условно TOPZONE и BOTZONE, и мне нужно в одном интервале считать по формуле y=a1*x+b1 а в другом y=a2*x+b2. Может кто сталкивался с такой задачкой?

Спаисбо.

kealon 120 12
Янв 18 #7

и такой пример в российской поставке тоже был ZONE_NAME или Zone если меня память не подводит переменная называется.

katamaran 17 7
Янв 18 #8

Пока не нашел( Теоретически можно было бы использовать таблицу с зонами, но они с кривыми лежат в разных "наборах данных".

sds932 7 6
Янв 18 #9

Напишите в поддержку Techlog в SIS. Уверен, там помогут

zi2do 17 13
Янв 18 #10

Для зон нужно использовать формат ZONE и использовать для каждой зоны отдельную формулу

Myp3uJIKA 237 14
Янв 18 #11

1. В датасете с расчетной кривой заведите переменную, которая содержит имя зоны.

2. Далее все просто как апельсин. С отступами надеюсь разберетесь. Ну и названия переменных и мнемоники подставьте.

w=db.selectedWelllist()[0]

d="LQC"

v1=db.variableData(w,d,datavarname)

zone=db.variableData(w,d,zonevarname)

i=0

lng=len(v1)

v2=[MissingValue]*lng

while i<lng:

if zone[i]=="ZONA 1":

v2[i]=a1*v1[i]+b1

if zone[i]=="ZONA 2":

v2[i]=a2*v1[i]+b2

i=i+1

db.variableSave(w,d,"RESULT","result ramily","result unit",v2)

katamaran 17 7
Янв 18 #12

Огромное спасибо, за развернутый ответ!

Я делают так - поскольку кривые и зоны у меня в разных датасетах:

w=db.selectedWelllist()[0]

d="LAS"

v1=db.variableData(w,d,"GR")

d = "ZONES"

if db.variableExists(w,d,"Zone Name"):

 zone = db.variableData(w,d,"Zone Name")

но даже после проверки variableExists возникает ошибка:

Traceback (most recent call last):

  File "<string>", line 11 (90), in <module>

AttributeError: 'module' object has no attribute 'variableData'

Как быть?

Спасибо.

Myp3uJIKA 237 14
Янв 18 #13

Ошибка, которую генерит пайтон, говорит о том, что в модуле db нет метода (функции) variableData.

Тут в общем случае варианта два

1. Либо вы где-то ранее переприсвоили переменной db другое значение, указывающее на другой модуль (не аутентичный db),

2. Либо вы написали variableData как то неправильно (может русская буква где то вместо англ)

Первое маловероятно, но проверить стоит (у вас в скрипте видимо еще строки есть).

По второму - вы функции же, надеюсь, вставляете через внутреннюю подсказку? Пишете в скрипте db, ставите точку и потом в появившемся меню выбираете нужную с помощью букв и стрелок на клаве, потом нажимаете tab, потом скобку открывающуюся....? Именно так надо делать при написании скрипта, если только у вас не повторяющиеся блоки кода. Это исключит ошибки при ручном вводе.

А то при копировании с какими-нибудь автозаменителями рус-англ может чот попало произойти.

 

katamaran 17 7
Янв 18 #14

Спасибо!

Оказалось, что у меня нет такого метода поскольку TechLog номер 16)

Они рекомендуют использовать db.variableLoad().

Можно я еще вас помучаю: я правильно понимаю, что в вашем примере зоны это нет таблица, а что-то типа кривой, т.е на каждой глубине есть значение с именем зоны? И поэтому вы можете писать вот так zone[i]=="ZONA 1"

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

Огромное спасибо за помощь!

Myp3uJIKA 237 14
Янв 18 #15

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

Исходя из того, что ваш уровень владения языком - начальный, я вам рекомендую скопировать кривую Zone Name из датасета с зонами в датасет LAS. Это можно сделать массово, если в окне интерполяции указать все скважины во вкладке Скважины.

Но, при последующем ручном изменении границ зон в зонном датасете придется заново копировать в LAS.

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

....

md_zone=db.variableData(w,zone_dataset,zone_mdname)

zones=db.variableData(w,zone_dataset,zone_name)

zone1top=md_zone[0]

zone1bot=md_zone[1]

zone2top=md_zone[2]

zone2bot=md_zone[3]

......

while i<lng: #основной расчетный цикл

if md[i]>=zone1top and md[i]<=zone1bot:

#делаем расчет для 1 зоны

if md[i]>=zone2top and md[i]<=zone2bot:

#делаем расчет для 2 зоны

Петя Ботев 936 9
Янв 18 #16

katamaran пишет:

Спасибо!

Оказалось, что у меня нет такого метода поскольку TechLog номер 16)

Они рекомендуют использовать db.variableLoad().

Можно я еще вас помучаю: я правильно понимаю, что в вашем примере зоны это нет таблица, а что-то типа кривой, т.е на каждой глубине есть значение с именем зоны? И поэтому вы можете писать вот так zone[i]=="ZONA 1"

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

Огромное спасибо за помощь!

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

 

if md[i] >"ZONA 1" and md[i]<"ZONA 2":

v2[i]=a1*v1[i]+b1

elif md[i]>"ZONA 2":

v2[i]=a2*v1[i]+b2

i=i+1

 

ну как вариант))))

katamaran 17 7
Янв 18 #17

Спасибо! В итоге реализовал вот так (без копирования в один датасет):

# умножаем кривую GR на 2 в зоне ZONE1

w=db.selectedWellList()[0]

d="LAS" # датасет с кривыми

gr=db.variableLoad(w,d,"GR")

md=db.variableLoad(w,d,"DEPT")

d="ZONE" # датасет с зонами

if db.variableExists(w,d,"Zone Name"):

    zone_name = db.variableLoad(w,d,"Zone Name")

    zone_md = db.variableLoad(w,d,"MD")

    zone=[[zone_name[:-1], zone_md[:-1], zone_md[1:]]]

else:

    print "Ups!"

i=0

lng=len(gr)

gr2=[MissingValue]*lng

for z in zone:

while i<lng:

if z[0][0]=="ZONE1" and md[i]>z[1][0] and md[i]<=z[2][0]:

    gr2[i]=2*gr[i]

i=i+1

d="LAS"

db.variableSave(w,d,"GR2","result ramily","result unit",gr2)

Еще раз, Большое спасибо за помощь!

 

Петя Ботев 936 9
Янв 18 #18

Myp3uJIKA пишет:

while i<lng: #основной расчетный цикл

if md[i]>=zone1top and md[i]<=zone1bot:

#делаем расчет для 1 зоны

if md[i]>=zone2top and md[i]<=zone2bot:

#делаем расчет для 2 зоны

 

тысяча извинений)))  но давайте избежим двойной проверки условий. второй иф заменим на елиф.

Myp3uJIKA 237 14
Янв 18 #19

Петя Ботев пишет:

тысяча извинений)))  но давайте избежим двойной проверки условий. второй иф заменим на елиф.

Сферически в вакууме согласен.

елиф предполагает написание заглушки else, а это удлиняет скрипт, кроме того лишняя проверка добавит микросекунду в общем расчете скрипта. Так что сильно по времени не выиграешь, а скрипт дольше писать! :)

Если скрипт простой на несколько скважин - сильно не заморачиваешься над оптимизацией.

Иногда выгоднее писать проще, чем правильнее.

 

 

Myp3uJIKA 237 14
Янв 18 #20

katamaran пишет:

Спасибо! В итоге реализовал вот так (без копирования в один датасет)

Как то вы с другой стороны зашли, ну да ладно. Я привык плясать от данных к зонам, а не наоборот. У вас будут лишние итерации всего датасета LAS на ненужных зонах. Вот например если у вас две зоны раздельно друг от друга созданы (не слитно), то вместо 2 итераций будет 4.

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

В общем работает и ладно :)

katamaran 17 7
Янв 18 #21

Да, конечно вы правы.

Правильней поменять местами циклы. У меня просто одна зона была.

Расскажите пожалуйста, а как вы постигли Python for Application:) Только по примерам, help или курсы, книги?

kealon 120 12
Янв 18 #22

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

katamaran, вы думаете есть какая-то потребность в полных курсах именно по python (он в принципе и в петреле используется) с разбором ситуаций по применению в нефтяной отрасли?

katamaran 17 7
Янв 18 #23

Да сам питон не проблема - по нему есть всё что угодно -  книги, курсы, вебинары и пр. Да собственно форумов сотни, где можно выяснить любые вопросы.  Проблема с python for Techlog. Видимо, я излишне оптимистичен, но тот-же Геопоиск имеет подробнейшее описание своего скриптового языка, где описано всё, приведены примеры и пр. Наверное, у Techlog другая политика продвижения, ориентированная на специальные корпоративные курсы. Или я чего-то упускаю? В общем хочется книги))

P.S. В контексте данной задачи, в какой-то момент, я уж думал выгрузить все данные из Techlog и на питоне же написать пару скриптов, которые решали бы мои проблемы. Но, спасибо вам, коллеги, спасли от странного)

Myp3uJIKA 237 14
Янв 18 #24

katamaran пишет:

Да, конечно вы правы.

Правильней поменять местами циклы. У меня просто одна зона была.

Расскажите пожалуйста, а как вы постигли Python for Application:) Только по примерам, help или курсы, книги?

Я не постиг Python for Application :) Я нефтяной геолог, но это не значит, что я могу поднять камень и сказать что это за минерал :)

Я знаю только Python в применении к Techlog. И то далеко не весь. Системным программированием на пайтоне я не занимаюсь.

Как изучить? Как говорят лучше один раз пощупать, чем сто раз посмотреть.

1. Посмотрите простые скрипты в папке компании. Как они написаны, как организован ввод-вывод. Там достаточно просто все.

2. Потом пробуйте сами. делайте по образу и подобию встроенных скриптов. Семантика языка вся в инете есть, я всегда пользуюсь яндексом.

3. Встроенный хелп для изучения языка я не использовал. Там нет того, что бы мне было надо.  И организован он по дебильному. В нем можно найти только описание навороченных функций, используемых только в техлоге. Большинство из них вам не понадобятся. Кроме того, зачастую функции идут из библиотек, поэтому совершенно непрозрачны. Проще самому функцию написать чтобы точно понимать что и как подкрутить.

4. Курсы не посещал. Книги не читал.

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

 

MatlubaMaxmudova 2 0
Окт 20 #25

Добрый день всем! У кого нибудь есть методичка по техлог на русском языке? 

AErmilov 11 7
Окт 20 #26

MatlubaMaxmudova пишет:

Добрый день всем! У кого нибудь есть методичка по техлог на русском языке? 

Добрый день!

Думаю, Вам понравится что-то такое, и от этого будет больше пользы, чем от текстовой методички: https://youtu.be/dg6CT2l0zn8

У этих ребят, кстати, на канале (PETROSCHOOL) много качественного контента окологеологического.

MatlubaMaxmudova 2 0
Окт 20 #27

Доброе утро. Я как раз учусь по этим видео урокам. У меня базовая версия и не получается посчитать пористость по нейтронке. Метод заблокирован. Как мне поступить?

 

Myp3uJIKA 237 14
Окт 20 #28

1. Изучаете предмет "Интерпретация ГИС".

2. Пишете скрипт, который реализует методику расчета пористости по нейтроннику.

3. Запускаете, выгружаете результат.

....

Профит!!!

vktr 144 8
Окт 20 #29

Некропостинг.

есть такая функция в подсказках все аргументы есть.

db.datasetZoneIndice

Описанный ранее вариант тоже годится но необходимо каждый раз вдатасете в котором происходит расчет обновлять Zone Name иначе при изменеениях зонаций они не учтуться в LQC.

If или elif разница в том как будет исполнятся код а не в скорости исполнения. eilf выполняетсятолько после не выполнения if. 

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

Петя Ботев 936 9
Окт 20 #30

vktr пишет:

Некропостинг.

есть такая функция в подсказках все аргументы есть.

db.datasetZoneIndice

Описанный ранее вариант тоже годится но необходимо каждый раз вдатасете в котором происходит расчет обновлять Zone Name иначе при изменеениях зонаций они не учтуться в LQC.

If или elif разница в том как будет исполнятся код а не в скорости исполнения. eilf выполняетсятолько после не выполнения if. 

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

в смысле на скорость не влияет? Ты же сам пишешь - синтаксис структур отличается либо одной, либо двумя проверками.

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

Да и в любом случае - код писать нужно грамотно)))) 

 а по db.datasetZoneIndice - она возвращает же индекс массива, а не глубину. Я к тому что функция крутая, но чуть чуть сложнее структура будет. На пару строчек кода))))

sergiv 7 3
Окт 20 #31

Добрый день. Подскажите пожалуйста, как прописать в Python так, чтобы производились вычисления точек на глубине первого (1м) и пятого метра (5м) (например пористость данных глубин суммируется и присваиватся к глубине 1 метр) и т.д. вычислять каждую точку следующей глубины и точку через пять метров.

vktr 144 8
Окт 20 #32

Петя Ботев пишет:

vktr пишет:

Некропостинг.

есть такая функция в подсказках все аргументы есть.

db.datasetZoneIndice

Описанный ранее вариант тоже годится но необходимо каждый раз вдатасете в котором происходит расчет обновлять Zone Name иначе при изменеениях зонаций они не учтуться в LQC.

If или elif разница в том как будет исполнятся код а не в скорости исполнения. eilf выполняетсятолько после не выполнения if. 

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

в смысле на скорость не влияет? Ты же сам пишешь - синтаксис структур отличается либо одной, либо двумя проверками.

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

Да и в любом случае - код писать нужно грамотно)))) 

 а по db.datasetZoneIndice - она возвращает же индекс массива, а не глубину. Я к тому что функция крутая, но чуть чуть сложнее структура будет. На пару строчек кода))))

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

Да она возвращает индекс. Но и с копированием имен пластов в датасет тоже не одна строчка, если по уму делать. 

 

vktr 144 8
Окт 20 #33

sergiv пишет:

Добрый день. Подскажите пожалуйста, как прописать в Python так, чтобы производились вычисления точек на глубине первого (1м) и пятого метра (5м) (например пористость данных глубин суммируется и присваиватся к глубине 1 метр) и т.д. вычислять каждую точку следующей глубины и точку через пять метров.

Используя цикл for пробежаться по каротажам и посчитать нужное.  Допустим мы загрузили все каротажи как лист, а не обьект. Тогда для доступа к различным глубинам проще использовать индексы листа например POR[i+1/sr] - пористость на i том индексе плюс количество индексов в одном метре. Для того, что бы узнать шаг квантования можно использовать функцию db.datasetSamplingRate(Well, DataSet)  

 

Петя Ботев 936 9
2 нед. #34

Апну ка я тему)))

Коллеги, никто не баловался питонной реализацией QElan? Не в нампи, это уже сделали. А именно через внутренние функции модуля. 

Вроде функции TechlogQuanti есть.  А вот work flow ну прям не очевиден. То есть интуитивно то вроде как понятно, что нужно делать, но как в детали капнешь - и пропадаешь на всегда. ну вдруг у кого есть какой то опыт или литература.

 

Всем добра))

 

 

Myp3uJIKA 237 14
2 нед. #35

В плане флейма.

Как-то в плане "реализации возможностей" сделал сам решалку системы лин, уравнений по Гауссу, попробовал, посчитал объемную модель. Ну работает и работает. Чтобы было, на всякий случай.

Ко встроенным расчетным библиотекам techlog python имею суровое отвращение, там одни черные ящики. Имею ввиду те, что выдают числа, за которые потом надо отвечать. 

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

Петя Ботев 936 9
2 нед. #36

Myp3uJIKA пишет:

В плане флейма.

Как-то в плане "реализации возможностей" сделал сам решалку системы лин, уравнений по Гауссу, попробовал, посчитал объемную модель. Ну работает и работает. Чтобы было, на всякий случай.

Ко встроенным расчетным библиотекам techlog python имею суровое отвращение, там одни черные ящики. Имею ввиду те, что выдают числа, за которые потом надо отвечать. 

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

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

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

Петя Ботев 936 9
2 нед. #37

Судя по  мертвой тишине в теме такими идеями  редко кто мается)))  Наверное действительно надо сделать выводы

Myp3uJIKA 237 14
2 нед. #38

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

Пиши, если что-то умное найдешь - интересно. 

Но сдается мне в конце будет следующий вердикт: "работает, но я это мог сделать сам за 10 минут".

vaque 396 13
1 нед. #39

Петя Ботев пишет:

Апну ка я тему)))

Коллеги, никто не баловался питонной реализацией QElan? Не в нампи, это уже сделали. А именно через внутренние функции модуля. 

Вроде функции TechlogQuanti есть.  А вот work flow ну прям не очевиден. То есть интуитивно то вроде как понятно, что нужно делать, но как в детали капнешь - и пропадаешь на всегда. ну вдруг у кого есть какой то опыт или литература.

 

Всем добра))

 

 

 а какие вопросы интересуют?

Петя Ботев 936 9
1 нед. #40

vaque пишет:

 а какие вопросы интересуют?

мое почтение)  Вопрос то в следующем. Не очевидна последовательность действий при запуске Елана через внутренние функции. Вот к примеру, думал что начинаеться все с создания Work FLow:

createQuantiElanWorkflow(name, bulkDensity, neutronPorosity, formationResistivity, flushedZoneResistivity, compressionnalSlowness, velocity, porosity, u, qv, ui, groups)

Но тут уже в первом же аргументе висит  name - Quanti.Elan method name. То есть мне уже до создания, нужно иметь методы? Что это?  

Это если в мелочах. А если глобально - есть какой нибудь мануал, или хотя бы блок схема как это все работате. ИНтуитивно понятно что нужно повторить набор дейтсвий, которые в модуле делаем. Но вот в такие мелочи  втыкаешься и всё. Дальше не знаешь куда идти.

 

Go to top