import numpy as np

np.zeros(10) # вектор из 10 нулевых элементов
np.arange(9).reshape(3,3) # матрица 3х3 с числами от 0 до 8
m = np.eye(3) # единичная матрица
m.shape # размеры матрицы
a = np.random.random((3,3,3)) # трехмерная матрица 3x3x3 со случайными значениями

# Матрица numpy - многомерный массив и позволяет делать и менять срез по каждому из измерений
a[3, 4:5, 1:20:2]

"""
Explanation: Вопросы

Назовите несколько видов баз данных и опишите, в чем их суть.
Что такое транзакция в терминах баз данных?
Что делает следующий запрос?
SQL
SELECT * FROM employees, managers WHERE employees.salary &gt; 100000 AND employees.manager_id = managers.id
Что такое миграция, если своими словами?
В чем преимущества NoSQL баз перед реляционными, если грубо?
Для чего нужен Elasticsearch?

Фортран и процессоры


SSE, SSE2, SSE3 ...
Векторные операции
Суровые дяди-ученые с 80 годов пишут библиотеки, которые реализуют основные операции линейной алгебры
BLAS, LAPACK, CUDA

Матричные данные


Matlab (Octave), R, Julia, Wolfram, ..., Numpy

Numpy

http://www.numpy.org/
pip install numpy или просто взять Anaconda
http://www.labri.fr/perso/nrougier/teaching/numpy.100/
https://cs231n.github.io/python-numpy-tutorial/

Примеры с Numpy
End of explanation
"""


import pandas as pd
# чтение CSV (крутые параметры: names, chunksize, dtype)
df = pd.read_csv("USlocalopendataportals.csv")
df.columns # названия колонок
df.head(15) # просмотр верхних 15 строчек
df["column"].apply(lambda c: c / 100.0) # применение функции к колонке
df["column"].str.%строковая функция% # работа со строковыми колонками
df["column"].astype(np.float32) # привести колонку к нужному типу
# а как сделать через apply?

df.groupby("column").mean() # операция агрегации

# выбор нескольких колонок
df[["Column 1", "Column 2"]]
# создать новую колонку
df["Сolumn"] = a # массив подходящего размера
# переименование колонки
df.rename(
    columns={"Oldname": "Newname"},
    inplace=True
)
# объединение нескольких условий выборки
df[df.col1 > 10 & df.col2 < 100] # можно еще | для OR

"""
Explanation: Вопрос: как сделать “шахматную доску” из нулей и единиц?
Упражнения

Допустим, у нас есть две двумерные матрицы 5x2 и 3x2 (можно заполнить случайными числами). Нужно посчитать произведение этих матриц. Надо ли транспонировать вторую?
Посчитать коэффициент корреляции Пирсона между первыми двумя колонками первой матрицы. Какая функция numpy в  этом поможет?

Pandas


http://pandas.pydata.org/
pip install pandas
основные понятия - Dataframe и Series

Плюшки

Схожий интерфейс с R (для олдскульных аналитиков)
Бесшовная интеграция с Numpy и Matplotlib
Легкое добавление колонок («фич»)
Удобные механизмы для заполнения пробелов в данных
End of explanation
"""


# интеграция в IPython
%matplotlib inline
# основной объект
from matplotlib import pyplot as plt

# столбиковая диаграмма прямо из Pandas
df["Column"].plot(kind="bar")

"""
Explanation: Упражнение

Прочитать файл USlocalopendataportals.csv в Pandas.
Сколько различных значений в колонке Location?
Сколько порталов принадлежит государству?


Выбрать все записи только для Location, начинающихся с “New York” и “Washington D.C.”.
Какой сайт встречается в этих данных дважды?
Как это показать кодом?


“Починить” колонку Population и посчитать среднее население для каждой локации.

Визуализация


Matplotlib (http://matplotlib.org/)

Seaborn (https://www.stanford.edu/~mwaskom/software/seaborn/ )
ggplot (http://ggplot.yhathq.com/ )



D3.js (https://d3js.org/ )

Bokeh (http://bokeh.pydata.org/en/latest/ )
Plotly (https://plot.ly/ )


Pygal (http://pygal.org/ )
Grafana (https://grafana.com/ )
Kibana (https://www.elastic.co/products/kibana )
End of explanation
"""


# http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html
    
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score

# Load the diabetes dataset
diabetes = datasets.load_diabetes()

# Use only one feature
diabetes_X = diabetes.data[:, np.newaxis, 2]

# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)

# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print("Mean squared error: %.2f"
      % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# Explained variance score: 1 is perfect prediction
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))

# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)

plt.xticks(())
plt.yticks(())

plt.show()

"""
Explanation: Упражнения с Matplotlib

По датафрейму, построенному в последнем пункте предыдущего задания, построить график с горизонтальными столбиками
Взять случайную выборку (скажем, 10) по локациям и населению из прошлых упражнений. С помощью объекта pyplot построить круговую диаграмму по ним.

Подсказка - http://bit.ly/1eLirnL
Scikit-Learn

http://scikit-learn.org/stable/index.html
Обширная библиотека алгоритмов для Machine Learning
http://scikit-learn.org/stable/modules/clustering.html#k-means

Линейная регрессия
End of explanation
"""


