Last active
October 6, 2019 12:01
-
-
Save vporoshok/0a11f9800a573a7694b5b7d3581c2c3a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Добрый день!\n", | |
"\n", | |
"Нужно срочно решить проблему с пересчетом показателей!\n", | |
"\n", | |
"Делали все по инструкции:\n", | |
"1. Заполнили обе таблицы перевода единиц измерения (см. вложения \"Таблица конвертации ЕИ\", \"Таблица мультипликации ЕИ\").\n", | |
"2. В таблицу значений внесли данные по совокупному конечному энергопотреблению природного газа с 2017 по 2021 годы в единице измерения Mtoe.\n", | |
"3. Запустили расчет.\n", | |
"\n", | |
"Данные рассчитались некорректно – значения в Twh отличаются от Gwh на 2 порядка (см. вложение \"Данные TFC\"), а не на 3, как должно быть. При этом в таблице перевода цифры правильные – степень Gwh -9, степень Twh -12, разница -3. В таблице \"Данные TFC\" для наглядности оставил только исходные значения в Mtoe и значения в Gwh и Twh, рассчитанные некорректно. В значениях, рассчитанных в остальных единицах измерения, ошибок не нашел, поэтому убрал их из таблицы \"Данные TFC\".\n", | |
"\n", | |
"Прошу срочно исправить алгоритм расчета (см. вложение \"Алгоритм расчета ЕИ\").\n", | |
"\n", | |
"Также прошу максимально оптимизировать алгоритм расчета с целью повышения быстродействия." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"def algo_with_comments():\n", | |
" res = [] + T_values\n", | |
" # 1. Начало расчета:\n", | |
" # 2. Получить P_indicators – параметр запуска расчета, массив записей таблицы T_indicators;\n", | |
" # 3. Получить P_resources – параметр запуска расчета, массив записей таблицы T_resources;\n", | |
" # 4. Получить P_years – параметра запуска расчета, массив записей таблицы T_years;\n", | |
" # 5. Для очередного показателя I из P_indicators:\n", | |
" for I in P_indicators:\n", | |
" # 5.1. Для очередного ресурса R из P_resources:\n", | |
" for R in P_resources:\n", | |
" # 5.1.1. Для очередного года Y из P_years:\n", | |
" for Y in P_years:\n", | |
" while True:\n", | |
" # 5.1.1.1. Получить M_values – массив записей T_values, каждая из которых удовлетворяет\n", | |
" # условию [[Значение поля «Показатель» = I] и [Значение поля «Ресурс» = R] и [Значение\n", | |
" # поля «Год» = Y]];\n", | |
" M_values = [x for x in res if x['indicator'] == I and x['resource'] == R and x['year'] == Y]\n", | |
" # 5.1.1.2. Получить M_calculated – массив записей T_multiplication, каждая из которых\n", | |
" # удовлетворяет условию [[Значение поля «Базовая ЕИ» содержится в поле «Единица\n", | |
" # измерения» какой-либо записи M_values] и [Значение поля «Расчетная ЕИ» не\n", | |
" # содержится в поле «Единица измерения» записей M_values]];\n", | |
" units = [x['unit'] for x in M_values]\n", | |
" M_calculated = [x for x in T_multiplication if x['base_unit'] in units and x['calc_unit'] not in units]\n", | |
" # 5.1.1.3. Получить M_based – массив записей T_multiplication, каждая из которых\n", | |
" # удовлетворяет условию [[Значение поля «Расчетная ЕИ» содержится в поле «Единица\n", | |
" # измерения» какой-либо записи M_values] и [Значение поля «Базовая ЕИ» не содержится\n", | |
" # в поле «Единица измерения» записей M_values]];\n", | |
" M_based = [x for x in T_multiplication if x['calc_unit'] in units and x['base_unit'] not in units]\n", | |
" # 5.1.1.4. Получить M_result – массив записей T_convertation, каждая из которых\n", | |
" # удовлетворяет условию [[Значение поля «Исходная ЕИ» содержится в поле «Единица\n", | |
" # измерения» какой-либо записи M_values] и [Значение поля «Результирующая ЕИ» не\n", | |
" # содержится в поле «Единица измерения» записей M_values]];\n", | |
" M_result = [x for x in T_convertation if x['source_unit'] in units and x['target_unit'] not in units]\n", | |
" # 5.1.1.5. Если [[M_calculated пусто] и [M_based пусто] и [M_result пусто]], то перейти в 5.1.2,\n", | |
" # иначе перейти в 5.1.1.5.1:\n", | |
" if len(M_calculated) + len(M_based) + len(M_result) == 0:\n", | |
" break\n", | |
" # 5.1.1.5.1. Если [M_calculated пусто], то перейти в 5.1.1.5.2, иначе перейти в 5.1.1.5.1.1:\n", | |
" if len(M_calculated) > 0:\n", | |
" # 5.1.1.5.1.1. Для каждой записи M_values, у которой значение поля «Единица\n", | |
" # измерения» содержится в поле «Базовая ЕИ» записей M_calculated, рассчитать\n", | |
" # значения в единицах измерения, которые содержатся в поле «Расчетная ЕИ»\n", | |
" # соответствующих записей M_calculated по формуле: [Значение в расчетной ЕИ\n", | |
" # = Значение в базовой ЕИ * 10 E\n", | |
" # ];\n", | |
" for x in M_values:\n", | |
" for c in M_calculated:\n", | |
" if x['unit'] == c['base_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['calc_unit'],\n", | |
" 'value': x['value'] * 10**c['exponent']\n", | |
" })\n", | |
" # 5.1.1.5.1.2. Записать в T_values для I, R, Y все значения, рассчитанные в\n", | |
" # расчетных единицах измерения, перейти в 5.1.1.5.2;\n", | |
" # 5.1.1.5.2. Если [M_based пусто], то перейти в 5.1.1.5.3, иначе перейти в 5.1.1.5.2.1:\n", | |
" if len(M_based) > 0:\n", | |
" # 5.1.1.5.2.1. Для каждой записи M_values, у которой значение поля «Единица\n", | |
" # измерения» содержится в поле «Расчетная ЕИ» записей M_based, рассчитать\n", | |
" # значения в единицах измерения, которые содержатся в поле «Базовая ЕИ»\n", | |
" # соответствующих записей M_based по формуле: [Значение в базовой ЕИ =\n", | |
" # Значение в расчетной ЕИ * 10 –E\n", | |
" # ];\n", | |
" for x in M_values:\n", | |
" for c in M_based:\n", | |
" if x['unit'] == c['calc_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['base_unit'],\n", | |
" 'value': x['value'] * 10**(-c['exponent'])\n", | |
" })\n", | |
" # 5.1.1.5.2.2. Записать в T_values для I, R, Y все значения, рассчитанные в базовых\n", | |
" # единицах измерения, перейти в 5.1.1.5.3;\n", | |
" # 5.1.1.5.3. Если [M_result пусто], то перейти в 5.1.1.1, иначе перейти в 5.1.1.5.3.1:\n", | |
" if len(M_result) > 0:\n", | |
" # 5.1.1.5.3.1. Для каждой записи M_values, у которой значение поля «Единица\n", | |
" # измерения» содержится в поле «Исходная ЕИ» записей M_result, рассчитать\n", | |
" # значения в единицах измерения, которые содержатся в поле «Результирующая\n", | |
" # ЕИ» соответствующих записей M_result по формуле: [Значение в\n", | |
" # результирующей ЕИ = Значение в исходной ЕИ * K];\n", | |
" for x in M_values:\n", | |
" for c in M_result:\n", | |
" if x['unit'] == c['source_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['target_unit'],\n", | |
" 'value': x['value'] * c['coefficient'],\n", | |
" })\n", | |
" # 5.1.1.5.3.2. Записать в T_values для I, R, Y все значения, рассчитанные в\n", | |
" # результирующих единицах измерения, перейти в 5.1.1.1;\n", | |
" # 5.1.2. Если по всем Y из P_years расчет завершен, то перейти в 5.2, иначе перейти в 5.1.1;\n", | |
" # 5.2. Если по всем R из P_resources расчет завершен, то перейти в 6, иначе перейти в 5.1;\n", | |
" # 6. Если по всем I из P_indicators расчет завершен, то перейти в 7, иначе перейти в 5;\n", | |
" # 7. Конец расчета.\n", | |
" return res\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# Где:\n", | |
"# T_indicators – таблица показателей, содержит поле «Наименование».\n", | |
"P_indicators = ['tfc']\n", | |
"# T_resources – таблица ресурсов, содержит поле «Наименование».\n", | |
"P_resources = ['gas']\n", | |
"# T_years – таблица календарных лет, содержит поле «Наименование». Ограничимся для простоты одним годом.\n", | |
"P_years = [2017]\n", | |
"# T_values – таблица значений, содержит поля: «Показатель», «Ресурс», «Год», «Единица измерения»,\n", | |
"# «Значение».\n", | |
"T_values = [\n", | |
" { 'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mtoe', 'value': 148.67 },\n", | |
" { 'indicator': 'tfc', 'resource': 'gas', 'year': 2018, 'unit': 'Mtoe', 'value': 149.33 },\n", | |
" { 'indicator': 'tfc', 'resource': 'gas', 'year': 2019, 'unit': 'Mtoe', 'value': 150.00 },\n", | |
" { 'indicator': 'tfc', 'resource': 'gas', 'year': 2020, 'unit': 'Mtoe', 'value': 150.67 },\n", | |
" { 'indicator': 'tfc', 'resource': 'gas', 'year': 2021, 'unit': 'Mtoe', 'value': 151.33 },\n", | |
"]\n", | |
"# T_multiplication – таблица мультипликации единиц измерения, содержит поля: «Наименование»,\n", | |
"# «Базовая ЕИ», «Расчетная ЕИ», «Степень».\n", | |
"T_multiplication = [\n", | |
" { 'calc_unit': 'Gft3ng', 'exponent': -9, 'base_unit': 'ft3ng' },\n", | |
" { 'calc_unit': 'Gtce', 'exponent': -9, 'base_unit': 'tce' },\n", | |
" { 'calc_unit': 'Gtoe', 'exponent': -9, 'base_unit': 'toe' },\n", | |
" { 'calc_unit': 'MMbtu', 'exponent': -6, 'base_unit': 'btu' },\n", | |
" { 'calc_unit': 'Mj', 'exponent': -6, 'base_unit': 'j' },\n", | |
" { 'calc_unit': 'Kboe', 'exponent': -3, 'base_unit': 'boe' },\n", | |
" { 'calc_unit': 'Mtoe', 'exponent': -6, 'base_unit': 'toe' },\n", | |
" { 'calc_unit': 'Twh', 'exponent': -12, 'base_unit': 'wh' },\n", | |
" { 'calc_unit': 'Ktoe', 'exponent': -3, 'base_unit': 'toe' },\n", | |
" { 'calc_unit': 'Gj', 'exponent': -9, 'base_unit': 'j' },\n", | |
" { 'calc_unit': 'Mboe', 'exponent': -6, 'base_unit': 'boe' },\n", | |
" { 'calc_unit': 'Mtce', 'exponent': -6, 'base_unit': 'tce' },\n", | |
" { 'calc_unit': 'Gm3ng', 'exponent': -9, 'base_unit': 'm3ng' },\n", | |
" { 'calc_unit': 'Bboe', 'exponent': -9, 'base_unit': 'boe' },\n", | |
" { 'calc_unit': 'Qbtu', 'exponent': -15, 'base_unit': 'btu' },\n", | |
" { 'calc_unit': 'Mm3ng', 'exponent': -6, 'base_unit': 'm3ng' },\n", | |
" { 'calc_unit': 'Mft3ng', 'exponent': -6, 'base_unit': 'ft3ng' },\n", | |
" { 'calc_unit': 'Gwh', 'exponent': -9, 'base_unit': 'wh' },\n", | |
"]\n", | |
"# T_convertation – таблица конвертации единиц измерения, содержит поля: «Наименование»,\n", | |
"# «Исходная ЕИ», «Результирующая ЕИ», «Коэффициент».\n", | |
"# E – степень мультипликации, поле «Степень» в T_multiplication.\n", | |
"# K – коэффициент конвертации, поле «Коэффициент» в T_convertation.\n", | |
"T_convertation = [\n", | |
" { 'source_unit': 'Mtce', 'coefficient': 751.4768963, 'target_unit': 'Mm3ng' },\n", | |
" { 'source_unit': 'Gft3ng', 'coefficient': 0.301277062, 'target_unit': 'Twh' },\n", | |
" { 'source_unit': 'MMbtu', 'coefficient': 1055.060005, 'target_unit': 'Mj' },\n", | |
" { 'source_unit': 'Bboe', 'coefficient': 0.58000001, 'target_unit': 'Qbtu' },\n", | |
" { 'source_unit': 'Gtoe', 'coefficient': 1.4285714, 'target_unit': 'Gtce' },\n", | |
" { 'source_unit': 'Gj', 'coefficient': 0.000277778, 'target_unit': 'Gwh' },\n", | |
" { 'source_unit': 'Ktoe', 'coefficient': 6.8419054, 'target_unit': 'Kboe' },\n", | |
" { 'source_unit': 'Gm3ng', 'coefficient': 35.958043, 'target_unit': 'Gft3ng' },\n", | |
"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mtoe', 'value': 148.67}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2018, 'unit': 'Mtoe', 'value': 149.33}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2019, 'unit': 'Mtoe', 'value': 150.0}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2020, 'unit': 'Mtoe', 'value': 150.67}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2021, 'unit': 'Mtoe', 'value': 151.33}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'toe', 'value': 148670000.0}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gtoe', 'value': 0.14867}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Ktoe', 'value': 148670.0}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gtce', 'value': 0.212385710038}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Kboe', 'value': 1017186.075818}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'tce', 'value': 212385710.038}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'boe', 'value': 1017186075.818}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mtce', 'value': 212.38571003799998}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mboe', 'value': 1017.186075818}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Bboe', 'value': 1.017186075818}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mm3ng', 'value': 159602.954197828}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Qbtu', 'value': 0.5899679341463008}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'm3ng', 'value': 159602954197.828}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'btu', 'value': 589967934146300.8}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gm3ng', 'value': 159.602954197828}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'MMbtu', 'value': 589967934.1463007}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gft3ng', 'value': 5739.009889972531}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mj', 'value': 622451571550.2357}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'ft3ng', 'value': 5739009889972.531}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'j', 'value': 6.224515715502358e+17}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Twh', 'value': 1729.0320384398672}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Mft3ng', 'value': 5739009.889972531}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gj', 'value': 622451571.5502359}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'wh', 'value': 1729032038439867.2}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gwh', 'value': 1729032.0384398673}\n", | |
"{'indicator': 'tfc', 'resource': 'gas', 'year': 2017, 'unit': 'Gwh', 'value': 172903.35264208142}\n" | |
] | |
} | |
], | |
"source": [ | |
"res = algo_with_comments()\n", | |
"for item in res:\n", | |
" print(item)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Видно, что значение в Gwh записывается дважды: один раз правильное, второй раз с неверным порядком. Уберём комментарии из кода и добавим причину добавления строки" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"tfc of gas in 2017 is 148.670000 Mtoe (source)\n", | |
"tfc of gas in 2017 is 148670000.000000 toe (from Mtoe to toe)\n", | |
"tfc of gas in 2017 is 0.148670 Gtoe (from toe to Gtoe)\n", | |
"tfc of gas in 2017 is 148670.000000 Ktoe (from toe to Ktoe)\n", | |
"tfc of gas in 2017 is 0.212386 Gtce (from Gtoe to Gtce)\n", | |
"tfc of gas in 2017 is 1017186.075818 Kboe (from Ktoe to Kboe)\n", | |
"tfc of gas in 2017 is 212385710.038000 tce (from Gtce to tce)\n", | |
"tfc of gas in 2017 is 1017186075.818000 boe (from Kboe to boe)\n", | |
"tfc of gas in 2017 is 212.385710 Mtce (from tce to Mtce)\n", | |
"tfc of gas in 2017 is 1017.186076 Mboe (from boe to Mboe)\n", | |
"tfc of gas in 2017 is 1.017186 Bboe (from boe to Bboe)\n", | |
"tfc of gas in 2017 is 159602.954198 Mm3ng (from Mtce to Mm3ng)\n", | |
"tfc of gas in 2017 is 0.589968 Qbtu (from Bboe to Qbtu)\n", | |
"tfc of gas in 2017 is 159602954197.828003 m3ng (from Mm3ng to m3ng)\n", | |
"tfc of gas in 2017 is 589967934146300.750000 btu (from Qbtu to btu)\n", | |
"tfc of gas in 2017 is 159.602954 Gm3ng (from m3ng to Gm3ng)\n", | |
"tfc of gas in 2017 is 589967934.146301 MMbtu (from btu to MMbtu)\n", | |
"tfc of gas in 2017 is 5739.009890 Gft3ng (from Gm3ng to Gft3ng)\n", | |
"tfc of gas in 2017 is 622451571550.235718 Mj (from MMbtu to Mj)\n", | |
"tfc of gas in 2017 is 5739009889972.531250 ft3ng (from Gft3ng to ft3ng)\n", | |
"tfc of gas in 2017 is 622451571550235776.000000 j (from Mj to j)\n", | |
"tfc of gas in 2017 is 1729.032038 Twh (from Gft3ng to Twh)\n", | |
"tfc of gas in 2017 is 5739009.889973 Mft3ng (from ft3ng to Mft3ng)\n", | |
"tfc of gas in 2017 is 622451571.550236 Gj (from j to Gj)\n", | |
"tfc of gas in 2017 is 1729032038439867.250000 wh (from Twh to wh)\n", | |
"tfc of gas in 2017 is 1729032.038440 Gwh (from wh to Gwh)\n", | |
"tfc of gas in 2017 is 172903.352642 Gwh (from Gj to Gwh)\n" | |
] | |
} | |
], | |
"source": [ | |
"def algo():\n", | |
" res = []\n", | |
" for I in P_indicators:\n", | |
" for R in P_resources:\n", | |
" for Y in P_years:\n", | |
" for item in T_values:\n", | |
" if item['indicator'] == I and item['resource'] == R and item['year'] == Y:\n", | |
" item['reason'] = 'source'\n", | |
" res.append(item)\n", | |
" while True:\n", | |
" M_values = [x for x in res if x['indicator'] == I and x['resource'] == R and x['year'] == Y]\n", | |
" units = [x['unit'] for x in M_values]\n", | |
" M_calculated = [x for x in T_multiplication if x['base_unit'] in units and x['calc_unit'] not in units]\n", | |
" M_based = [x for x in T_multiplication if x['calc_unit'] in units and x['base_unit'] not in units]\n", | |
" M_result = [x for x in T_convertation if x['source_unit'] in units and x['target_unit'] not in units]\n", | |
" if len(M_calculated) + len(M_based) + len(M_result) == 0:\n", | |
" break\n", | |
" if len(M_calculated) > 0:\n", | |
" for x in M_values:\n", | |
" for c in M_calculated:\n", | |
" if x['unit'] == c['base_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['calc_unit'],\n", | |
" 'value': x['value'] * 10**c['exponent'],\n", | |
" 'reason': 'from %s to %s' % (c['base_unit'], c['calc_unit']),\n", | |
" })\n", | |
" if len(M_based) > 0:\n", | |
" for x in M_values:\n", | |
" for c in M_based:\n", | |
" if x['unit'] == c['calc_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['base_unit'],\n", | |
" 'value': x['value'] * 10**(-c['exponent']),\n", | |
" 'reason': 'from %s to %s' % (c['calc_unit'], c['base_unit']),\n", | |
" })\n", | |
" if len(M_result) > 0:\n", | |
" for x in M_values:\n", | |
" for c in M_result:\n", | |
" if x['unit'] == c['source_unit']:\n", | |
" res.append({\n", | |
" 'indicator': I,\n", | |
" 'resource': R,\n", | |
" 'year': Y,\n", | |
" 'unit': c['target_unit'],\n", | |
" 'value': x['value'] * c['coefficient'],\n", | |
" 'reason': 'from %s to %s' % (c['source_unit'], c['target_unit']),\n", | |
" })\n", | |
" return res\n", | |
"\n", | |
"res = algo()\n", | |
"for item in res:\n", | |
" print('%s of %s in %d is %f %s (%s)' %\n", | |
" (item['indicator'], item['resource'], item['year'], item['value'], item['unit'], item['reason']))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Итак, неверный результат получается из Gj. Полная цепочка следующая:\n", | |
"Mtoe -> toe -> Ktoe -> Kboe -> boe -> Bboe -> Qbtu -> btu -> MMbtu -> Mj -> j -> Gj -> Gwh\n", | |
"\n", | |
"Беглым осомотром таблицы T_multiplication становится очевидно, что погрешность в один порядок операции, связанные с ней невозможны (все степени кратны 3). Рассмотрим всю таблицу T_convertation. Приведём к базовым единицам (без степенных приставок). Получим две цепочки из toe в wh:\n", | |
"- toe 1.4285714 tce\n", | |
"- tce 751.4768963 m3ng\n", | |
"- m3ng 35.958043 ft3ng\n", | |
"- ft3ng 301.277062 wh\n", | |
"\n", | |
"Итоговый коэффициент: 11629999.585927675\n", | |
"- toe 6.8419054 boe\n", | |
"- boe 580000.01 btu\n", | |
"- btu 1055.060005 j\n", | |
"- j 0.000277778 wh\n", | |
"\n", | |
"Итоговый коэффициент: 1163000.9594543714\n", | |
"\n", | |
"Получаем ту самую разность в один порядок. Проверяем корректный коэффициент в интернете: https://www.unitjuggler.com/convert-energy-from-toe-to-Wh.html\n", | |
"\n", | |
"Вторая цепочка даёт неверный коэффициент. Погуглив ещё немного, находим, что неверный коэффициенты:\n", | |
"- toe 7.1428571428571 boe\n", | |
"- boe 5551365.2248856 btu\n", | |
"\n", | |
"В итоге правильный коэффициент между toe и btu ожидается 39652608.74918261, а получается 3968305.200419054.\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"В качестве оптимизации алгоритма, можно оптимизировать цикл while внутри рассчётных циклов. Для этого необходимо привести таблицу T_convertation к базовым единицам измерения (без степенных приставок), после этого для каждой строки T_values, необходимо будет привести значение к базовой единице с помощью таблицы T_calculation, потом в цикле while получить значение во всех оставшихся базовых единицах, после чего за один прогон получить все степенные вариации этих единиц.\n", | |
"\n", | |
"Также можно расширить таблицу T_convertation, для получения всех возможных пар единиц измерения, тогда цикл while будет ненужен.\n", | |
"\n", | |
"Помимо этого, так как степенные приставки для всех единиц совпадают, то можно оптимизировать " | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment