вівторок, 28 квітня 2020 р.

Як зберегти dataframe у csv файл (python)

save, dataframe, python, csv, зберегти, сохранить
CSV (від англ. comma-separated values 'значення, розділені комою', іноді character-separated values 'значення, розділені символом') — файловий формат для представлення табличних даних, у якому поля відокремлюються символом коми (або крапкою з комою) та переходу на новий рядок. Поля, що містять коми, декілька рядків, або лапки (позначаються подвійними лапками), мають обмежуватися з обох боків лапками. CSV формат простий та зручний для програмної обробки, тому його часто використовують для збереження різноманітнийх табличних даних з метою подальшої обробки їх різноманітними програмами. Практично усі сучасні мови, які займаються обробкою даних, мають зручні функції для читання даних у даному форматі.

Для збереження DataFrame у csv файл у Python використовується метод(функція) to_csv() класу pandas.DataFrame. Наприклад так:
import pandas as pd
df=pd.DataFrame({"Years": [1990, 1991, 1992, 1993, 1994, 1995, 1997],
    "Price1": [1, 5, 6, 10, 8, 9, 2],
    "Price2": [5, 6, 7, 8, 9, 15, 12],
    })
df.to_csv(r"C:\data\report_df.csv", index=False, sep=";")
r спереду адресу означає, що не потрібно враховувати службові символи у рядку шляху. Без r у windows шлях прийшлось би писати через дві косі риски, так:
df.to_csv("C:\\data\\report_df2.csv", index=False, sep=";")
Найбільш корисні аргументи методу to_csv наведено в таблиці.

Сценарій
Аргумент
Приклад
Змінити розділювач по замовчуванню
sep
df.to_csv(…, sep=';')
Записати без індексів
index
df.to_csv(…, index=False)
Записати без заголовків
header
df.to_csv(…, header=False)
Записати підмножину стовпчиків
columns
df.to_csv(…, columns=['x', 'y'])
Кодування формату файлу
encoding
df.to_csv(…, encodings='utf-8')
Стиснути   CSV
compression
df.to_csv(…, compression='gzip')
Задати формат часу
date_format
df.to_csv(…, date_format='%d/%m%Y')
Зберегти NaNs as "N/A"
na_rep
df.to_csv(…, na_rep='N/A')

понеділок, 27 квітня 2020 р.

Клас PriorityQueue (Java)

PriorityQueue дозволяє реалізувати чергу на основі пріоритету. Така черга може бути корисна, наприклад, у разі необхідності обслуговування клієнтів згідно пріоритету. При зберіганні чисел в пріоритетній черзі, така черга гарантує, що першим елементом завжди буде найменший елемент. При цьому не гарантується ніякий стабільний послідовний порядок збереження елементів. Після додавання або видалення елементу з пріоритетної черги, порядок зберігання елементів в цій черзі змінюється таким чином, що в голові черги опиняється найменший елемент згідно його природнього порядку або згідно заданого компаратора.

PriorityQueue має наступні конструктори:

субота, 25 квітня 2020 р.

Інтерактивна карта поширення коронавірусу

Знайшов плагін для створення оновлюваної статистики по коронавірусу. Ось результат:
Статистика поширення коронавірусу. Постійно оновлювана карта.

Покращені коментарі під статтями Blogger (Blogspot)

Стандартне здійснення коментарів в даний час на Blogger доволі незручне. Це можна покращити за допомогою плагіна від disqus.com. Встановлення доволі просте і показане на наступному відео.


Математичні формули на Blogger (LaTeX)

LaTeX формули на blogger (blogspot)
Якщо на блозі необхідне відображення формул, то можна або додавати формули рисунками або ж залучити підтримку LaTeX до свого блогу. Для цього необхідно додати відповідний скрипт до нашого блогу.

Спосіб один, додаємо в режимі редагування HTML (Тема/Редагувати HTML) в середині тегу head наступні рядки:

<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js">
MathJax.Hub.Config({
 extensions: ["tex2jax.js","TeX/AMSmath.js","TeX/AMSsymbols.js"],
 jax: ["input/TeX", "output/HTML-CSS"],
 tex2jax: {
     inlineMath: [ ['$','$'], ["\\(","\\)"] ],
     displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
 },
 "HTML-CSS": { availableFonts: ["TeX"] }
});
</script> 
Далі можемо використовувати наші формули написані у форматі LaTex:
x=x^{2}+\frac{a}{b}
Формулу необхідно оточити знаками долара і вуаля: $x=x^{2}+\frac{a}{b}$

Інший спосіб використати рішення від latex.codecogs.com. В даному випадку код з адресою скрипта додаємо у HTML/JavaScript гаджет, що наявний у блозі на платформі blogger(blogspot):
<script type="text/javascript" src="http://latex.codecogs.com/latexit.php?p&li&div></script>
При використанні цього рішення формули необхідно додатково розмістити в теги абзацу або списку: <p>...</p> та <li>...</li>.

Крім того, для тих хто не хоче особливо заморочуватися з синтаксисом LaTeX на даному сайті є відповідний графічний редактор формул, який сформатує нам формулу у форматі LaTeX: www.codecogs.com/latex/eqneditor.php

Перше рішення мені більше сподобалось, оскільки код від latex.codecs.com викликав деякі проблеми із відображенням одного з моїх лічильників на блозі.

четвер, 23 квітня 2020 р.

Multiple Subplots (python)

Будувати множинні графіки в python можна різними способами. При побудові графіків з використанням бібліотеки Matplotlib існує два стилі, які часто комбінуються. Один це стиль matlab, який реалізовується за допомогою функцій у модулі pyplot. Інший стиль - це об'єктно- орієнтований стиль, який мені особисто більше подобається (мабуть Java дається взнаки). В об'єктно орієнтованому стилі ви маєте фігуру - що представляє собою весь графік і підграфіки(subplots), що предсталяються об'єктами Axes. Взявши потрібний об'єкт Axes ми отримуємо можливість маніпулювати нашим підграфіком.

Один із способів це зробити використати метод(функцію) sublots():
#будуємо графік 2х2 (4 підграфіки)
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
Можна також так:
fig, axs = plt.subplots(2, 2, sharex=True, sharey=True)
axs[0, 0].plot(x) # працюємо з координатами підграфіків
sharex=True, sharey=True - означає, що у нас будуть для всіх графіків спільні осі Х та Y. Якщо хочемо для кожного графіка свої осі, то не задаємо ці параметри.

Таким чином можемо побудувати наші графіки:

неділя, 19 квітня 2020 р.

Клас TreeSet (Java)

Клас TreeSet дозволяє створювати відсортовану множину. Тобто елементи не повторюються та зберігаються у відсортованому порядку. Для зберігання елементів застосовується бінарна деревоподібну структура. Об'єкти зберігаються в відсортованому порядку по зростанню. Час доступу та одержання елементів доволі малий, тому клас TreeSet підходить для зберігання великих об’ємів відсортованих даних, які повинні бути швидко знайдені.

Клас TreeSet розширює клас AbstractSet та реалізує інтерфейс NavigableSet. NavigableSet реалізується на базі TreeMap.

В класі доступні чотири конструктори:

TreeSet () 
TreeSet(Collection  с) 
TreeSet(Comparator  компаратор) 
TreeSet(SortedSet  ss)

субота, 18 квітня 2020 р.

Клас LinkedHashSet

Клас LinkedHashSet розширює клас HashSet не додаючи ніяких нових методів. Працює він дещо довше за HashSet проте зберігає порядок в якому елементи додаються до нього. Відповідно це дозволяє організувати послідовну ітерацію вставлення та витягнення елементів. Всі конструктори та методи роботи з LinkedHashSet аналогічні тим, що є в класі HashSet.
import java.util.HashSet;
import java.util.LinkedHashSet;

public class TestLinkedHashSet {
    public static void main(String[] args) {
        HashSet<String> hs=new HashSet<String>();
        LinkedHashSet<String> lhs=new LinkedHashSet<String>();
        hs.add("1");
        hs.add("2");
        hs.add("3");
        hs.add("4");
        hs.add("5");
        lhs.add("1");
        lhs.add("2");
        lhs.add("3");
        lhs.add("4");
        lhs.add("5");
        System.out.println("HashSet: "+hs);
        System.out.println("LinkedHashSet: "+lhs);
    }
}
Результат роботи програми:
HashSet: [3, 2, 1, 5, 4]
LinkedHashSet: [1, 2, 3, 4, 5]


пʼятниця, 17 квітня 2020 р.

Підсвітка синтаксису на Blogger (google-code-prettify)

Свого часу написав статтю про підсвітку синтаксису для блогів на платформі Blogger (blogspot.com): Підсвітка синтаксису на Blogger. Підсвітка від Алекса Горбачева получалась доволі красивою з реалізацією під різні мови, проте доволі часто через завантажування скриптів блог починав підвисати і час його завантаження збільшився. Тому вирішив відмовитися від неї і користуватися тегом pre. Проте хочеться все ж хоч якось прикрасити код) Тому знайшов інший вихід скрипти google-code-prettify.

Як і в попередньому випадку заходимо в управління блогом, знаходимо пункт "Тема" і тиснемо кнопку "Редагувати HTML" і там перед тегом <head> або ж після нього вставляємо:
<script src='https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js'/>
В html коді нашої статті оточуємо програмний код тегами pre:
<pre class="prettyprint">наш програмний код</pre>
або ж з вказанням мови
<pre class="prettyprint lang-html">
наш код
</pre>
Дивіться також давнішу публікацію:

Клас HashSet

HashSet – це клас призначений для зберігання даних у вигляді множини невпорядкованих елементів. Якщо потрібна впорядкована множина, то використовуйте TreeSet. HashSet також не гарантує стабільного порядку збереження об’єктів. Тобто при додаванні об’єктів порядок зберігання елементів змінюється. Вони можуть бути збережені як в кінці множити так і в середині. Якщо потрібен один порядок зберігання об’єктів використовуйте LinkedHashSet.

Сам термін «множина» означає, що елементи не будуть повторюватися. Для зберігання і пошуку елементів використовується хеш-код об’єкта. HashSet також може містити значення null. Власне всередині самої реалізації HashSet використовується клас HashMap, який дозволяє зберігати елементи у вигляді двох складових ключа та хеш-коду. У класі HashSet хеш-код недоступний і використовується неявно для користувача.

Клас HashSet розширює клас AbstractSet та реалізує інтерфейс Set. Також реалізовує інтерфейси Serializable та Clonable.

HashSet має такі конструктори:
HashSet()
HashSet (Collection  c)
HashSet (int об’єм)
HashSet (int об’єм, float коефіцієнт_заповнення)

четвер, 16 квітня 2020 р.

Як побудувати графік по стовпцям pandas dataframe (python)

Для виводу використовуємо бібліотеку matplotlib.

Наступний приклад демонструє створення dataframe та виводу його стовпців на лінійному графіку. Показано як додати назву графіку, підписи осей, сітку, задати вигляд підпису осі Х.
import pandas as pd;
import matplotlib.pyplot as plt;
df=pd.DataFrame({"Years": [1990, 1991, 1992, 1993, 1994, 1995, 1997],
    "Price1": [1, 5, 6, 10, 8, 9, 2],
    "Price2": [5, 6, 7, 8, 9, 15, 12],
    })
print (type(df))
ax = df.plot(x="Years", y="Price1", kind="line", label="Ціна1", marker="*")
df.plot(x="Years", y="Price2", ax=ax, color="C2", label="Ціна2", marker=".")
ax.set_title('Ціни по роках') # назва діаграми
ax.legend(loc='upper left') # встановити де знаходитиметься легенда
ax.set_ylabel('Ціна') # підпис осі y
ax.set_xlabel('Роки') # підпис осі x
ax.grid() # додати сітку на діаграму
#plt.xticks(rotation='vertical') # вивести написи на осі Х вертикально або
ax.tick_params(axis='x', rotation=45) # виводимо написи на осі X з поворотом на 45 градусів
plt.show()
Результат:
Matplotlib plot pandas dataframe
Результат побудови по стовпцях dataframe
Додатково:
* Візуалізація з Matplotlib (Python Data Science Handbook)
* Matplotlib.markers
* Pandas Dataframe: Plot Examples with Matplotlib and Pyplot

середа, 15 квітня 2020 р.

Клас LinkedList

LinkedList — це структура даних Java, що являє собою пов’язаний список елементів (об’єктів).

Різниця між ArrayList та LinkedList полягає в тому, що ArrayList реалізований у вигляді масиву, а LinkedList у вигляді пов’язаних між собою об’єктів. ArrayList швидко виконує читання і заміну елементів (посилань на об’єкти), проте, щоб вставити новий елемнт в середину ArrayList або видалити існуючий в середині ArrayList здійснюється послідовний зсув цілого ряду елементів масиву. В LinkedList доволі швидко відбувається вставлення нового елементу або видалення існуючого. Це відбувається тому, що в середині реалізації LinkedList змінюються лише посилання на попередній і наступний об’єкти (елементи). Проте доступ до об’єктів по індексу в LinkedList відбувається повільніше ніж в ArrayList. Тож загалом, LinkedList корисний, коли необхідно часто вставляти та видаляти елементи зі списку, а в інших випадках краще використовувати ArrayList.

Існує два конструктури LinkedList:

вівторок, 14 квітня 2020 р.

Клас ArrayList

Клас ArrayList - це по суті динамічний масив посилань на об'єкти. Динамічний означає, що якщо його об'єму недостатньо, то він автоматично змінює свій об'єм при додаванні до нього нових елементів. При потребі можна задати йому потрібний об'єм методом ensureCapacity (). ArrayList дозволяє читати об'єкти як по індексу так і послідовно через ітератор.

Клас ArrayList розширює клас AbstractList та реалізовує інтерфейс List.

Наступний приклад демонструє створення ArrayList, його наповнення об'єктами типу String та їх читання за допомогою методу get (int index) та за допомогою ітератора.

вівторок, 31 березня 2020 р.

Java vs Python

Так склалось, що останнім часом багато працюю з аналізом даних на Python. Попередньо опробував Matlab та R, після яких перейти на Python не склало взагалі ніяких проблем. Проте досвіду в програмуванні у мене все таки більше на Java, тому тут опишу Python з точки зору Java програміста. Нічим не хочу образити Python програмістів, просто погляд з під дещо іншим фокусом. Python потужна, просто освоювана мова програмування, з деякими недоліками, які втім не заважають конкурувати з іншими мовами програмування і з Java зокрема.

Динамічна типізація - жах Java програміста:-). Перше, що  впадає в очі це динамічне перетворення типів і відсутність контролю за типами змінних, що передаються у функції. В java  ти явно маєш вказувати тип і приведення до інших типів даних (крім деяких винятків). Крім того в Java при передачі змінної у функцію(метод) автоматично іде перевірка на відповідність типу змінної сигнатурі методу ще на етапі компіляції. В Java, щоправда, існує можливість написати універсальний метод, який прийматиме будь-який тип або ж якусь групу типів, але це необхідно явно вказати при оголошенні методу. Pyhon старається все робити автоматично і у функцію можна передати будь-який тип. Тому часто різноманітні функції з популярних модулів для аналізу даних Python "матюкаються" на те, що вони не можуть працювати з певним типом даних під час виконання програми (інколи з тієї інформації, що видає функція не завжди і зрозуміло в чому причина помилки). Методом проб і помилок приходиться здійснювати перетворення у відповідний тип власноруч.

вівторок, 24 березня 2020 р.

Засіб для роботи з базами даних DBeaver


DBeaver Community Edition– безкоштовний графічний інструмент для роботи з такими базами даних як MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Apache Hive, Phoenix, Presto, etc. Платна версія DBeaver Enterprise Edition також може працювати з noSQL базами даних.

Щодо плюсів то можу сказати, що як засіб роботи з готовою базою даних DBeaver доволі зручний. Тут можна переглянути ER діаграму бази даних, написати скрипт і запустити SQL  запити з переглядом їх результатів, редагувати дані в таблицях і отримувати деякі статистичні показники по стовпчиках як то середнє, мода, сума. В платній версії є можливість побудови стовпчикових діаграм.

неділя, 22 березня 2020 р.

Коротко про MongoDb (noSQL)


MongoDb  - документоорієнтована нереляційна база даних. Якщо реляційні бази даних зберігають дані у вигляді взаємопов’язаних таблиць, то MongoDb зберігає дані у вигляді документів/об‘єктів у спеціальному JSON форматі. Наприклад один документ про особу може виглядати так:

{   
    "_id" : ObjectId("15"),
    "name" : "Mike",
    "age" : 45,
    "email" :
     "newem@ukr.net"
}

четвер, 13 лютого 2020 р.

Adapter pattern

Вирізка із книги "GoF Design Patterns - with examples using Java and UML2" by: Benneth Christiansson (Ed.) Mattias Forss, Ivar Hagen, Kent Hansson, Johan Jonasson, Mattias Jonasson, Fredrik Lott, Sara Olsson, and Thomas Rosevall. License: Creative Commons Attribution-ShareAlike 3.0 License.

Визначення

Патерн адаптер(Adapter) або ж обгортка (Wrapper) використовується для трансляції інтерфейсу одного класу в інтерфейс іншого. Це означає, що ми можемо зробити так, щоб класи працювали разом, хоча вони мають несумісні інтерфейси. Клас адаптер використовує множинне успадкування (розширяючи один клас і/або реалізуючи один або більше класів), щоб адаптувати один інтерфейс до іншого. Об’єкт адаптер покладається на агрегацію об’єктів.

Де використовується
  • Коли ви хочети використовувати існуючий клас, але його інтерфейс не зіставляється з тим який вам потрібен
  • Коли ви хочете створити повторно використовуваний клас, що взаємодії з непов’язаними або невідомими наперед класами, що є класами, що необов’язково мають сумісний інтерфейс.
  • Коли ви хочете збільшити прозорість класів
  • Коли ви хочете створити вбудовуваний набір.

вівторок, 27 листопада 2018 р.

JAXB: розпаковування та генерування XML документів

JAXB (Java Architecture for XML Binding) дозволяє швидко розпакувати (unmarshall) xml файл у об’єкти та згенерувати/запакувати (marshall) xml із об’єкту. JAXB використовується, зокрема, при розробці RESTtful Веб-сервісів, коли необхідно швидко згенерувати xml у якості відповіді клієнту або розпакувати із http запиту.
Для прикладу є простий XML документ:
<?xml version="1.0" encoding="UTF-8"?>
<Data>
 <id>1</id>
 <name>Галина Мер</name>
 <mobile>+380970000001</mobile>
</Data>

Для того, щоб розпакувати наш xml об'єкт нам потрібен клас із відповідною анотацією.