"""
Гистограммы в Python Pandas
В Python-е данные столбца value базы данных df можно увидеть в гистограммах с помощью команды
"""
df['value'].hist()

"""
Гистограммы в Python Pandas: детально
Следующий код
df['value'].hist(bins=20)
разбивает отрезок от  минимального df['value'].min() до максимального 
значения df['value'].max() на 20 корзинок и распределяет все значения 
столбца value по 20 корзинкам. Затем выводит количество элементов 
в корзинках (частоту) на экран в виде столбиков. Высота 1-го 
столбика — количество элементов в первой корзине, ..., высота 20-го 
столбика — количество элементов 20-й корзине.
"""

"""
Программный код
df = pd.DataFrame([10,11,12,21,22,31,32,34,37,40],columns=['value'])
df['value'].hist(bins=3)
выведет гистограмму с тремя столбиками, высота которых равна 3, 2 и 5.
"""

"""
полноценный пример построения гистограммы в Python.
"""
import pandas as pd
import numpy as np
%matplotlib inline

n = 10000  # количество данных

########### генерация данных # начата ###########
array, noise = np.random.rand(n), np.random.rand(n)-0.5*np.ones(n)
for i in range(n):
    array[i] = array[i]**2 + (noise[i] if noise[i]>0.4 else 0.05*noise[i])
df = pd.DataFrame(array, columns=['value'])
########### генерация данных # окончена ########### df

df['value'].hist(bins=20)

"""
Если количество значений в столбце ограничено, 
то имеет смысл использовать альтернативный подход — вместо 
корзинок взять значения в столбце.
Пример: оценки в базе данных студентов df, программный код 
"""
df = pd.DataFrame([4,5,3,4,5,5,5,4,5], columns=['mark'])
df['mark'].value_counts()

"""
для автоматизации важны статистические характеристики:
df['value'].mean() — cреднее
df['value'].var() — дисперсия D
df['value'].std() — среднеквадратичное отклонение \
df['value'].median() — медиана 
df['value'].quantile([0.25, 0.5, 0.75]) — квантили
df['value'].describe() — выводит mean, std, квартили.
"""

"""
Пусть данные даны в виде двух столбцов таблицы Excel. 
Тогда каждая строка состоит из двух чисел.
В геометрическом подходе каждую строку воспринимаем как точку на плоскости. 
Полученная диаграмма рассеяния опытному датасайентисту скажет о многом.
Следующий код выведет на экран диаграмму рассеяния, которая указывает на сильную корреляцию 
между шириной и длиной лепестков (petal width и petal length ).
"""
# Подготовка данных
import seaborn as sns
sns.set()
df = sns.load_dataset("iris")
df = df[['petal_width', 'petal_length']]

# Визуализация пар столбцов.
df.plot.scatter(x='petal_width', y='petal_length')

"""
Построение диаграммы рассеяния в Python
Для построения диаграмм рассеяния для каждой пары столбцов в df 
можно воспользоваться функциейpairplot из библиотеки seaborn. 
"""
# Подготовка данных
import seaborn as sns
sns.set()
df = sns.load_dataset("iris")
df['species'] = df['species'].replace({'setosa':0, 'versicolor':1, 'virginica':2})

# Визуализация всевозможных пары столбцов, по диагонали гистограммы распределения.
sns.pairplot(df)

"""
Статистический подход: корреляция и ее квадрат
Статистический подход заключается в вычислении
коэффициента корреляции R между двумя величинами df[['area','price']].corr() 
коэффициента детерминации R2 (квадрат коэффициента корреляции) 
Пример кода выведет коэффициенты корреляции между каждой парой столбцов
"""
# Подготовка данных
import seaborn as sns
sns.set(rc={'figure.figsize':(4.7,4.7)})
df = sns.load_dataset("iris")
df['species'] = df['species'].replace({'setosa':0, 'versicolor':1, 'virginica':2})

# Вывод корреляции
df.corr()

"""
Pandas считывает данные из файла с форматом .csv с помощью метода read_csv
import pandas as pd
df = pd.read_csv('dataset_name.csv')
Файлы в формате csv (comma separated values) состоят из данных, 
которые разделены запятыми. Файл легко просматривается и редактируется 
стандартными текстовыми редакторами.
Иногда csv данные разделены sep = ';' или пробелам  sep = ' '. 
import pandas as pd
df = pd.read_csv('dataset_name.csv', sep=';')
"""

"""
Pandas считывает данные из файла с форматом .xls или .xlsx 
с помощью метода read_excel
import pandas as pd
df = pd.read_excel('dataset_name.xlsx')
Форматы данных .xls  и .xlsx  принадлежат редактору таблиц Excel компании Microsoft.
"""

"""
Метод df.info() выводит на экран названия столбцов, 
их типы и количество заполненных ячеек. 
Метод df.describe() выводит на экран статистические 
характеристики значений в столбцах. 
Метод df['age'].unique() выводит на экран все уникальные значения в столбце age.  
df[df['age'].isna()]  выводит на экран все строки df 
с незаполненными ячейками столбца age.  
df[100:130]  выводит на экран строки с 100 по 129 датафрейма df. 
"""

"""
Метод .fillna() 

df.fillna(df.median(), inplace=True)

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

Альтернативный код 

df = df.fillna(df.median())

является нежелательной.
Пустыми мы называем ячейки со значениями NaN или np.nan.
"""

"""
Строка датафрейма может состоять из ячеек произвольного типа:

числовые
- целочисленные int64,
- числа с плавающей запятой float64,
- целочисленный байтовый (-128 to 127) numpy.int8
- целочисленный двух байтовый (-32768 to 32767) numpy.int16
- неотрицательное целочисленное (0 to 255) numpy.uint8
- неотрицательное целочисленное (0 to 65535) numpy.uint16
- числа с плавающей запятой numpy.float16

булевские
- булевские bool (т.е. False = 0, True = 1),

категориальные 
- категориальные category или object

временные
- дата datetime

строковые
- строковые string
"""

"""
пример преобразования в Python столбца probability датафрема df 
в стандартный базис на трех столбцах.
"""
import pandas as pd
df = pd.DataFrame({'day': ['tomorrow morning','tomorrow afternoon','tomorrow evening'],
           'probability': [False, 'maybe', True]})
df = df.join(pd.get_dummies(df['probability']))
df.pop('probability')

"""

"""



