<jupyter_start><jupyter_text>Pandas Материалы:* <NAME>. "Лекция 2: Библиотека Pandas"* https://pandas.pydata.org/docs/user_guide/index.html* https://pandas.pydata.org/docs/reference/index.html* <NAME>. Python и анализ данных  Задачи для совместного разбора 1. Загрузите данные из файла `sp500hst.txt` и обозначьте столбцы в соответствии с содержимым: `"date", "ticker", "open", "high", "low", "close", "volume"`.<jupyter_code>import pandas as pd
df=pd.read_csv('/content/sp500hst.txt', header=None, names=["date", "ticker", 'open','high','low','close','volume'])
print (df)
pd.to_datetime(df['date'], format='%Y%m%d').dt.month

df['ticker'].str.lower()<jupyter_output>date ticker   open     high      low  close   volume
0      20090821      A  25.60  25.6100  25.2200  25.55  34758.0
1      20090824      A  25.64  25.7400  25.3300  25.50  22247.0
2      20090825      A  25.50  25.7000  25.2250  25.34  30891.0
3      20090826      A  25.32  25.6425  25.1450  25.48  33334.0
4      20090827      A  25.50  25.5700  25.2300  25.54  70176.0
...         ...    ...    ...      ...      ...    ...      ...
23989  20100701    CMS  14.70  14.7400  14.4700  14.68  46923.0
23990  20100702    CMS  14.71  14.7800  14.5299  14.68  21707.0
23991  20100706    CMS  14.79  14.9600  14.6700  14.87  21000.0
23992  20100707    CMS  14.86  15.2400  14.8300  15.24  18587.0
23993  20100708    CMS  15.29  15.4400  15.1400    NaN      NaN

[23994 rows x 7 columns]<jupyter_text>2. Рассчитайте среднее значение показателей для каждого из столбцов c номерами 3-6.<jupyter_code><jupyter_output><empty_output><jupyter_text>3. Добавьте столбец, содержащий только число месяца, к которому относится дата.<jupyter_code><jupyter_output><empty_output><jupyter_text>4. Рассчитайте суммарный объем торгов для для одинаковых значений тикеров.<jupyter_code><jupyter_output><empty_output><jupyter_text>5. Загрузите данные из файла sp500hst.txt и обозначьте столбцы в соответствии с содержимым: "date", "ticker", "open", "high", "low", "close", "volume". Добавьте столбец с расшифровкой названия тикера, используя данные из файла `sp_data2.csv` . В случае нехватки данных об именах тикеров корректно обработать их.<jupyter_code>sp = pd.read_csv('/content/sp_data2.csv', sep =';', names=['ticker', 'company', 'percent'], header=None)
sp.head()

pd.merge(df,sp,how="inner", left_on="ticker", right_on="ticker")<jupyter_output><empty_output><jupyter_text>Лабораторная работа №2  Базовые операции с `DataFrame` 1.1 В файлах `recipes_sample.csv` и `reviews_sample.csv` находится информация об рецептах блюд и отзывах на эти рецепты соответственно. Загрузите данные из файлов в виде `pd.DataFrame` с названиями `recipes` и `reviews`. Обратите внимание на корректное считывание столбца(ов) с индексами.<jupyter_code>recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","contributor_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["ID","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes<jupyter_output><empty_output><jupyter_text>1.2 Для каждой из таблиц выведите основные параметры:* количество точек данных (строк);* количество столбцов;* тип данных каждого столбца.<jupyter_code>index_recipes = recipes.index
index_reviews = reviews.index
print (len (index_recipes), "number of recipes\n", len(index_reviews),"number of reviews")
print(len(recipes.columns)," num of columns in recipes")
print(len(reviews.columns), "num of columns in reviews")
print (recipes.dtypes, "types of recipies\n\n", reviews.dtypes,"types of reviews")<jupyter_output>30000 number of recipes
 126696 number of reviews
8  num of columns in recipes
6 num of columns in reviews
name               object
id                  int64
minutes             int64
contributor_id      int64
submitted          object
n_steps           float64
description        object
n_ingredients     float64
dtype: object types of recipies

 ID            int64
user_id       int64
recipe_id     int64
date         object
rating        int64
review       object
dtype: object types of reviews<jupyter_text>1.3 Исследуйте, в каких столбцах таблиц содержатся пропуски. Посчитайте долю строк, содержащих пропуски, в отношении к общему количеству строк.<jupyter_code>print ("Number of nan's in recipes \n",recipes.isna().sum().sum(),"\nNumber of nan's in reviews\n", reviews.isna().sum().sum())
print ("\n",recipes.isnull().mean() * 100)
print ("\n",reviews.isnull().mean() * 100)<jupyter_output>Number of nan's in recipes 
 20693 
Number of nan's in reviews
 17

 name               0.000000
id                 0.000000
minutes            0.000000
contributor_id     0.000000
submitted          0.000000
n_steps           37.300000
description        2.076667
n_ingredients     29.600000
dtype: float64

 ID           0.000000
user_id      0.000000
recipe_id    0.000000
date         0.000000
rating       0.000000
review       0.013418
dtype: float64<jupyter_text>1.4 Рассчитайте среднее значение для каждого из числовых столбцов (где это имеет смысл).<jupyter_code>recipes['minutes'] = pd.to_numeric(recipes['minutes'])
recipes['n_steps'] = pd.to_numeric(recipes['n_steps'])
recipes['n_ingredients'] = pd.to_numeric(recipes['n_ingredients'])
recipes['submitted']= pd.to_datetime(recipes['submitted'])
print ("Recipes\n",recipes['minutes'].mean(), "minutes\n",recipes['n_steps'].mean(), "n_steps\n", recipes['n_ingredients'].mean(), "n_ingredients" )<jupyter_output>Recipes
 123.35813333333333 minutes
 9.805582137161085 n_steps
 9.008285984848484 n_ingredients<jupyter_text>1.5 Создайте серию из 10 случайных названий рецептов.<jupyter_code>repa = recipes['name'].sample(n=10)
print (repa)<jupyter_output>18363                              mustard breaded chicken
15699                  lazy day oven hash browns casserole
6078               chicken with noodles and vegetables  ww
22263                    real chicago style italian beef i
2275                       barbecue chicken dinner packets
1134     arroz con gandules  rice and pigeon peas  a pu...
17950                    mom s 100  whole wheat air loaves
552              almond crusted chicken with scallion rice
14222                                          hot mustard
24183                                 simmered lamb shanks
Name: name, dtype: object<jupyter_text>1.6 Измените индекс в таблице `reviews`, пронумеровав строки, начиная с нуля.<jupyter_code>repa=reviews
repa['ID']=range(0, len(repa))
print (repa)<jupyter_output>ID  ...                                             review
0            0  ...  Last week whole sides of frozen salmon fillet ...
1            1  ...  So simple and so tasty!  I used a yellow capsi...
2            2  ...  Very nice breakfast HH, easy to make and yummy...
3            3  ...  These are a favorite for the holidays and so e...
4            4  ...  Excellent soup!  The tomato flavor is just gre...
...        ...  ...                                                ...
126691  126691  ...  This recipe was great! I made it last night. I...
126692  126692  ...  This recipe is outstanding. I followed the rec...
126693  126693  ...  Well, we were not a crowd but it was a fabulou...
126694  126694  ...  I have been a steak eater and dedicated BBQ gr...
126695  126695  ...  Wonderful and simple to prepare seasoning blen...

[126696 rows x 6 columns]<jupyter_text>1.7 Выведите информацию о рецептах, время выполнения которых не больше 20 минут и кол-во ингредиентов в которых не больше 5.<jupyter_code>recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","contributor_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)

temp = recipes[(recipes['minutes'] < 20) & (recipes['n_ingredients'] <= 5)]
temp<jupyter_output><empty_output><jupyter_text>Работа с датами в `pandas` 2.1 Преобразуйте столбец `submitted` из таблицы `recipes` в формат времени. Модифицируйте решение задачи 1.1 так, чтобы считать столбец сразу в нужном формате.<jupyter_code>recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","contributor_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
recipes['submitted']= pd.to_datetime(recipes['submitted'])<jupyter_output><empty_output><jupyter_text>2.2 Выведите информацию о рецептах, добавленных в датасет не позже 2010 года.<jupyter_code>temp=(recipes['submitted']<"2011-01-01")
print (recipes[temp])<jupyter_output>name  ...  n_ingredients
8                     1 in canada chocolate chip cookies  ...           11.0
13               blepandekager   danish   apple pancakes  ...            NaN
36                                 5 minute bread  pizza  ...            8.0
39                    bacon cheeseburger and fries  soup  ...           17.0
47                        full cool  macaroni and cheese  ...           11.0
...                                                  ...  ...            ...
29965                         zucchini sausage casserole  ...            NaN
29976                                      zucchini tots  ...            NaN
29992  zucchini  courgette soup  good for weight watc...  ...            NaN
29994                                     zuppa by luisa  ...           17.0
29998                                        zydeco soup  ...            NaN

[3875 rows x 8 columns]<jupyter_text>Работа со строковыми данными в `pandas` 3.1  Добавьте в таблицу `recipes` столбец `description_length`, в котором хранится длина описания рецепта из столбца `description`.<jupyter_code>recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","contributor_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)

recipes['description_length']  = recipes['description'].str.len()
recipes<jupyter_output><empty_output><jupyter_text>3.2 Измените название каждого рецепта в таблице `recipes` таким образом, чтобы каждое слово в названии начиналось с прописной буквы.<jupyter_code>recipes['name']  = recipes['name'].str.title()
recipes<jupyter_output><empty_output><jupyter_text>3.3 Добавьте в таблицу `recipes` столбец `name_word_count`, в котором хранится количество слов из названии рецепта (считайте, что слова в названии разделяются только пробелами).<jupyter_code>recipes['name_word_count']  = recipes['name'].str.split().str.len()
recipes<jupyter_output><empty_output><jupyter_text>Группировки таблиц `pd.DataFrame` 4.1 Посчитайте количество рецептов, представленных каждым из участников (`contributor_id`). Какой участник добавил максимальное кол-во рецептов?<jupyter_code>recipes.groupby('id')['id'].count().idxmax()<jupyter_output><empty_output><jupyter_text>4.2 Посчитайте средний рейтинг к каждому из рецептов. Для скольких рецептов отсутствуют отзывы?<jupyter_code>reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["ID","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
print(reviews.groupby('recipe_id')['rating'].mean())
print ("\nnum of nans")
reviews['review'].isna().sum()<jupyter_output>recipe_id
48        1.000000
55        4.750000
66        4.944444
91        4.750000
94        5.000000
            ...   
536547    5.000000
536610    0.000000
536728    4.000000
536729    4.750000
536747    0.000000
Name: rating, Length: 28100, dtype: float64

num of nans<jupyter_text>4.3 Посчитайте количество рецептов с разбивкой по годам создания.<jupyter_code>reviews.index=pd.to_datetime(reviews['date'])
print(reviews.groupby(pd.Grouper(freq='Y')).size())<jupyter_output>date
2000-12-31       13
2001-12-31      305
2002-12-31     2494
2003-12-31     3879
2004-12-31     5070
2005-12-31     7577
2006-12-31     9964
2007-12-31    15634
2008-12-31    18614
2009-12-31    17672
2010-12-31    12094
2011-12-31     8118
2012-12-31     6095
2013-12-31     5679
2014-12-31     3445
2015-12-31     2715
2016-12-31     2071
2017-12-31     2926
2018-12-31     2331
Freq: A-DEC, dtype: int64<jupyter_text>Объединение таблиц `pd.DataFrame` 5.1 При помощи объединения таблиц, создайте `DataFrame`, состоящий из четырех столбцов: `id`, `name`, `user_id`, `rating`. Рецепты без отзывов должны отсутствовать в данной таблице. Подтвердите правильность работы вашего кода, выбрав рецепт, не имеющий отзывов, и выведя на экран строку из полученного `DataFrame`, содержащую информацию об этом отзыве.<jupyter_code>reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["id","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","user_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
reviews = reviews[reviews['review'].notna()]
reviews.pop("recipe_id")
reviews.pop("date")
reviews.pop("review")
reviews.join( recipes.set_index('id')[['name']], on='user_id')<jupyter_output><empty_output><jupyter_text>5.2 При помощи объединения таблиц и группировок, создайте `DataFrame`, состоящий из трех столбцов: `recipe_id`, `name`, `review_count`. У рецептов, для которых отсутствуют отзывы, в соответствущем столбце должен быть указан 0. Подтвердите правильность работы вашего кода, выбрав рецепт, не имеющий отзывов, и выведя на экран строку из полученного `DataFrame`, содержащую информацию об этом отзыве.<jupyter_code>reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["id","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","user_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
recipes=recipes.join( reviews.set_index('recipe_id')[['review']], on='id')
recipes.pop("n_steps")
recipes.pop("minutes")
recipes.pop("submitted")
recipes.pop("description")
recipes.pop("user_id")
recipes.pop("n_ingredients")
#recipes.groupby('id').review.apply(lambda x: x.count()-x.isna().sum())
recipes.review.notnull().groupby([recipes['name'],recipes['id']]).sum().astype(int).reset_index(name='count')<jupyter_output><empty_output><jupyter_text>5.3. Выясните, отзывы, добавленные в каком году, имеют наименьший средний рейтинг?<jupyter_code>reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["id","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","user_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)

reviews.index=pd.to_datetime(reviews['date'])
#dfc = reviews.groupby(pd.Grouper(freq='Y'))['rating']
reviews=reviews.groupby(pd.Grouper(freq='Y'))['rating'].mean().nsmallest(1)
reviews<jupyter_output><empty_output><jupyter_text>Сохранение таблиц `pd.DataFrame` 6.1 Отсортируйте таблицу в порядке убывания величины столбца `name_word_count` и сохраните результаты выполнения заданий 3.1-3.3 в csv файл.<jupyter_code>recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","contributor_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)

recipes['description_length']  = recipes['description'].str.len()
recipes['name']  = recipes['name'].str.capitalize()
recipes['name_word_count']  = recipes['name'].str.split().str.len()
recipes.to_csv('raw_data.csv', index=False)<jupyter_output><empty_output><jupyter_text>6.2 Воспользовавшись `pd.ExcelWriter`, cохраните результаты 5.1 и 5.2 в файл: на лист с названием `Рецепты с оценками` сохраните результаты выполнения 5.1; на лист с названием `Количество отзывов по рецептам` сохраните результаты выполнения 5.2.<jupyter_code>reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["id","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","user_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
reviews = reviews[reviews['review'].notna()]
reviews.pop("recipe_id")
reviews.pop("date")
reviews.pop("review")
res1=reviews.join( recipes.set_index('id')[['name']], on='user_id')

with pd.ExcelWriter("Рецепты с оценками.xlsx") as writer:
  res1.to_excel(writer)

reviews = pd.read_csv('/content/reviews_sample.csv', sep =',', names=["id","user_id","recipe_id","date","rating","review"], header=None , skiprows=1)
recipes  = pd.read_csv('/content/recipes_sample.csv', sep =',', names=["name","id","minutes","user_id","submitted","n_steps","description","n_ingredients"], header=None, skiprows=1)
recipes=recipes.join( reviews.set_index('recipe_id')[['review']], on='id')
recipes.pop("n_steps")
recipes.pop("minutes")
recipes.pop("submitted")
recipes.pop("description")
recipes.pop("user_id")
recipes.pop("n_ingredients")
#recipes.groupby('id').review.apply(lambda x: x.count()-x.isna().sum())
res2=recipes.review.notnull().groupby([recipes['name'],recipes['id']]).sum().astype(int).reset_index(name='count')

with pd.ExcelWriter("Количество отзывов по рецептам.xlsx") as writer:
  res2.to_excel(writer)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13834220884463996, 'fraction_numerical': 0.07009724473257699, 'mean_word_length': 4.007826086956522, 'pattern_counts': {'":': 0, '<': 97, '<?xml version=': 0, '>': 94, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '25', 'dir': 'jupyter-structured-clean-dedup', 'id': '242846', 'license': 'MIT', 'n_tokens_mistral': 6970, 'n_tokens_neox': 6654, 'n_words': 1327, 'path': 'Big data analysis/Semester 1/02_pandas_.ipynb', 'repo_name': 'Master-sniffer/Learning', 'size': '17287'}