# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Основы pandas

import pandas as pd

# Пример забора данных с сайтов

# +
import pymysql

connection
# -

pd.read_sql('select * from db.table;', connection)

pd.read_html('http://www.cbr.ru')[0]

# +
page_url = 'https://www.finanz.ru/valyuty/usd-rub'

# Импортируем нужную нам страницу в df
# attrs = {'class': 'news_table'} ---> указываем какой именно блок нам нужен
# encoding='utf-8' ---> указываем кодировку страниц для корректного отображения кириллицы
df = pd.read_html(page_url, attrs = {'class': 'news_table'}, encoding='utf-8')
df[:2]
# -

df[:2]

# Импорт данных из файла

csv - comma 

data = pd.read_csv('power.csv')
data.head()

data.head(30)

data.tail(10)

type(data)

data.

# +
# если надо указать свои заголовки и разделитель
# data = pd.read_csv('power.csv', names = ['страна', 'год', 'количество', 'категория'], sep = '\t', header=0)
# data.head()
# -

# ?pd.read_csv

# +
# количество строк в датафрейме

len(data)

# +
# или так

data.shape
# -

# Простые вычисления для нового столбца

data['year_plus_one'] = data['year'] + 1
data.head()

# ### Основные сведения о датафрейме

data.info()

2**64

None

# +
# немного статистики

data.describe()
# -

# ### Отдельный столбец (тип Series)

data['year plus one'].head()

# +
# или так

data.year.head()
# -

type(data['year'])

data.head()

# +
# уникальные значения в столбце

data['category'].unique()
# -

set([1, 1, 1, 2])

len(data['category'].unique())

data['category'].nunique()

data['category'].head()

# +
# распределение количества строк по значениям столбца

data['category'].value_counts().head(10)
# -

data['category'].value_counts(normalize=True).head()

# # Фильтры

data = pd.read_csv('power.csv')
data.head()

# +
# выбрать несколько столбцов

country_stats = data.filter(items = ['country', 'quantity'])
country_stats.head()
# -

data['country']

# +
# или так

data[['country', 'quantity']].head()
# -

# ### Отфильтруем строки с потреблением выше среднего

average_level = data['quantity'].mean()
average_level

'quantity > {}'.format(average_level)

f'quantity > {average_level}'

# +
# строки с потреблением больше среднего

average_level = data['quantity'].mean()
country_stats.query('quantity > {}'.format(average_level)).head()
# -

if data.quantity > average_level:

# +
# самый популярный способ

data[ data.quantity > average_level ].head()
# -

# ### Как определить используемый вариант названия страны?

data['country'].unique()

if 'rus' in 'Russia Federation':

# +
# найдем как называется Россия и Беларусь в этом датафрейме
# фильтр на подстроку - смотрим все страны, содержащие в названии 'us'

data[ data['country'].str.contains('us', case=False) ]['country'].unique()

# +
# фильтр на несколько условий сразу
# | - условие ИЛИ
# & AND
# () | (() | () & ())
filtered_countries = data[ (data['country']=='Russian Federation') | (data['country']=='Belarus') ]

filtered_countries.head()
# -

filtered_countries['country'].unique()

# +
# фильтры на номер строки

data.loc[1000:1005]
# -

# # Сортировка

# +
# Сортировка по столбцу

data.sort_values(by='quantity').head()

# +
# сортировка по убыванию

data.sort_values('quantity', ascending=False).head()

# +
# сортировка по нескольким столбцам

data.sort_values(by=['year', 'country', 'quantity'], ascending=[False, True, False]).head(50)
# -

# ### Параметр inplace

data.head()

data = data.sort_values(['country', 'year'], ascending=[False, True])


def calculation(data, inplace=True):
    data.sort_values(['country', 'year'], ascending=[False, True], inplace=inplace)


data.sort_values(['country', 'year'], ascending=[False, True], inplace=True)

# +
data = data.sort_values(by=['country', 'year', 'quantity'], ascending=[True, True, False])

# чтобы сократить это выражение используем inplace:
data.sort_values(by=['country', 'year', 'quantity'], ascending=[True, True, False], inplace=True)

StarcoderdataJupyterScriptsDedupFiltered