мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
python:week20 [01/10/2018 02:43] – [Что pandas умеет?] ybezrukovpython:week20 [04/04/2021 21:56] (текущий) – [Ввод/вывод] Admin Adminovich
Строка 15: Строка 15:
   * Объединение и преобразование данных с мощными средствами **группировки** в режиме раздели-примени-объедини;   * Объединение и преобразование данных с мощными средствами **группировки** в режиме раздели-примени-объедини;
   * Высокопроизводительное **слияние и объединение** наборов данных;   * Высокопроизводительное **слияние и объединение** наборов данных;
-  * Hierarchical axis indexing provides an intuitive way of working with high-dimensional data in a lower-dimensional data structure; +  * Работа с **временными рядами**: создание временных диапазонов, преобразование отсчетов, обработка со скользящим окном, линейная регрессия с скользящим окном, смещение и т.д. 
-  * Time series-functionalitydate range generation and frequency conversionmoving window statisticsmoving window linear regressionsdate shifting and laggingEven create domain-specific time offsets and join time series without losing data; + 
-  * Highly optimized for performancewith critical code paths written in Cython or C. +====== Начало работы ====== 
-  * Python with pandas is in use in a wide variety of academic and commercial domainsincluding FinanceNeuroscienceEconomicsStatisticsAdvertisingWeb Analyticsand more.+ 
 +Обычно мы будем сразу подключать эти модули для работы (добавить в начало файла): 
 + 
 +<code python> 
 +import pandas as pd 
 +import numpy as np 
 +import matplotlib.pyplot as plt 
 +</code> 
 + 
 +====== Создание объекта ====== 
 + 
 +Можно создать серию (Series) передав список значений, для этого списка pandas самостоятельно создаст индекс (присвоит каждому элементу уникальный номер) 
 + 
 +<code python> 
 +s = pd.Series([1,3,5,np.nan,6,8]) 
 +print(s) 
 +</code> 
 + 
 +<code> 
 +0    1.0 
 +1    3.0 
 +2    5.0 
 +3    NaN 
 +4    6.0 
 +5    8.0 
 +dtype: float64 
 +</code> 
 + 
 + 
 +При создании объекта можно не полагаться на автоматический генератор индекса из pangas и указать свой. 
 + 
 +Сначала создадим диапазон дан с помощью функции date_range из pandas 
 + 
 +<code python> 
 +dates = pd.date_range('20130101', periods=6) # создаст диапазон из 6 дней, начиная с 1 января 2013 года 
 +print(dates) 
 + 
 +df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) # создаст датафрейм из таблицы, размера 6 строк на 4 столбца (np.random.randn(6,4)), попросит в качестве индекса для строк использовать значения из переменной dates (index=dates), а для столбцов список из четырех букв 
 +print(df) 
 + 
 +</code> 
 + 
 +<code> 
 +                                           D 
 +2013-01-01  0.469112 -0.282863 -1.509059 -1.135632 
 +2013-01-02  1.212112 -0.173215  0.119209 -1.044236 
 +2013-01-03 -0.861849 -2.104569 -0.494929  1.071804 
 +2013-01-04  0.721555 -0.706771 -1.039575  0.271860 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401 
 +2013-01-06 -0.673690  0.113648 -1.478427  0.524988 
 +</code> 
 + 
 +При создании датафрейма можно передать словарь объектов, который будет преобразован в серию 
 + 
 + 
 +<code python> 
 +df2 = pd.DataFrame({ 'A' 1., # одиночное вещественное число 
 +                     'B' : pd.Timestamp('20130102'), # дата 
 +                     'C' : pd.Series(1,index=list(range(4)),dtype='float32')# список из четырех единиц с вещественным типом  
 +                     'D' : np.array([3] * 4,dtype='int32'), # 4 раза повторяется список из целочисленных троек 
 +                     'E' : pd.Categorical(["test","train","test","train"]), # специальный тип, который хранит в себе категории, иными словами текстовые метки для данных 
 +                     'F' : 'foo' }) # произвольная строка 
 +                      
 +print(df2) 
 + 
 +</code> 
 + 
 +<code> 
 +              B    C  D      E    F 
 +0  1.0 2013-01-02  1.0  3   test  foo 
 + 1.0 2013-01-02  1.0  3  train  foo 
 +2  1.0 2013-01-02  1.0  3   test  foo 
 +3  1.0 2013-01-02  1.0  3  train  foo 
 +</code> 
 + 
 +Каждая колонка в датафрейме имеет свой тип, который определен внутри pandas. Узнать его можно с помощью функции dtypes 
 + 
 +<code python> 
 +       
 +print(df2.dtypes) 
 + 
 +</code> 
 + 
 + 
 +<code>       
 +A           float64 
 +B    datetime64[ns] 
 +C           float32 
 +D             int32 
 +E          category 
 +F            object 
 +dtype: object 
 +</code> 
 + 
 +====== Просмотр данных ====== 
 + 
 +Просмотрим начальные и конечные строки в датафрейме. Функция head без аргументов вернет 5 первых строк, а tails с аргументом 3 - три последних 
 + 
 +<code python> 
 +       
 +print(df.head()) 
 + 
 +</code> 
 + 
 +<code> 
 +                                           D 
 +2013-01-01  0.469112 -0.282863 -1.509059 -1.135632 
 +2013-01-02  1.212112 -0.173215  0.119209 -1.044236 
 +2013-01-03 -0.861849 -2.104569 -0.494929  1.071804 
 +2013-01-04  0.721555 -0.706771 -1.039575  0.271860 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401 
 +</code> 
 + 
 + 
 +<code python> 
 +       
 +print(df.tail(3)) 
 + 
 +</code> 
 + 
 +<code> 
 +                                           D 
 +2013-01-04  0.721555 -0.706771 -1.039575  0.271860 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401 
 +2013-01-06 -0.673690  0.113648 -1.478427  0.524988 
 +</code> 
 + 
 + 
 +С помощью функций index, columns и values можно просмотреть значения индексов (имена строк), имена колонок и значения внутри таблицы. 
 +<code python> 
 +       
 +print(df.index) 
 +print(df.columns) 
 +print(df.values) 
 + 
 +</code> 
 + 
 +Функция describe() покажет краткую сводку о данных 
 +<code python> 
 +print(df.describe()) 
 +</code> 
 + 
 +<code> 
 +              A                         D 
 +count  6.000000  6.000000  6.000000  6.000000 # количество строк 
 +mean   0.073711 -0.431125 -0.687758 -0.233103 # среднее значение элементов в столбце 
 +std    0.843157  0.922818  0.779887  0.973118 # стандартное отклонение для каждого элемента 
 +min   -0.861849 -2.104569 -1.509059 -1.135632 # наименьший элемент 
 +25%   -0.611510 -0.600794 -1.368714 -1.076610 # 25 перцентиль 
 +50%    0.022070 -0.228039 -0.767252 -0.386188 # 50 перцентиль или медиана 
 +75%    0.658444  0.041933 -0.034326  0.461706 # 75 перцентиль 
 +max    1.212112  0.567020  0.276232  1.071804 # наибольший элемент 
 +</code> 
 + 
 +Транспонировать таблицу (отразить относительно диагонали) 
 + 
 +<code python> 
 +print(df.T) 
 +</code> 
 + 
 +<code> 
 +   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06 
 +A    0.469112    1.212112   -0.861849    0.721555   -0.424972   -0.673690 
 +B   -0.282863   -0.173215   -2.104569   -0.706771    0.567020    0.113648 
 +C   -1.509059    0.119209   -0.494929   -1.039575    0.276232   -1.478427 
 +D   -1.135632   -1.044236    1.071804    0.271860   -1.087401    0.524988 
 +</code> 
 + 
 +Упорядочить по направлению (например, по имени столбца) 
 + 
 +<code python> 
 +print(df.sort_index(axis=1, ascending=False)) 
 +</code> 
 + 
 +<code> 
 +                                           A 
 +2013-01-01 -1.135632 -1.509059 -0.282863  0.469112 
 +2013-01-02 -1.044236  0.119209 -0.173215  1.212112 
 +2013-01-03  1.071804 -0.494929 -2.104569 -0.861849 
 +2013-01-04  0.271860 -1.039575 -0.706771  0.721555 
 +2013-01-05 -1.087401  0.276232  0.567020 -0.424972 
 +2013-01-06  0.524988 -1.478427  0.113648 -0.673690 
 +</code> 
 + 
 +Упорядочить по значению элементов столбца (например по столбцу B) 
 + 
 +<code python> 
 +print(df.sort_values(by='B')) 
 +</code> 
 + 
 +<code> 
 +                                           D 
 +2013-01-03 -0.861849 -2.104569 -0.494929  1.071804 
 +2013-01-04  0.721555 -0.706771 -1.039575  0.271860 
 +2013-01-01  0.469112 -0.282863 -1.509059 -1.135632 
 +2013-01-02  1.212112 -0.173215  0.119209 -1.044236 
 +2013-01-06 -0.673690  0.113648 -1.478427  0.524988 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401 
 +</code> 
 + 
 + 
 +Строки можно перебрать и с помощью цикла for, для этого нужно воспользоваться функцией iterrows 
 + 
 +<code python> 
 +for index,row in df.iterrows(): 
 +    print(row['A'])  
 +</code> 
 + 
 +======= Выборки ======= 
 + 
 +===== Получение ===== 
 + 
 +Выбор данных из колонок и стобцов очень похож на работу с списками. Одна колонка 
 + 
 +<code python> 
 +print(df['A']) 
 +</code> 
 + 
 +Диапазон строк по номеру 
 + 
 +<code python> 
 +print(df[0:3]) 
 +</code> 
 +Диапазон строк по значению индекса 
 +<code python> 
 + 
 +print(df['20130102':'20130104']) 
 +</code>  
 + 
 +===== Выборка по метке ===== 
 +Для сечения таблицы по метке используется функция loc, например, получим все значения для строки, индекс которой совпадает с нулевым элементом списка dates (мы его создавали в самом начале) 
 +<code python> 
 +print(df.loc[dates[0]]) 
 +</code> 
 +Никто не мешает нам выбрать одновременно по двум осям - строкам и столбцам. Выберем подтаблицу, которая содержит все строки и два столбца 
 + 
 + 
 +<code python> 
 +print(df.loc[:,['A','B']]) 
 +</code> 
 + 
 +Или только три строки 
 + 
 +<code python> 
 +print(df.loc['20130102':'20130104',['A','B']]) 
 +</code> 
 + 
 +Одно значение из таблицы получим с помощью 
 + 
 +<code python> 
 +print(df.loc[dates[0],'A']) 
 +</code> 
 + 
 +===== Выборка по позиции ===== 
 + 
 +Для получения по позиции или по номеру используется функция iloc. Возьмем третью строку 
 + 
 +<code python> 
 +print(df.iloc[3]) 
 +</code> 
 + 
 +Или строки с третьей по четвертую и столбцы с нулевого по первый (внимание, что правые границы диапазонов, т.е. строка с номером 5 и столбец с номером два, не включаются в результат) 
 + 
 +<code python> 
 +print(df.iloc[3:5,0:2]) 
 +</code> 
 + 
 +Вместо диапазонов можно указать конкретные строки или столбцы, например 
 + 
 +<code python> 
 +print(df.iloc[df.iloc[[1,2,4],[0,2]]]) 
 +</code> 
 + 
 +Или же, например, получить несколько строк полностью 
 +<code python> 
 +print(df.iloc[df.iloc[1:3,:]]) 
 +</code> 
 +Аналогично со столбцами 
 +<code python> 
 +print(df.iloc[:,1:3]) 
 +</code> 
 + 
 +===== Фильтрация с помощью логических выражений ===== 
 + 
 +Выберем из таблица все строки, где значения из колонки А положительны 
 + 
 +<code python> 
 +print(df[df.A > 0]) 
 +</code> 
 + 
 +Или только положительные данные во всей таблице 
 + 
 +<code python> 
 +print(df[df > 0]) 
 +</code> 
 + 
 +<code> 
 +                                           D 
 +2013-01-01  0.469112       NaN       NaN       NaN 
 +2013-01-02  1.212112       NaN  0.119209       NaN 
 +2013-01-03       NaN       NaN       NaN  1.071804 
 +2013-01-04  0.721555       NaN       NaN  0.271860 
 +2013-01-05       NaN  0.567020  0.276232       NaN 
 +2013-01-06       NaN  0.113648       NaN  0.524988 
 +</code> 
 + 
 +Обратите вниманиечто все отрицательные элементы были заменены на NaN. Специальный тип данныхуказывающий на отсутствие значения. 
 + 
 +Функция isin сверяет значения из строки или столбца со спискоми возвращает только текоторые содержатся и тами там 
 + 
 +<code python> 
 +df2 = df.copy() # функция copy копирует данные из одного датафрейма в другой 
 +df2['E'] = ['one''one','two','three','four','three'] # добавим новый столбец с именем Е и присвоим ему значения из списка 
 + 
 +print(df2) 
 + 
 +print(df2['E'].isin(['two','four'])) # выделим из нашей таблицы только те строки, которые содержат слова two и four в столбце Е 
 +</code> 
 + 
 + 
 + 
 +<code> 
 +                                                E 
 +2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one 
 +2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one 
 +2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two 
 +2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four 
 +2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three 
 + 
 +                                               E 
 +2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two 
 +2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four 
 +</code>   
 + 
 +====== Ввод/вывод ====== 
 + 
 +Представить столбец в виде списка 
 + 
 +<code python> 
 +l = df['Column'].to_list() 
 +</code> 
 +===== CSV ===== 
 +Чтение CSV файла делается в одну строку 
 +<code python>  
 +pd.read_csv('foo.csv'
 +</code>  
 + 
 + 
 +====== Задача 4 ====== 
 + 
 +Найти всех легендарных покемонов. 
 + 
 +====== Задача 5 ====== 
 + 
 +Найти всех производителей шоколада, относящихся к конкретной стране и напечатать их на экран в виде  
 + 
 +<code> 
 +Страна1 
 + Производитель1.1 
 + Производитель1.2 
 + 
 +Страна2 
 + Производитель2.1 
 + Производитель2.2 
 + Производитель2.3 
 +</code>