<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 1 - Введение в Pandas
Pandas это очень мощная библиотека с множеством полезных функций, ею можно пользаться много лет так и не использовав весь ее потенциал. Цель воркшопа ознакомить вас основами, это
Step1:  Чтение и запись данных
Step2:  Теперь мы получили list с текстовыми строками, нам нужно преобразовать их в dict и передать в DataFrame. <br/>
Здесь json.loads - преобразует текстовые строки в dict.
Step3:  Теперь мы можем взглянуть, что собой представляют наши данные. DataFrame позволяет их вывести в такой наглядной таблице.
Step4:  Данные вначале нашего df
Step5:  Данные вконце df
Step6:  Упражнение
Step7:  http
Step8:  Теперь мы видим, что столбец был преобразован в нужный нам тип данных.
Step9:  Работа с текстовыми данными.
http
Step10:  Таким простым вызовом мы получаем новый столбец с длинной строки описания товара, который может быть хорошим индикатором для вашей модели.
Step11:  Упражнение
Step12:  Нижний регистр.
Step13:  Верхний регистр.
Step14:  Поиск строк, которые содержат определенную подстроку или regex
Step15:  Работа с timeseries
.dt accessor
Также как и .str, .dt позволяет вызывать методы для работы с временными данными для всего столбца.
День недели
Step16:  Неделя в году
Step17:  Упражнение
Step18:  Выбор данных
DataFrame имеет очень мощный функционал для поиска необходимых данных. <br/>
Таким простым вызовом мы можем выбрать индексы всех строк отзывов, у которых оценка ниже 5.
Step19:  Передав их как ключ, мы получим сами строки.
Step20:  Полученные индексы мы можем передать в метод loc, вторым аргументом он принимает список столбцов, которые мы хотим видеть.
Step21:  Также мы можем передать более сложные условия для выборки, например, здесь мы выбираем отзывы с оценкой 5, содержащие слово awesome и отзывы с оценкой 1, содержащие слово terrible.
Step22:  Упражнение
Step23:  isin
isin работает по такому принцип
Step24:  Выбираем строки, которые содержат топ 3 популярные товары.
Step25:  Упражнение
Step26:  Группировка
http
Step27:  Упражнение
Step28:  Упражение
Step29:  pd.Grouper
Step30:  Plotting
Step31:  EXERCISE
Step32:  EXERCISE
Step33:  EXERCISE
<ASSISTANT_TASK:>
Python Code:
import pandas as pd
print("Pandas version: {}".format(pd.__version__))
# опции отображения
pd.options.display.max_rows = 6
pd.options.display.max_columns = 6
pd.options.display.width = 100
Explanation: 1 - Введение в Pandas
Pandas это очень мощная библиотека с множеством полезных функций, ею можно пользаться много лет так и не использовав весь ее потенциал. Цель воркшопа ознакомить вас основами, это:
Чтение и запись данных.
Пониманимание разных типов данных в Pandas.
Работа с текстовыми данными и timeseries.
Выбор данных.
Группировка.
Dataset
Мы будем использовать датасет Amazon Product с отзывами о продуктах на Амазоне, его собрал Julian McAuley. <br/>
Датасет выглядит таким образом:
reviewerID - ID of the reviewer, e.g. A2SUAM1J3GNN3B
asin - ID of the product, e.g. 0000013714
reviewerName - name of the reviewer
helpful - helpfulness rating of the review, e.g. 2/3
reviewText - text of the review
overall - rating of the product
summary - summary of the review
unixReviewTime - time of the review (unix time)
reviewTime - time of the review (raw)
Импорт pandas
End of explanation
import gzip
# датасет на 47 мегабайт, мы возьмем только 10
review_lines = gzip.open('data/reviews/reviews_Clothing_Shoes_and_Jewelry_5.json.gz', 'rt').readlines(10*1024*1024)
len(review_lines)
Explanation: Чтение и запись данных
End of explanation
import json
df = pd.DataFrame(list(map(json.loads, review_lines)))
Explanation: Теперь мы получили list с текстовыми строками, нам нужно преобразовать их в dict и передать в DataFrame. <br/>
Здесь json.loads - преобразует текстовые строки в dict.
End of explanation
df
Explanation: Теперь мы можем взглянуть, что собой представляют наши данные. DataFrame позволяет их вывести в такой наглядной таблице.
End of explanation
df.head()
Explanation: Данные вначале нашего df
End of explanation
df.tail()
df.describe()
Explanation: Данные вконце df
End of explanation
# ваш код здесь, используйте tab для того, чтобы увидеть список доступных для вызова функций
Explanation: Упражнение: Сохраните и загрузите датасет в разные форматы (CSV, JSON...)
End of explanation
df.info()
df['unixReviewTime'] = pd.to_datetime(df['unixReviewTime'], unit='s')
pd.to_datetime?
Explanation: http://pandas.pydata.org/pandas-docs/stable/io.html
Pandas I/O API это набор высокоуровневых функций, которые можно вызвать как pd.read_csv().
to_csv
to_excel
to_hdf
to_sql
to_json
...
read_csv
read_excel
read_hdf
read_sql
read_json
...
Типы данных Pandas и их преобразование
df.info позволяет нам получить сводную информацию про df: сколько в нем строк, названия и типы столбцов, сколько он занимает памяти...
<br/>
Мы видим, что столбец unixReviewTime (время, когда ревью было оставленно) имеет тип int64, давайте преобразуем его в datetime64 для более удобной работы с временными данными.
End of explanation
df.info()
Explanation: Теперь мы видим, что столбец был преобразован в нужный нам тип данных.
End of explanation
df.summary
Explanation: Работа с текстовыми данными.
http://pandas.pydata.org/pandas-docs/stable/text.html
.str accessor
.str accessor - позволяет вызывать методы для работы с текстовыми строками для всего столбца сразу. <br/><br/>
Это очень мощная штука, так как она позволяет легко создавать новые features, которые могут как-то описывать ваши данные.<br/>
End of explanation
df.summary.str.len()
Explanation: Таким простым вызовом мы получаем новый столбец с длинной строки описания товара, который может быть хорошим индикатором для вашей модели.
End of explanation
# Your code here
Explanation: Упражнение: Попробуйте использовать разные строковые методы: lower(), upper(), strip()...
http://pandas.pydata.org/pandas-docs/stable/text.html#method-summary
End of explanation
df.summary.str.lower()
Explanation: Нижний регистр.
End of explanation
df.summary.str.upper()
Explanation: Верхний регистр.
End of explanation
pattern = 'durable'
df.summary.str.contains(pattern)
Explanation: Поиск строк, которые содержат определенную подстроку или regex
End of explanation
df.unixReviewTime.dt.dayofweek
Explanation: Работа с timeseries
.dt accessor
Также как и .str, .dt позволяет вызывать методы для работы с временными данными для всего столбца.
День недели
End of explanation
df.unixReviewTime.dt.weekofyear
Explanation: Неделя в году
End of explanation
# ваш код
Explanation: Упражнение: Получите столбец с кварталом года, в котором был оставлен отзыв. (qua...)
End of explanation
df.overall < 5
Explanation: Выбор данных
DataFrame имеет очень мощный функционал для поиска необходимых данных. <br/>
Таким простым вызовом мы можем выбрать индексы всех строк отзывов, у которых оценка ниже 5.
End of explanation
df[df.overall < 5]
Explanation: Передав их как ключ, мы получим сами строки.
End of explanation
df.loc[df.overall < 5, ['overall', 'reviewText']]
Explanation: Полученные индексы мы можем передать в метод loc, вторым аргументом он принимает список столбцов, которые мы хотим видеть.
End of explanation
df.loc[((df.overall == 5) & (df.reviewText.str.contains('awesome'))) | ((df.overall == 1) & (df.reviewText.str.contains('terrible'))), ['overall', 'reviewText']] 
Explanation: Также мы можем передать более сложные условия для выборки, например, здесь мы выбираем отзывы с оценкой 5, содержащие слово awesome и отзывы с оценкой 1, содержащие слово terrible.
End of explanation
# Your code here
Explanation: Упражнение: Выберите строки с оценкой 5, которые были написанны во вторник и содержат слово love в summary.
End of explanation
# возвращает столбец, содержащий количество уникальных значений asin
products = df.asin.value_counts()
products
products[0:3].index
Explanation: isin
isin работает по такому принцип: мы ему передаем набор значений, а он выбирает строки,  которые им соответствуют.
End of explanation
df[df.asin.isin(products[0:3].index)]
# df[df.asin.isin(['B0000C321X', 'B0001ZNZJM', 'B00012O12A'])] - даст тот же результат
Explanation: Выбираем строки, которые содержат топ 3 популярные товары.
End of explanation
# ваш код
days = df.unixReviewTime.value_counts()
days
df[df.unixReviewTime.isin(days[0:1].index)]
Explanation: Упражнение: Выберите отзывы, которые были оставленны в дни, когда было оставленно больше всего отзывов :D
End of explanation
df.groupby('asin')['reviewText'].agg('count').sort_values()
Explanation: Группировка
http://pandas.pydata.org/pandas-docs/stable/groupby.html
groupby работает по такому принципу:
- Таблица делится на группы
- К каждой группе применяется определенная функция
- Результаты объединяются
df.groupby( grouper ).agg('mean')
End of explanation
# ваш код
Explanation: Упражнение: Вычислите среднюю оценку по каждому уникальному продукту.
End of explanation
# ваш код
Explanation: Упражение: Вычислите среднюю оценку, которую оставил каждый уникальный пользователь.
End of explanation
df.groupby([pd.Grouper(key='unixReviewTime',freq='D')])['reviewerID'].count()
df.groupby([pd.Grouper(key='unixReviewTime',freq='M')])['reviewerID'].count()
Explanation: pd.Grouper
End of explanation
%matplotlib inline
import seaborn as sns; sns.set()
df.groupby([pd.Grouper(key='unixReviewTime',freq='A')])['reviewerID'].count().plot(figsize=(6,6))
Explanation: Plotting
End of explanation
# Your code here
Explanation: EXERCISE: Plot the number of reviews timeseries by month, year
End of explanation
# Your code here
import matplotlib.pyplot as plt
by_weekday = df.groupby([df.unixReviewTime.dt.year,
                              df.unixReviewTime.dt.dayofweek]).mean()
by_weekday.columns.name = None  # remove label for plot
fig, ax = plt.subplots(1, 2, figsize=(16, 6), sharey=True)
by_weekday.loc[2013].plot(title='Average Reviews Rating by Day of Week (2013)', ax=ax[0]);
by_weekday.loc[2014].plot(title='Average Reviews Rating by Day of Week (2014)', ax=ax[1]);
for axi in ax:
    axi.set_xticklabels(['Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'])
Explanation: EXERCISE: Draw two plots to compare average review rating per day of the week between 2013 and 2014
End of explanation
import matplotlib.pyplot as plt
by_month = df.groupby([df.unixReviewTime.dt.year,
                              df.unixReviewTime.dt.day])['reviewerID'].count()
fig, ax = plt.subplots(1, 2, figsize=(16, 6), sharey=True)
by_month.loc[2012].plot(title='Average Reviews by Month (2012)', ax=ax[0]);
by_month.loc[2013].plot(title='Average Reviews by Month (2013)', ax=ax[1]);
Explanation: EXERCISE: Draw two plots to compare number of  reviews per day of the month between 2012 and 2013
End of explanation
<END_TASK>