tag:blogger.com,1999:blog-74508934655996991502024-03-14T09:04:34.112+03:00PROGEORUЗаметки по программированию в науках о Землеwhitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.comBlogger90125tag:blogger.com,1999:blog-7450893465599699150.post-73800075101348893462021-05-17T12:36:00.002+03:002021-05-17T12:36:56.426+03:00Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?<p> Всё просто. </p><p><span style="color: #274e13;"><br /></span></p><p><span style="color: #274e13;">def uv2dir(u, v):</span></p><p><span style="color: #274e13;"> </span><span style="color: #6aa84f;"> '''</span></p><p><span style="color: #6aa84f;"> Источник:</span></p><p><span style="color: #6aa84f;"> https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calcs.py</span></p><p><span style="color: #6aa84f;"> '''</span></p><p><span style="color: #cc0000;"> import numpy as np </span></p><p><span style="color: #cc0000;"> direction = (270 - np.rad2deg(np.arctan2(v, u))) % 360</span></p><p><span style="color: #cc0000;"> veloctity = np.sqrt(np.square(u) + np.square(v))</span></p><p><span style="color: #cc0000;"> return direction, velocity</span></p><p><br /></p><p>Дъявол в мелочах))</p><p><b>Во-первых</b>, нужно передавать аргументы в arctan2 именно в порядке V, U (сначала Y, потом X). Об этом написано в строке документации функции. Дополнительно можно прочитать на странице <a href="https://www.eol.ucar.edu/content/wind-direction-quick-reference" target="_blank">Wind Direction Quick Reference</a> от NCAR/UCAR. Вот цитата оттуда:</p><p><br /><span style="color: #3d85c6;">"This discussion assumes that the two-argument arctangent function, atan2(y,x), returns the arctangent of y/x in the range -π to π radians, -180 to 180 degrees. C, C++, Python, Fortran, Java, IDL, MATLAB and R all follow this convention.</span></p><p><span style="color: #3d85c6;"><b><u>Warning</u></b>: Spreadsheets, including Microsoft Excel, LibreOffice Calc and Google Docs switch the arguments, so that atan2(x,y) is the arctangent of y/x.</span></p><p><span style="color: #3d85c6;">To check your software, compute atan2(1,-1). If it equals 2.36 radians (135 degrees) then your software uses the programming language convention and you can use these formulas unchanged. If it equals -0.79 radians (-45 degrees) then your software follows the spreadsheet convention and you must switch the arguments of atan2 in the following equations." и сначала python-овская функция arctan2."</span></p><p><b>Во-вторых</b>, повороты координатных осей с целью получить именно метеорологическое направление ветра. По традиции в метеорологии:</p><p></p><ul style="text-align: left;"><li>название ветра указывает ОТКУДА он дует. Так южный ветер дуют с юга, а восточный - с востока. Напомню, что для морских течений наоборот;</li><li>Южный и западный ветра ассоциируются с положительными направлениями компонент ветра V и U соответственно.</li></ul><div>Поэтому возникает 270 - это поворот на 90 градусов (в <a href="http://colaweb.gmu.edu/dev/clim301/lectures/wind/wind-uv" target="_blank">тригонометрическом круге, на котором считаем в радианах</a>, ноль находится на "3ч/востоке", тогда как географический азимут отсчитывается от "12ч/севера").</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="http://colaweb.gmu.edu/dev/clim301/lectures/wind/wind-uv-03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="423" data-original-width="500" src="http://colaweb.gmu.edu/dev/clim301/lectures/wind/wind-uv-03.jpg" /></a></div><br /><div><br /></div><div>Также нужно сделать разворот на 180 градусов чтобы получить направление "как в метеорологии" (см. выше).</div><div><br /></div><div><b>В-третьих</b>, самый изящный момент - % 360, т.е. остаток от деления на 360. Это лаконичное применение оператора "%" решает проблему выхода расчётов за пределы 360 градусов. В случае, когда направлеие ветра от 0 до 360, этот оператор фактически игнорируется. Но в случае выхода за предел 360 в большую сторону, берётся остаток, т.е. из значения просто вычитается 360. Очень изящное решение - никаких условий и дополнительных проверок! Bravo!</div><div> </div><p></p><p><span style="color: #3d85c6;"><br /></span></p>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-37314014617926327462021-04-12T11:51:00.007+03:002021-04-12T11:53:36.607+03:00Прочитать GRIB с помощью python. Grib format reading using python<p>Отличная новость для тех, кто активно использует и python и данные в GRIB формате.</p><p>"Happy to announce the release of @ECMWF cfgrib 0.9.9.0, the library to access climate and meteo GRIB files with xarray and Python. Highlights: much better performance on big files (10k+ messages), use the official and faster ecCodes bindings."<br /><br /><a href="https://pypi.org/project/cfgrib/0.9.9.0">Ссылка на модуль cfgrib</a></p><p>Для установки через pip: <b><span style="font-size: medium;">pip install cfgrib==0.9.9.0</span></b></p><p><b><span style="font-size: medium;"><br /></span></b></p>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com1tag:blogger.com,1999:blog-7450893465599699150.post-38650338063825489182020-01-11T23:29:00.000+03:002020-01-11T23:29:34.047+03:00PROGEORU в VK<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">Краткая аннотация моего нового проекта на базе платформы VK: </span><a href="https://vk.com/progeoru">progeoru</a><br />
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;"><br /></span>
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">===================================</span><br />
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">Ясно и коротко. Климат и программирование.</span><br />
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;"><br /></span>
<span style="background-color: white;"><span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">Изучаем климат нашей планету. </span></span><br />
<span style="background-color: white;"><span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">Компьютерные науки и технологии помогают нам в этом.</span><br style="font-family: -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", "Noto Sans Armenian", "Noto Sans Bengali", "Noto Sans Cherokee", "Noto Sans Devanagari", "Noto Sans Ethiopic", "Noto Sans Georgian", "Noto Sans Hebrew", "Noto Sans Kannada", "Noto Sans Khmer", "Noto Sans Lao", "Noto Sans Osmanya", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Thai", sans-serif; font-size: 13px;" /><span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">Актуальная научная информация об изменениях климата, новости об общественных инициативах в сфере климата.</span><br style="font-family: -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", "Noto Sans Armenian", "Noto Sans Bengali", "Noto Sans Cherokee", "Noto Sans Devanagari", "Noto Sans Ethiopic", "Noto Sans Georgian", "Noto Sans Hebrew", "Noto Sans Kannada", "Noto Sans Khmer", "Noto Sans Lao", "Noto Sans Osmanya", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Thai", sans-serif; font-size: 13px;" /><span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">О программировании на python как универсальном инструменте анализа данных.</span></span><br />
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;">===================================</span><br />
<span style="background-color: white; font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: 13px;"><br /></span>
<span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: x-small;"><span style="background-color: white;">Скорее всего проект "ICEKING" переедет туда. </span>Насчёт контента здесь пока неясно, так как в планах на 2020 ясно и чётко стоит ряд jupyter notebooks, которые будут опубликованы на GitHub. Какая-то поддержка сохранится, но что именно - неясно. Следите за новостями, б</span><span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: x-small;">олее подробно будет в следующем сообщении))</span><br />
<span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: x-small;"><br /></span>
<span style="font-family: , "blinkmacsystemfont" , "roboto" , "helvetica neue" , "noto sans armenian" , "noto sans bengali" , "noto sans cherokee" , "noto sans devanagari" , "noto sans ethiopic" , "noto sans georgian" , "noto sans hebrew" , "noto sans kannada" , "noto sans khmer" , "noto sans lao" , "noto sans osmanya" , "noto sans tamil" , "noto sans telugu" , "noto sans thai" , sans-serif; font-size: x-small;"><br /></span>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-30690351734997973362019-12-04T00:02:00.001+03:002019-12-04T00:21:22.853+03:00ICEKING #1<a href="https://1.bp.blogspot.com/-11lDefOVAfQ/XebNCPJfeAI/AAAAAAAAGjM/iIa6Y7JcMVQ8WoTH6ywndpnwgrB8yDT0QCLcBGAsYHQ/s1600/PicsArt_1439003897335.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="449" height="200" src="https://1.bp.blogspot.com/-11lDefOVAfQ/XebNCPJfeAI/AAAAAAAAGjM/iIa6Y7JcMVQ8WoTH6ywndpnwgrB8yDT0QCLcBGAsYHQ/s200/PicsArt_1439003897335.jpg" width="149" /></a>Всем привет!<br />
<br />
Так как в последнее время я активно мигрирую от "climate scientist" к "arctic climate scientist", то неплохо бы начать собирать не только классные и полезные заметки про python, который я очень нежно люблю и уважаю (а также гоняю в хвост и гриву), но и что-то про морской лёд, изменения климата в Арктике и перспективы СМП.<br />
<br />
Сегодня первая подборка интересных и полезных заметок о морском льде (sea ice).<br />
<br />
0) Узучите основы для понимания и исследования #climate data вместе с <a href="https://climate.gov/maps-data/primer/climate-data-primer">Climate Data Primer</a>.<br />
<br />
1) Начнём с <a href="https://nsidc.org/cryosphere/seaice/data/terminology.html">терминологии</a> в теме морского льда: что к чему и как. И не забудем о спутниках (микроволновой радиометрии), <a href="https://nsidc.org/cryosphere/sotc/sea_ice.html">которые позволяют нам измерять</a> концентрации льда в любое время суток.<br />
<br />
2) На Kaggle <a href="https://www.kaggle.com/grudd0/sea-ice-extent-analysis/data">есть материал</a> на основе данных sea ice NSIDC. Имя Kaggle говорит само за себя;<br />
<br />
3) Хорошая <a href="https://www.earth-syst-sci-data.net/5/311/2013/essd-5-311-2013.pdf">"базовая" статья</a> <i>A long-term and reproducible passive microwave sea
ice concentration data record for climate
studies and monitoring</i><b> </b>(Peng et al., 2013) по созданию базы данных морского льда от NSIDC.<br />
<br />
4) <a href="https://nsidc.org/arcticseaicenews/">Новости за октябрь</a> о состоянии морского льда в Арктике от NSIDC<br />
<br />
5) <a href="https://www.nasa.gov/content/goddard/how-to-calculate-sea-ice-changes">How to calculate sea ice changes</a> (NASA Video)<br />
<br />
6) The Danish Arctic research institutions present <a href="http://polarportal.dk/en/home/">updated knowledge on the condition</a> of two major components of the Arctic: The Greenland Ice Sheet and the sea ice<br />
<br />
<b>P.S.</b> Подобные посты будут сопровождаться хэштегом <span style="color: blue;">iceking </span>и <span style="color: blue;">iceking_news.</span>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-88807541783236317362019-08-26T17:48:00.001+03:002019-08-26T17:49:24.338+03:00Как организовать свой код работая над проектом?<div>
Попалась <a href="https://towardsdatascience.com/how-to-keep-your-research-projects-organized-part-1-folder-structure-10bd56034d3a">интересная статья </a>о том, как нужно организовывать работу над проектом с данными и кодом. </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-uoYbaTW1DB8/XWPxCxJwZoI/AAAAAAAAGco/8rMpqSP6524DgTHzl0tQQFbevNv7Cbv7gCEwYBhgL/s1600/1%2B39Ds7-m94L2ZK3ekfky1mQ.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="895" data-original-width="1600" height="222" src="https://1.bp.blogspot.com/-uoYbaTW1DB8/XWPxCxJwZoI/AAAAAAAAGco/8rMpqSP6524DgTHzl0tQQFbevNv7Cbv7gCEwYBhgL/s400/1%2B39Ds7-m94L2ZK3ekfky1mQ.png" width="400" /></a></div>
<div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Рисунок из статьи выше.<br />
<br /></div>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-2783336860648968222019-04-10T23:05:00.001+03:002019-04-11T13:13:55.277+03:00Набор полезных ссылок<br />
<div>
11 апреля 2019</div>
<div>
<br />
<ol>
<li><a href="https://python-graph-gallery.com/">Python Graph Gallery</a> - примеры графики на python;</li>
</ol>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
10 апреля 2019</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-10krg6Ja5Hk/XK5MC3bJ9PI/AAAAAAAAGSo/YsdPzLkMxLog_b-pSQYo2pilGBTCYzF8ACLcBGAs/s1600/image.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="321" data-original-width="594" height="172" src="https://1.bp.blogspot.com/-10krg6Ja5Hk/XK5MC3bJ9PI/AAAAAAAAGSo/YsdPzLkMxLog_b-pSQYo2pilGBTCYzF8ACLcBGAs/s320/image.jpeg" width="320" /></a></div>
<div>
<br /></div>
<ol>
<li>Прорабатываем <a href="https://m.habr.com/ru/company/mailru/blog/445834/?fbclid=IwAR0Oo2uYjUBQHvt0AysKhOMAs9TzKKZjv2xcZ9sohYlQxnU0rSGwHtfskdM">навык использования группировки и визуализации</a> данных в Python;</li>
<li><a href="http://xarray.pydata.org/en/stable/index.html#">Проект Xarray</a> как подобие pandas от создателей NCL для климатологов;</li>
<li><a href="https://dask.org/">Dask provides</a> advanced parallelism for analytics, enabling performance at scale for the tools you love;</li>
<li><a href="https://habr.com/ru/company/lamoda/blog/432656/">Введение в аннотации</a> типов Python -> PEPs 484, 526, 3107;</li>
<li>PyPy, Cython, numba</li>
<li>тестирование с помощью pytest, mypy, pylinter и др.</li>
</ol>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-30616576802226093322019-03-29T23:40:00.001+03:002019-03-29T23:40:06.049+03:00NCL: pivot to PythonЭто свершилось.<br />
<br />
NCAR <a href="http://www.ncl.ucar.edu/Document/Pivot_to_Python/">решил отказаться от своего собственного скриптового языка</a> NCAR Command Language в пользу языка Python как основного скриптового инструмента визуализации и анализа данных. Новость несвежая, аж от 6 февраля 2019 года.<br />
<br />
Универсальность победила специализацию.whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-62008596696273544862019-03-05T15:34:00.001+03:002019-03-05T15:34:36.523+03:00ERA5Запрос <a href="https://cds.climate.copernicus.eu/#!/search?text=ERA5&type=dataset">данных ERA5</a> о концентрации льда за 00ч за период 1979-2018 гг.<br />
<br />
<pre class="toolBoxRequestPreviewClass ng-binding" style="background-color: whitesmoke; border-radius: 4px; border: 1px solid rgb(204, 204, 204); box-sizing: border-box; color: #333333; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; line-height: 1.42857; margin-bottom: 10px; overflow-wrap: break-word; overflow: auto; padding: 9.5px; word-break: break-all;">import cdsapi
c = cdsapi.Client()
c.retrieve(
'reanalysis-era5-single-levels',
{
'product_type':'reanalysis',
'format':'netcdf',
'variable':'sea_ice_cover',
'year':[
'1979','1980','1981',
'1982','1983','1984',
'1985','1986','1987',
'1988','1989','1990',
'1991','1992','1993',
'1994','1995','1996',
'1997','1998','1999',
'2000','2001','2002',
'2003','2004','2005',
'2006','2007','2008',
'2009','2010','2011',
'2012','2013','2014',
'2015','2016','2017',
'2018'
],
'month':[
'01','02','03',
'04','05','06',
'07','08','09',
'10','11','12'
],
'day':[
'01','02','03',
'04','05','06',
'07','08','09',
'10','11','12',
'13','14','15',
'16','17','18',
'19','20','21',
'22','23','24',
'25','26','27',
'28','29','30',
'31'
],
'time':'00:00'
},
'download.nc')</pre>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-18705987386307218142018-12-04T12:46:00.000+03:002018-12-04T12:46:27.247+03:00Формат файлов JSONОдним из широко распространённых форматов файлов для обмена данными в сети является текстовый формат <b>json</b>.<br /><br />
<a href="https://ru.wikipedia.org/wiki/JSON">JSON</a> позволяет изящно и понятно хранить сложные структуры данных (в т.ч. и последовательности, которые иногда называют массивами) в читабельном виде.<br /><br />По сути <i>json</i> - это словарь (ассоциативный массив), элементами которых могут быть как словари (отличительный признак - {}, фигурные скобки), так и списки (отличительный признак - [], квадратные).<br />
<br />
Пусть дан файл с расширением <b>*.json</b> (это обычный текстовый файл), содержащий следующее:<br /><br />
{<br />
"orderID": 12345,<br />
"shopperName": "Иван",<br />
"shopperEmail": "ivanov@example.com",<br />
"contents": [<br />
{<br />
"productID": 34,<br />
"productName": "Super product",<br />
"quantity": 1<br />
},<br />
{<br />
"productID": 56,<br />
"productName": "Super product",<br />
"quantity": 3<br />
}<br />
],<br />
"orderCompleted": true<br />
}<br />
<br />
С помощью модуля ... <i>json</i> (неожиданно, неправда ли!?) в python его можно легко считать в словарь (dictionary).<br /><br />Если в файле содержатся кириллические символы (русские буквы в просторечье), то не забудем вставить <b><i>encoding="utf-8" </i></b>в качестве аргумента для open.<br />
<br />
Итого код для чтения json-файла выглядит так<br />
<br />
<span style="color: #0b5394;">import json</span><br />
<span style="color: #0b5394;"><br /></span>
<span style="color: #0b5394;">f = open('./templates/new.json', encoding="utf-8")</span><br />
<span style="color: #0b5394;">dic = json.load(f) # dic - словарь</span><br />
<span style="color: #0b5394;">f.close()</span><br />
<span style="color: #0b5394;"><br /></span>
Т.к. dic - это просто словарь, то в него можно добавлять элементы. Добавим список с ключом "alpha". Модифицированный словарь запишем в виде json-файла. <br />Т.к. в словаре есть кириллица, то не забудем добавить аргумент <b>ensure_ascii=False</b>.<br /><br /><span style="color: #0b5394;">#Чтение, модификация и запись</span><br />
<span style="color: #0b5394;">import json</span><br />
<span style="color: #0b5394;"><br /></span>
<span style="color: #0b5394;">f = open('./templates/new.json', encoding="utf-8")</span><br />
<span style="color: #0b5394;">dic = json.load(f)</span><br />
<span style="color: #0b5394;">print(dic.keys())</span><br />
<span style="color: #0b5394;">f.close()</span><br />
<span style="color: #0b5394;"><br /></span>
<span style="color: #0b5394;">dic['alpha'] = [1, 2, 4, 5]</span><br />
<span style="color: #0b5394;"><br /></span>
<span style="color: #0b5394;">with open('data.json', 'w') as outfile:</span><br />
<span style="color: #0b5394;"> json.dump(dic, outfile, ensure_ascii=False)</span>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-86814515885126786312018-11-11T17:20:00.004+03:002018-11-11T17:20:41.302+03:00SVD song<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/JEYLfIVvR9I/0.jpg" src="https://www.youtube.com/embed/JEYLfIVvR9I?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-44216554030476907102018-11-10T11:58:00.001+03:002018-11-10T11:58:54.863+03:00AgileНесколько ссылок на agile:<br />
<ol>
<li><a href="https://habr.com/company/edison/blog/313410/">Как объяснить бабушке, что такое Agile за 15 минут с картинками;</a></li>
<li><a href="https://rb.ru/story/agile-scrum-kanban/">Agile, scrum, kanban</a>;</li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8">Wiki - Agile software development</a>.</li>
</ol>
<div>
Зачем это здесь? </div>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-91915531447764625572018-11-06T00:57:00.001+03:002018-11-06T00:59:09.375+03:00Python Junior podcast 4 ноября<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/oP3s3iwdMZk/0.jpg" src="https://www.youtube.com/embed/oP3s3iwdMZk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
Очередной выпуск подкаста Python Junior. Тема выпуска - собеседования для разработчиков.whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-2451693077241375402018-11-03T13:40:00.000+03:002018-11-03T13:40:11.673+03:00Яндекс PyData 2018<div class="separator" style="clear: both; text-align: center;">
<a href="https://scontent-arn2-1.xx.fbcdn.net/v/t1.0-9/45146047_2171470012873108_7188042423178625024_n.jpg?_nc_cat=110&_nc_ht=scontent-arn2-1.xx&oh=d61a973dc40cdfb8cc5809f27d1f6bfb&oe=5C837E96" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="800" height="320" src="https://scontent-arn2-1.xx.fbcdn.net/v/t1.0-9/45146047_2171470012873108_7188042423178625024_n.jpg?_nc_cat=110&_nc_ht=scontent-arn2-1.xx&oh=d61a973dc40cdfb8cc5809f27d1f6bfb&oe=5C837E96" width="320" /></a></div>
<div style="background-color: white; color: #666666; font-family: Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 1em;">
<br /><span id="goog_946859802"></span></div>
<div style="background-color: white; color: #666666; font-family: Helvetica, Arial, sans-serif; font-size: 12px; margin-top: 1em;">
13 октября в офисе Яндекса прошел митап PyData Moscow, посвящённый анализу больших данных с использованием языка Python. Публикуем записи докладов и мастер-клас<span class="text_exposed_show" style="display: inline; font-family: inherit;">сов.</span></div>
<div class="text_exposed_show" style="background-color: white; color: #666666; display: inline; font-family: Helvetica, Arial, sans-serif; font-size: 12px;">
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
МАСТЕР-КЛАССЫ:</div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
1. Решение задач классификации при помощи CatBoost – Никита Дмитриев<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" data-lynx-uri="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dxl1fwCza9C8%26feature%3Dyoutu.be%26fbclid%3DIwAR3by30t5XAs2W3_oTXUGm7fA2C50AUN27A4PyFPzzd3G4Vb31huuo6ejUY&h=AT3SWLVxcxAHsU05l7BGUKn1-MUivUBzsdyXEtDoCpD_VnrV5T7qlHdjdjYaekFhNkFBAh5bxN7F789GTzcJvB5_ETuie9lYjYVN-Cidk_fixnVvIXAK3hZOWIrcwcZiOXyE10nzH0ZmUnsRrcYY4ojpq3HeJx5Fk1zEyI_91JOFg5P3gWEKjvEH0JyCmL-gbbloCvpWu9G4gbpZ0azQ69lcujV70ymTF2vQwHJf0OeKpZzKBnSmF-s7XXfopo4KPNvf0Ar8hqlTwpE8IVAWJ9PBVpPqbn1Ql-wfcfZO8yhOlMR8QzqdNFwAqWmO72sNvWpKytbmbX4dLvS9hxFiYRhSwHxd55BMfDncPwHPg1Xtor5ChvNSgYMgKWVRc2hXG3rXIajvhIIo-Gk57ivQnG1XCWCHJxAYdRDJs0_dlrkmBkLtJMYGCP7H_JRd_93XOB2s4PLNqYPp6E141b8" href="https://www.youtube.com/watch?v=xl1fwCza9C8&feature=youtu.be&fbclid=IwAR3by30t5XAs2W3_oTXUGm7fA2C50AUN27A4PyFPzzd3G4Vb31huuo6ejUY" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=xl1fwCza9C8&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
2. Yargy-парсер. Извлечение структурированной информации из текстов на русском языке – Александр Кукушкин<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" data-lynx-uri="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DNQxzx0qYgK8%26feature%3Dyoutu.be%26fbclid%3DIwAR1bXHizuKxF85t2VWPzuUkI96oqphj_63RESc3Ge3fQSQ-G5ZJtURl-hYw&h=AT3mWt040tL8ihG3eK1-ExVd0jBk5AsVl5x_hg9wr_4T_oDXiwIuncpt9A-Q9IiaVyIYnD-0bnMibD78KIzAnRDGXN5DIcCg2AJxXBGlianEmXs3MMsuq1Cq8VfquivOU9SgPJ2EtEcpbROWrY0sl-sVOjYDsi6P7cZsUxfwqntdwOx0kuRQhi6vidnVf3fFOmsuS6orTueHDlvIplNlzqwrsJ_5tw-RJq9rTNsKNpPP8qsGFd7iPUn5LxwTpibTlrQX5YuDGq2baQd3_HT-xCyANKONSNS9ImL_cZC5pojdrBlene2KKyKPJQusAO9g-Qe9Yu9A2MDL0hiZf8y-PSHAiqewa2G2slSGh_KrwJ8TaGntiFpnWTCcy_sEU_JYeJoI25-jq4zyjgkZIcpKEGsgKL5yi2i_jLbPkawAvJw2iqUuh7N1gdOQbMo6qIOCPq0kcBT_xb7AVX-UTA__ATrotA" href="https://www.youtube.com/watch?v=NQxzx0qYgK8&feature=youtu.be&fbclid=IwAR1bXHizuKxF85t2VWPzuUkI96oqphj_63RESc3Ge3fQSQ-G5ZJtURl-hYw" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=NQxzx0qYgK8&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
ДОКЛАДЫ:</div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
1. Процесс полуавтоматической разметки данных – Кирилл Данилюк<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DnK2Ra0Xq0So%26feature%3Dyoutu.be%26fbclid%3DIwAR1N8fC4XI0pAkGUIxaZ-TpIyuSXDU-6oBSwOCjv3pAY4cYnKP4GCWyx0NI&h=AT2vt-LMLeFmuLkeuBiexjHqLegrztO5KLcaddhBwOB6f0GIg_gAd10_nuSd8kM1zqL23Nm-fcQl5ZQebQZ2mrz109vJ3NlPAOZHiBzVTEjGFET43CfXFssRrlUXpLOwkkCtXO9ZVi0Tu2L7WGEO91kWjxRmtYUD4gNUc-n_i0KyE-Wo2IZAQ7KUuqEnxTPdEw2UAk9_ioqDyRAdZlvlX8anwSbGludYAbxokkFy1mKgy3raO1ZGWSwOdEgsSaT3Zmkuy6T4Ko8Q96EmfB4ZoOqxr62HkL0x95b3L4b7VXTUxsP0b0SsNrIFovue5xzOJn5ZMuaySjAGgw2Lcwtvvd-jqfzI2CM9H6QhfQnXgIdNW89ctL6bMj6tUkiX6unYmynuJSIkgf461R32_nEKi30_Kj50Io521PB28VI_KwM9SCFMyAO1s6VJfktLWp7cdA-4klYc-yVaXX69X5c" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=nK2Ra0Xq0So&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
2. Canary deployment, мониторинг и тестирование моделей силами одного специалиста – Александр Дмитриев<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dh-vbysp1Tso%26feature%3Dyoutu.be%26fbclid%3DIwAR3Ish_F4nZZreUgudoN8uDEDaDWKU1K1MIRHznp7mlx3V9OOfYDoDAvN-Y&h=AT3srbVjwRwXL1f6Hj1siCrVpRN87F1NJNIG7oezrOf8K1fSFOg4Q5Bp_XQEIG69psU8TM1zFaYr55nLDJh6SBMHlTWqC2ZKx9s5dLFNyAsXmvGIDWdcnLdqXoo_yChcBl1HqtZHKqd7ZSxZk2iwGDQMujem3F5xZX_7KiJbqdALGyhRT1DprSqNj3MwWynOhxPnDkFI8PAK1o9_ttfR2q2RLqTFag2WlmIFOF3-Bi60AbtAarQI36R5s3_OBDSq6xXH-GdgCLui7OjKPbTsY1bD-Ipm28RITc3VUzPRNkw_IvcgVDuQztACMnvIdVaoLjvuQgN2d_n0Uaf-7uRQP-p4SCHrG8S5mJOXvISPDNaizQapEUf8ikk9FavWYSMC9cuBGoohdMk3vAnFVmDC5slT-Z7Pj6KUSUU7wXxKX09f9uqE_jMgIgB2Nu7uj-jj0es9IkokbBzS4f3v8Yk" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=h-vbysp1Tso&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
3. Как мы строили автоматическую систему модерации объявлений ЦИАН – Алексей Бардышев<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" data-lynx-uri="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVAGV7aqani4%26feature%3Dyoutu.be%26fbclid%3DIwAR3EK7Bt-CbmWdIYjaw2gIb5UQHiVCqd-HnXMWEqMQfEDfrhhNwTKsXx2Jw&h=AT2bBeSIo92xZcI5w-DuR3TbXZjomxQwFcNHVspaOoSNLkT0DImxJVTwL6KmYsKjfRhV4Nb45M8-dXyv88sm4X3u7p2dAMp6P1jMejkku7c7GLktHX5x7nOV6NnBME4TUH_JUCUHT81dLLVYOFTNX3SusMV8Q8e_xJmwpQbDPVnleFIOLUVmxZXOsrZ5JX2QXNnRWMen9KU0LqKKdU1w6X9cIW411PF7v26CzUYtpzuJhx-wogPLs1Ku19Dgni9AsJQeF5VewGlb9jgHRXOzSEoyETh0FPH3xNq9W9s4pZfAQ4IeGvGTDAm1T7W7vHFbFMfPLzaV0o-irLljrHD0ESRtuJ-ncXRzOovcW5uC0dpaSrOtuioMFMC73fsS3vK6IgR6PvUN9GBSlzTTpDY8-yVizPxZqN4H1oe2K20tlwm5MLVh0Ex2hbjkvC_Ip2y_2vMs6ZJLWsgHsqCWz3cenABFvA" href="https://www.youtube.com/watch?v=VAGV7aqani4&feature=youtu.be&fbclid=IwAR3EK7Bt-CbmWdIYjaw2gIb5UQHiVCqd-HnXMWEqMQfEDfrhhNwTKsXx2Jw" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=VAGV7aqani4&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-bottom: 1em; margin-top: 1em;">
4. Нейросети в продакшене на примере NLP сервиса – Виталий Давыдов<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" data-lynx-uri="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DeeAH6oK_aPw%26feature%3Dyoutu.be%26fbclid%3DIwAR04LwPnS2z1NcMJ1QUVnC-f9vzR97gT_rgKwsjCG_ArnsJmFa1Wf_JFnqI&h=AT0dYcWsdIlt85qMgG3bysiR9vLLpdUBqcMCjnuCYxkoJAibEXb0tSBIMplk7TflsxGXdG9fMiBWO9hAgaLCpXYx7AST0VQ-N8CEQJaJ1xoxJdsKPcJe30uJHna3d4hwfGdTUoKDX-1w0KixXeMYbIwu43miqYTQMa1q9TCoPnG1FutF9ZHHHS-VkM3GXXcdQJbcTLlMXcXVyMeXFte3HpEh_v7qc7t0pIlhYJb8f6zAJk5v32i4rQhgSPLtaA_eBydfznlSEFGsrIuXTk4J7qcjBKCHDW76bCszbQRrlI1j-CD1LyvvK0sHwFJFhzh66Y7vO1Z6tPm8loJzgEmv-qkYWZP-HCYwYUPoUjT_QlAHuye9SXK4RSHc6sjkAbvfzrfb85T-4qmvrRvYzTXLG_7mD1UEljpO9w73eGlAced8pifkPEH3eYU3uJ1XIQgfBsiGjliar_psOGZg3Q4" href="https://www.youtube.com/watch?v=eeAH6oK_aPw&feature=youtu.be&fbclid=IwAR04LwPnS2z1NcMJ1QUVnC-f9vzR97gT_rgKwsjCG_ArnsJmFa1Wf_JFnqI" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=eeAH6oK_aPw&feature=youtu.be</a></div>
<div style="font-family: inherit; margin-top: 1em;">
5. Как построить собственную систему аналитики за один день – Александр Швец<br /><a data-ft="{"tn":"-U"}" data-lynx-mode="async" href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DN7R3hmvguyE%26feature%3Dyoutu.be%26fbclid%3DIwAR3JC2QQzbU9BVHO59e5LyrNoMiTfC4Czz9-ymB6-fUiFtIvEaejCOhBMb0&h=AT3iUc0RECW5FoVxy8uQCsEK8wq_z9pK_X3z3wph8EDR4hcgZfYMQERLBzkYcwLEk0yFUG_Xc5Me2mNHWYf3S1mZYtU5gCGYnq_GckpNOMFQ9MJo9TGFREkRUMtIme9RHV3pv787JM0ET-BE_puzVNtgNLt-YoU8HIiMapsSMMISSfYO8C58xwlCEd7kpwQBWRemWHQgVZssr42Q_Gg9ByHTydPgYRyMoiOk1KG3Sgz8vHEJuaHq6kEHo5BUjJpqjrOVPIF7CH8f3IA6YaAXLCokZrNXPfTptgQuXn_hW6I1iLIA_pXYR9KXhXAhWMEs_ApiSpUkrnTLkK8OfFDhwH0VB7Cl4GLjtNekSxe6Mp7Ec3o7wsMN9zxsz4_ETmkdgmf9035cYadNjvv7gClq6ShkD1Tb_poHow9_VGG1LTn90yreLG5yit4rS1uyfCOuPf5JOZ937ufr5hO5li4" rel="noopener nofollow" style="color: #365899; cursor: pointer; font-family: inherit; text-decoration-line: none;" target="_blank">https://www.youtube.com/watch?v=N7R3hmvguyE&feature=youtu.be</a></div>
</div>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-21806770710689889772018-10-29T09:46:00.000+03:002018-10-29T09:46:01.178+03:00Python Junior 26 октября<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/dBb-f2erWB8/0.jpg" src="https://www.youtube.com/embed/dBb-f2erWB8?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
<div style="text-align: center;">
Вышел очередной выпуск подкаста PythonJunior. И ещё раз про DevOps</div>
<br /><br />whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-29741878221200075572018-10-28T20:59:00.000+03:002018-10-28T20:59:25.562+03:00f-строки (python 3.6+)Всё течёт и всё меняется.<br />
<br />
Раньше строки можно было форматировать так:<br />
<br />
<span style="background-color: #cccccc;">name = 'John'</span><br />
<span style="background-color: #cccccc;">s = '%s is my name.' % name </span><br />
<br />
Потом так:<br />
<br />
<span style="background-color: #cccccc;">name = 'John'</span><br />
<span style="background-color: #cccccc;">s = '{} is my name.'.format(name) </span><br />
<div>
<br /></div>
А начиная с версии 3.6 оказывается так:<br />
<br />
<span style="background-color: #cccccc;">name = 'John'</span><br />
<span style="background-color: #cccccc;">s = f'{name} is my name'</span><br />
<br />
Собственно последний вариант и называется f-строками. И мне очень нравится этот синтаксис! Переменные можно теперь подставлять прямо в фигурные скобки, а вместо длинного слова format, просто ставить префикс f перед строкой. Браво!<br /><br />Подробнее можно<a href="https://python-scripts.com/f-strings"> посмотреть тут</a>.whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-25539904052710584952018-10-25T00:15:00.001+03:002018-10-25T00:15:51.231+03:00High Performance Scientific Computing by Randall J. LeVeque<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/1m32LiqOlj0/0.jpg" src="https://www.youtube.com/embed/1m32LiqOlj0?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
<br />
Лет пять назад на Coursera был отличный курс "High Performance Scientific Computing by Randall J. LeVeque", который включал материал о целой куче разных технологий (Linux, VM, git, shell, MPI, OpenMP, python, fortran, ipython notebooks, Bitbucket, etc.), которые сегодня стали ещё актуальнее!<br /><br />Некоторые материалы этого курса до сих пор лежат на <a href="http://faculty.washington.edu/rjl/uwhpsc-coursera/">сайте университета Вашингтона</a>.<br />
<br />
Очень рекомендую. Этоwhitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-77741928149338672018-10-19T09:47:00.000+03:002018-10-19T09:53:23.170+03:00Python Junior Podcast. Спецвыпуск с Григорием Петровым<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-D_SPNWR9cTg/W8l9nySx6JI/AAAAAAAAGKs/dL_f_T_bbbUP4fSeP-ukFxXIbR6paa1XgCLcBGAs/s1600/logo_PJP.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1591" data-original-width="1600" height="318" src="https://4.bp.blogspot.com/-D_SPNWR9cTg/W8l9nySx6JI/AAAAAAAAGKs/dL_f_T_bbbUP4fSeP-ukFxXIbR6paa1XgCLcBGAs/s320/logo_PJP.png" width="320" /></a></div>
<br />
Отличный выпуск <a href="http://python%20junior%20podcast%20%D1%81%20%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D0%B8%D0%B5%D0%BC%20%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2%D1%8B%D0%BC/">Python Junior Podcast с Григорием Петровым</a>, в котором разбирается статья 2013 года "<a href="https://danieltakeshi.github.io/2013/07/05/ten-things-python-programmers-should-know/">10 вещей, которые должен знать</a> начинающий Python-разработчик" (English). Актуальность, по мнению авторов подкаста, ничуть не изменилась.<br />
В выпуске упоминается также <a href="https://habr.com/sandbox/47663/">хардкорная статья о Юникоде</a>, которая поможет разобраться что делать, если перед вами файл не в кодировке utf-8.<br />
<br />
Рекомендую также другие выпуски <a href="https://podcast.python.ru/#rec63482723">Python Junior Podcast</a>. Картинка выше - лого из подкаста на осень 2018 года.<br />
<br />
P.S. При разборе пункта 7 статьи ("Copying Structures (and Basic Memory Management)") , авторы упоминают о необходимости делать глубокие копии (deep copies) изменяемых объектов и приводят примеры из slicing-а pandas.DataFrame. Пару дней назад такой <a href="https://github.com/whitehorn/rus_pandas/blob/master/dataFrames_dangerous_operations_1.ipynb">подобный пример</a> я выкладывал на репозитарий <a href="https://github.com/whitehorn/rus_pandas/">GitHub в папке rus_pandas</a>.<br />
<br />
<br />whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-8455890940873480392018-10-01T22:56:00.000+03:002018-10-01T22:56:00.524+03:00Таблицы DataFrame с составными индексами.Pandas MultiIndexНовый <a href="https://github.com/whitehorn/rus_pandas/blob/master/pashNotebooks.%20MultiIndex.ipynb">jupyter notebook</a> ноутбук про мультиИндексы в pandas.DataFrames. На GitHub<br /><br />+ [<a href="http://datacamp-community.s3.amazonaws.com/9f0f2ae1-8bd8-4302-a67b-e17f3059d9e8">Python pandas cheat sheet</a>] от DataCamp.whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-73693339068178604842018-09-29T01:48:00.002+03:002018-10-25T10:20:34.215+03:00Набор интересных ссылок около pythonНабор ссылок<br />
<div>
<br /></div>
<div>
<ol>
<li><a href="https://medium.com/nuances-of-programming/%D0%BF%D0%BE%D1%87%D0%B5%D0%BC%D1%83-%D0%B2%D1%8B-%D0%B4%D0%BE%D0%BB%D0%B6%D0%BD%D1%8B-%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-npy-%D1%84%D0%B0%D0%B9%D0%BB-%D1%87%D0%B0%D1%89%D0%B5-80989dd85095">"Почему вы должны начать использовать .npy файл чаще…"</a>;</li>
<li><a href="https://www.blog.pythonlibrary.org/2018/05/29/creating-interactive-pdf-forms-in-reportlab-with-python/">"Creating Interactive PDF Forms in ReportLab with Python"</a>;</li>
<li>Lin, J. W.-B. (2012). <a href="https://journals.ametsoc.org/doi/10.1175/BAMS-D-12-00148.1">Why Python Is the Next Wave in Earth Sciences Computing. Bulletin of the American Meteorological Society</a>, 93(12), 1823–1824. doi:10.1175/BAMS-D-12-00148.1;</li>
<li><a href="http://www.solipsys.co.uk/new/EveryLanguageFixesSomething.html?fbclid=IwAR1SoOWOtqdzK8lDshG0UYjfwnH_Qpi0MKGWAAu8H2TEPpR_uP_SCYx948o">Схемы развития языков </a>программирования; </li>
</ol>
</div>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-38225034536371027522018-09-16T15:54:00.002+03:002018-09-16T15:54:30.073+03:00XV ICRSS, Potsdam, sep 2018<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-sfg3dhy7rK0/W55PA6DfWdI/AAAAAAAAGI0/OJmSEzfkuuIBVQPlVLNSNxlGgEtz882yQCLcBGAs/s1600/CircumpolarRemoteSensinglogo350x351.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="351" data-original-width="350" height="200" src="https://1.bp.blogspot.com/-sfg3dhy7rK0/W55PA6DfWdI/AAAAAAAAGI0/OJmSEzfkuuIBVQPlVLNSNxlGgEtz882yQCLcBGAs/s200/CircumpolarRemoteSensinglogo350x351.jpg" width="199" /></a></div>
С 9 по 15 сентября 2018 года в г. Потсдам проходила XV International Circumpolar Remote Sensing Symposium (ICRSS). Отлично организованная сотрудниками AWI конференция, оставила очень приятные воспоминания о community.<br />Хотелось бы особенно поблагодарить Guido Grosse, Benjamin Jones, Martha Raynolds, Frank Gunter, Sofia Antonova, Annet Bartsch, Ana Radovan, Bennet Juhls. Danke schön!<br /><br />Наш <a href="https://drive.google.com/open?id=12LiVEJVnJ-ASPz880x0-LSG1l2a6epXa">постер</a> и <a href="https://drive.google.com/open?id=1Bk8TVuSV0P67Wv2-FqpB8vgRrhs8rZZV">flash-видео</a> из серии "FrostBytes" не были отмечены жюри конференции (немного жаль, чего уж там!), но это был очень творческий период подготовки к конференции (с ночными бдениями и прочим)! Это было здорово, это однозначно up-date.<br /><br />Ещё раз спасибо всем и до встречи в Fairbanks в 2000 году!whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-14960329710521699362018-08-03T18:17:00.000+03:002018-08-03T18:17:05.891+03:00Быстрая замена в 3D массиве по признакуДан трёхмерный массив <b>z</b> (time, lat, lon), в котором необходимо по условию <b>cond </b>заменить значения на <b>undef</b>.<br />Собственно решение с помощь numpy.where<br /><br />
import numpy as np<br /><br />
undef = -99 <br />
ishape = (3, 4, 5)<br />
z = (np.arange(-30 ,30, 1)).reshape(ishape) # 3D-array<br />
print('Before', z)<br />tz0 = z.mean(axis=0) # 2D-array<br />
cond = (tz0 < -5.)<br />zz = np.where(~cond, z, undef) # Тильда<br />
print('After', zz) <br />
<br /><b>P.S.</b> Тильда (~) инверсирует логическую маску: превращает все True в False. И наоборотwhitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-54529194617600925362018-07-05T12:15:00.001+03:002018-07-05T12:15:31.475+03:00Python 3.6+ & PIL libraryОказывается Python 3 не поддерживает корректно библиотек PIL, которая лежит в основе ВСЕХ пакетов для работы с изображениями!!! <br />
<br />
Проблемы из серии "Не могу импортировать что-то из библиотеки PIL" на Python 3.+ решается установкой форка pillow библиотеки PIL версией 5 и выше.<br />
В Anaconda это делается так.<br />
<br />
<span style="font-size: large;"><b>conda install --channel conda-forge pillow=5</b></span><br />
<br />
P.S. Возможно придётся обновить какие-то пакеты из conda или саму condawhitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-46921392795365631402018-04-27T15:01:00.001+03:002018-07-06T12:30:03.967+03:00Загрузка данных реанализов центра ECMWF. ECMWF batch mode<br />
<u><b>Задача:</b></u> скачать данные реанализов европейского центра среднесрочных прогнозов (ECMWF)<br />
<br />
Реанализы, подготовленные в европейском центре среднесрочных прогнозов, являются одними из самых широко используемых атмосферных реанализов. Такие реанализы как ERA40, ERA15, ERA Interim, ERAClim предоставляют доступ к большому числу параметров о состоянии атмосферы.<br />
<br />
Центр ECMWF поддерживает скриптовую (в т.ч. и python) поддержку для загрузки данных реанализов. Ниже приведена инструкция для языка python.<br />
<br />
<br />
<br />
<a name='more'></a><br />
<div style="text-align: center;">
<b><i>Инструкция</i></b></div>
<br />
<a href="https://software.ecmwf.int/wiki/display/WEBAPI/Accessing+ECMWF+data+servers+in+batch">Ссылка на оригинальную</a> инструкцию ECMWF. <br />
<br />
Просто так скачать реанализы ECMWF нельзя - нужна регистрация. Это может занять некоторое время (несколько суток). Заполняем форму и ждём, пока на указанный адрес электронной почты вам не пришлют логин и пароль.<br />
<br />
Чтобы обеспечить доступ к серверам ECMWF необходимо установить ECMWF API. Он реализован в виде python-модуля + контрольного файла (.ecmwfapirc), в котором содержатся данные вашего аккаунта. Соответственно, нужно выполнить следующие шаги:<br />
<br />
1) Скачать python-модуль с помощью pip (проще всего через консоль)<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"></code></span><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain">:<span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"> </span></span></code></span><br />
<br />
<div style="text-align: center;">
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;">pip install</span></span> <span style="font-family: "times" , "times new roman" , serif;"><a href="https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz">https://software.ecmwf.int/wiki/download/attachments/56664858/ecmwf-api-client-python.tgz</a></span></code></span><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"><span style="font-family: "times" , "times new roman" , serif;"> </span></code></span></div>
<br />
<div style="text-align: left;">
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"><span style="font-family: "times" , "times new roman" , serif;">2) Поместить в папку </span></code></span><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"><span style="font-family: "times" , "times new roman" , serif;">%USERPROFILE% (обычно, <b>c:/users/ivan/</b>) файл с именем ".ecmwfapirc", который должен иметь следующее содержимое:</span></code></span></div>
<div style="text-align: left;">
<br /></div>
<div class="container" title="Hint: double-click to select code">
<div class="line number1 index0 alt2">
<code class="bash plain">{</code></div>
<div class="line number2 index1 alt1">
<code class="bash spaces"> </code><code class="bash string">"url"</code> <code class="bash plain">: </code><code class="bash string">"<a href="https://api.ecmwf.int/v1">https://api.ecmwf.int/v1"</a></code><code class="bash plain">,</code></div>
<div class="line number3 index2 alt2">
<code class="bash spaces"> </code><code class="bash string">"key"</code> <code class="bash plain">: </code><code class="bash string">"XXXXXXXXXXXXXXXXXXXXXX"</code><code class="bash plain">,</code></div>
<div class="line number4 index3 alt1">
<code class="bash spaces"> </code><code class="bash string">"email"</code> <code class="bash plain">: </code><code class="bash string">"john.smith@example.com"</code></div>
<div class="line number5 index4 alt2">
<code class="bash plain">}</code></div>
</div>
<div style="text-align: left;">
<br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><code class="text plain"></code></span></div>
<div class="MsoNormal">
<code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;">3) Заменить "key"-строку на актуальный ключ, который можно получить после регистрации на портале ECMWF. Т.е. сначала <a href="https://apps.ecmwf.int/auth/login/">нужно авторизоваться</a>, а затем <a href="https://api.ecmwf.int/v1/key/">заказать ключ</a>.</span></code><br />
<code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>RU</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-fareast-language:EN-US;}
</style>
<![endif]-->
</span></code><br />
<br />
<code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">Всё!
Теперь можно писать python-script для загрузки данных. Ниже приведён скрипт для
загрузки данных ERA Interim об осадках (код параметра 228.128) за период
1979-2017 с временным разрешением 3ч для области 30-60 в.д. и 50-70 с.ш.
Выходной формат - netcdf</span></code></span></span></code><br />
<code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;">
</span><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;"> </span></code></span></span></code><br />
<code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">P.S.
Можно использовать графический режим (также требует регистрации и авторизации)
для уточнения деталей запроса для загрузки данных с помощью скрипта. После
выбора параметров внизу будет кнопка "view Mars Request". После
нажатия на эту кнопку откроется окно, где будет представлен сам MARS-запрос и
его отображение в виде python-скрипта.</span></code></span><br />
</span></code><br />
<code class="bash plain">#!/usr/bin/env python<br /><br />import os<br />import calendar<br />from ecmwfapi import ECMWFDataServer<br />server = ECMWFDataServer()<br /><br />cwd = os.getcwd()<br /><br />years = range(1979, 2017)<br />for y in years:<br /> for m in range(1, 13):<br /> d = calendar.monthrange(y , m)[1]<br /><br /> if m < 10:<br /> m = '0{}'.format(m)<br /> server.retrieve({<br /> "class": "ei",<br /> "dataset": "interim",<br /> "date": "{0:}-{1:}-01/to/{0:}-{1:}-{2:}".format(y, m, d),<br /> "expver": "1",<br /> "grid": "0.75/0.75",<br /> "levtype": "sfc",<br /> "param": "228.128",<br /> "step": "3/6/9/12",<br /> "stream": "oper",<br /> "time": "00:00:00/12:00:00",<br /> "type": "fc",<br /> "target": "erai_tp_{}_{}.nc".format(y, m),<br /> 'area' : "50./30./70./60.",<br /> 'format' : 'netcdf'<br /> })<br />
</code> <code class="bash plain"><br />
</code> <code class="bash plain"><code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">P.P.S. <a href="https://software.ecmwf.int/wiki/pages/viewpage.action?pageId=56658233">Ссылка "О time и steps"</a>.</span></code></span></span></code></code><code class="bash plain"><br /></code><br /><b><code class="bash plain"><code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">UPD. 2018/07/06</span></code></span></span></code></code></b><br />
<code class="bash plain"><code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">Можно скачивать данные в один файл - годовой, например. Ниже приведён код, который скачивает 1460-1464 значений (6ч шаг по времени, 0-6-12-18ч анализа данных) в один файл для данного года сyear </span></code></span></span></code></code><br />
<code class="bash plain"><code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;"><br /></span></code></span></span></code></code>
<code class="bash plain"><code class="bash plain"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-size: small;"><code><span style="font-family: "times new roman" , serif;">from ecmwfapi import ECMWFDataServer<br />import numpy as np<br />server = ECMWFDataServer()<br /><br />cyear = 2005<br /><br />server.retrieve({<br /> "class": "ei",<br /> "dataset": "interim",<br /> "date": "{0:}-01-01/to/{0:}-12-31".format(cyear),<br /> "expver": "1",<br /> "grid": "0.75/0.75",<br /> "levtype": "sfc",<br /> "param": "165.128/166.128",<br /> "step": "0",<br /> "stream": "oper",<br /> "time": "00:00:00/06:00:00/12:00:00/18:00:00",<br /> "type": "an",<br /> "target": "eraNATS_an_{}.nc".format(cyear),<br /> 'area' : "60./19.5/90./90.",<br /> 'format' : 'netcdf'<br />})</span></code></span></span></code></code></div>
whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-17767438290326264732017-09-02T13:28:00.000+03:002016-02-22T17:32:26.258+03:00Электронный учебник "Научная графика в python"<div style="text-align: center;">
<h2>
<b>Научная графика в python</b></h2>
</div>
<div style="text-align: center;">
<i>Автор: Шабанов Павел Александрович<br /><br />E-mail: pa.shabanov@gmail.com</i></div>
<br />
Дата последнего обновления: 31.08.2015<br />
<br />
УДК 004.432.2 python<br />
<br />
<b>Введение</b><br />
<br />
Данное электронное пособие на русском языке посвящено работе с научной графикой с помощью графической библиотекой <a href="http://matplotlib.org/">matplotlib</a> языка программирования <a href="https://www.python.org/">python</a>.<br />
<br />
<b>Ссылка на учебник:</b><br />
<i>Шабанов П.А. Научная графика в
python [Электронный ресурс]. URL:
https://github.com/whitehorn/Scientific_graphics_in_python (31.08.2015).</i><br />
<a name='more'></a><br />
Учебник предназначен для всех желающих освоить библиотеку matplotlib
для создания научной графики в python. Книга будет интересна студентам,
аспирантам и научным сотрудникам всех возрастов. <br />
<br />
Главная
цель пособия - облегчить изучение библиотеки matplotlib и предложить
ряд готовых решений для создания научной графики высокого
публикационного качества. Приведённые в учебнике примеры показывают
возможности языка python для визуализации результатов научной
деятельности.<br />
<br />
<b>Уровень владения материалом</b><br />
<br />
Для плодотворной работы с пособием, пользователю необходимо уметь программировать на python, знать основы этого языка. Интересные на мой взгляд и свободно распространяемые учебные материалы по python собраны на <a href="http://geofortran.blogspot.ru/p/blog-page.html">странице python моего блога</a>.<br />
<br />
Вопросы <a href="http://matplotlib.org/downloads.html">установки библиотеки matplotlib</a> здесь не рассматриваются, так как часто она входит по умолчанию в различные python-дистрибутивы или её легко установить самостоятельно на любую ОС. <br />
<br />
<b>Описание </b><br />
<br />
Пособие состоит из 13 глав, объединённых в 3 части. <br />
<br />
Первая часть посвящена знакомству с библиотекой matplotlib. Здесь изложены основы по созданию графики в matplotlib с помощью модуля pyplot.<br />
<br />
Вторая часть описывает логическую структуру рисунка в matplotlib и раскрывает особенности работы с элементами рисунка разных иерархических уровней : рисунком, областями рисования, координатными осями, делениями осей. Показаны основы работы с matplotlib в объектно-ориентированном стиле.<br />
<br />
Третья часть посвящена специальным элементам рисунка: легенде, цветовой шкале, особым видам области рисования и координатных осей.<br />
<br />
Каждая глава учебника содержит краткое введение, список полезных электронных ресурсов по теме главы, практическое руководство и несколько примеров.<br />
<br />
<b>Лицензия распространения и авторские права</b><br />
<br />
Пособие предназначено для некоммерческого использования. Все права защищены.<br />
<br />
Автор убеждён, что знаниями нужно делиться. Все мы явно или неявно учились, учимся и, вероятно, будем учить других. Данное пособие специально было создано в виде электронного ресурса, чтобы его можно было активно использовать из любой точки планеты, где есть доступ к сети Интернет. <br />
<br />
Поэтому данное можно свободно скачивать (хранение его на сайте [GitHub](https://github.com/) не случайно), использовать в личных и просветительских целях, то есть делиться им с другими пользователями. <br />
<br />
Напоминаю, что при копировании и использовании чужих материалов не стоит забывать указывать источники их происхождения, в том числе при использовании материалов данного учебного пособия. Для вашего удобства вот ссылка на электронный ресурс согласно ГОСТ 2008 (см. выше).<br />
<br />
<b>Благодарности</b><br />
Всегда приятно видеть и ощущать полезность своего труда!<br />
<br />
Если у вас возникнет желание отблагодарить автора за его труд по работе над учебника, то вы можете перевести денежную сумму, которую посчитаете уместной, следующими способами:<br />
<br />
<span style="color: #b45f06;">Номер Яндекс.кошелька: 410011857034212</span><br />
<br />
<span style="color: #38761d;">Номер счёта в Сбербанке России: 408 17 810 3 38116467434</span><br />
<br />
Может быть усилиями сообщества в скором времени будет издана печатная версия учебника (с дополнительными материалами и примерами).<br />
<div style="text-align: center;">
<h3>
<i><b>Оглавление</b> </i></h3>
</div>
<br />
<b>Часть I Основы matplotlib</b><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1%20Chapter%201%20Pyplot.ipynb">Глава 1 Библиотека matplotlib. Pyplot</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1%20Chapter%202%20Main%20graphical%20commands.ipynb">Глава 2 Основные графические команды</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1%20Chapter%203%20Text%20and%20Fonts.ipynb">Глава 3 Работа с текстом и шрифтами</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P1%20Chapter%204%20Color.ipynb">Глава 4 Цвет и цветовая палитра</a><br />
<br />
<b>Часть II Структура рисунка в matplotlib</b><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2%20Chapter%205%20Figure%20container.ipynb">Глава 5 Рисунок Figure</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2%20Chapter%206%20Axes%20container.ipynb">Глава 6 Область рисования Axes</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2%20Chapter%207%20Subplots.ipynb">Глава 7 Мультиоконные рисунки</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2%20Chapter%208%20Axis%20container.ipynb">Глава 8 Координатные оси Axis</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P2%20Chapter%209%20Ticks%20container.ipynb">Глава 9 Деления координатных осей Ticks</a><br />
<br />
<b>Часть III Специальные элементы рисунка в matplotlib</b><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3%20Chapter%2010%20Twinx%20and%20log%20scale.ipynb">Глава 10 Особенности координатных осей</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3%20Chapter%2011%20Polar%20plots.ipynb">Глава 11 Графики в полярной системе координат</a> <br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3%20Chapter%2012%20Legends.ipynb">Глава 12 Легенда</a><br />
<br />
<a href="http://nbviewer.ipython.org/github/whitehorn/Scientific_graphics_in_python/blob/master/P3%20Chapter%2013%20Colorbar.ipynb">Глава 13 Цветовая шкала</a>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0tag:blogger.com,1999:blog-7450893465599699150.post-73437028578224797772017-01-30T18:39:00.000+03:002017-02-06T00:07:46.562+03:00Гидропитоника. Hydropythonica<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Дорогие читатели научно-популярного блога <b>progeor</b>u (<b>ПРО</b>фессионально о <b>ГЕ</b>Ографии по-<b>РУ</b>сски).</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-cm9e2RZLChA/WI9bOdAt13I/AAAAAAAAFRU/2uUyfFQDwP0E6PuyEYqkQmHnWDTAo6EEgCLcB/s1600/Python_logo_and_wordmark.svg_-768x228.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="95" src="https://3.bp.blogspot.com/-cm9e2RZLChA/WI9bOdAt13I/AAAAAAAAFRU/2uUyfFQDwP0E6PuyEYqkQmHnWDTAo6EEgCLcB/s320/Python_logo_and_wordmark.svg_-768x228.png" width="320" /></a></div>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Совсем скоро стартует второй сезон курса "<i>Программирование на python в науках о Земле</i>". И надеюсь, что в этом году курс, пройдя КМБ, станет более зрелым, как французский сыр.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Ко мне поступало много обращений с разных сторон (студенты, выпускники, представители кафедр) о возможности посещать занятия очно. К сожалению, в этом году формат будет иной - строго группа не более 10 человек. Это связано с целым рядом причин: отсутствие большой аудитории, необходимость курирования именно студентов, переход качества при скачке количества в сторону увеличения.</span><br />
<br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">К тому же в прошлом году я серьёзно "подсел" с другими делами на время ведения курса. Это было тяжело, но я не о чём не жалею. Как длинный и интересный поход требует подготовки и перенесения тягот во время его прохождения, также и в преподавания. Особенно нового материала.</span><br />
<br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Учтя пожелания, исправив ошибки и послушав предыдущий курс студентов-магистров, я решил в этом году изменить концепцию курса, сделать её менее теоретической. Больше практики и плясок от практических нужд.</span><br />
<br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">Вероятность 90%, что съёмок не будет. Будет публикация <i>ipython notebooks </i>с рабочими материалами. И будет онлайн канал для общения. В каком виде - пока не ясно до конца.</span><br />
<span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">В любом случае желаю учиться и учить (в хорошем смысле, когда тебя просят)! А пока у студентов каникулы, есть время и пройтись напильничком по рабочим материалам.</span>whitehornhttp://www.blogger.com/profile/03854593038580567524noreply@blogger.com0