Мощные утилиты Python для анализа данных
В этой статье я предоставляю пошаговое руководство по некоторым очень полезным утилитам Python для анализа и управления данными.
В примерах этой статьи используются данные из датафрейма S&P 500, которые я сохранил в файле pickle.
import pandas as pd
from collections import Counter
import pickle
with open("data/sp500info_df.pickle", "rb") as f:
df = pickle.load(f)
Изучаем данные с помощью базовых функций Pandas
В данной части кода, я выведу информацию по нашим данные:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 503 entries, 0 to 502
Columns: 113 entries, symbol to trailingPegRatio
dtypes: float64(101), int64(1), object(11)
memory usage: 444.2+ KB
df.head()
df.columns
Index(['symbol', 'sector', 'fullTimeEmployees', 'industry', 'ebitdaMargins',
'profitMargins', 'grossMargins', 'operatingCashflow', 'revenueGrowth',
'operatingMargins',
...
'fiveYearAvgDividendYield', 'fiftyTwoWeekLow', 'bid', 'tradeable',
'dividendYield', 'bidSize', 'dayHigh', 'regularMarketPrice',
'preMarketPrice', 'trailingPegRatio'],
dtype='object', length=113)
df.dtypes
symbol object
sector object
fullTimeEmployees float64
industry object
ebitdaMargins float64
...
bidSize float64
dayHigh float64
regularMarketPrice float64
preMarketPrice float64
trailingPegRatio float64
Length: 113, dtype: object
df.describe()
df.sample(n=10)
Проверим, существует ли нужный нам столбец в датафрейме.
Здесь я использую ‘subset’ и ‘if in’ для данной цели.
cols = ['symbol', 'beta', 'ebitda']
if set(cols).issubset(df.columns):
display(df[cols].head())
col = 'ebitda'
if col in df.columns:
display(df[[col]].head())
Проверим, есть ли в столбце цена менее 6 долларов
Здесь я проверяю, есть ли у какой-либо компании S&P 500 текущая цена меньше $6. Код выводит объект Series со значением True или False.
result = df['currentPrice'] < 6
result
Теперь я применяю функцию any(), чтобы проверить, является ли какой-либо элемент в приведённом выше результате истинным:
any(result)
True
Вот интересно, какую компанию мы увидим в результате!
Проверьте, является ли объект итеративным
Как я писал выше, результат должен быть повторяемым для применения функции any(). В результате получается тип Series. Но как проверить, является ли ряд итеративным? Используйте блок try/except для перехвата исключения:
type(result)
pandas.core.series.Series
try:
iter(result)
except TypeError:
print("result object not an iterable")
else:
print("result object is iterable")
Object is iterable
Создадим список цен компаний, выше 1000 долларов
Я использую понимание списка вместо зацикливания, чтобы код был коротким и чистым:
result = [price for price in df['currentPrice'].unique().tolist() if price > 1000]
result
[2468.7, 2005.53, 1413.64, 1470.14, 4650.0]
Выведем список компаний в виде строки
Я использую функцию join() вместо цикла, чтобы код был лаконичным и изящным.
result = ", ".join(df['sector'].dropna().unique().tolist())
result
'Industrials, Healthcare, Technology, Communication Services, Consumer Defensive, Consumer Cyclical, Utilities, Financial Services, Basic Materials, Real Estate, Energy'
Подсчитаем самые популярные отрасли
Я покажу один из многих способов отслеживания частот элементов, используя коллекцию модуля класса Counter.
result = Counter(df['sector'].dropna())
result
Counter({'Industrials': 71,
'Healthcare': 64,
'Technology': 71,
'Communication Services': 25,
'Consumer Defensive': 35,
'Consumer Cyclical': 58,
'Utilities': 30,
'Financial Services': 69,
'Basic Materials': 22,
'Real Estate': 32,
'Energy': 23})
Выведем отрасли в виде списка по областям
Я объединяю список отраслей по каждой области в виде столбца. Преобразование списка в набор предназначено для устранения дубликатов.
sector_industries_df = df[['sector', 'industry']].groupby('sector', as_index=False).agg(lambda x: set(x.tolist()))
sector_industries_df
Проверка типа любого элемента в столбце “industry”:
type(sector_industries_df.industry[0])
#type(sector_industries_df.iloc[0, 1])
set
Разобьем данные на колонки, содержащей набор отраслей
Это почти обратный процесс того, чего мы реализовывали выше. Но он использует функцию Датафрейма explode().
sector_industries_exp_df = sector_industries_df.explode('industry')
sector_industries_exp_df
Преобразуем столбцов в строки
Я преобразую значения столбца цен в виде отдельных строк, используя функцию melt().
Сначала мне нужно создать фрейм данных меньшего размера без столбцов сектора и цены, чтобы проиллюстрировать это:
subset_df = df[['symbol', 'currentPrice', 'targetLowPrice', 'targetHighPrice', 'targetMeanPrice', 'targetMedianPrice']]
subset_df
Выведем все ценовые рекорды на Apple:
subset_metl_df = subset_df.melt(id_vars=['symbol'],
value_vars=['currentPrice', 'targetLowPrice', 'targetHighPrice', 'targetMeanPrice', 'targetMedianPrice'], var_name='Price Type', value_name='Price')
subset_metl_df[subset_metl_df['symbol'] == 'AAPL']
Разобьем текущие цены на равное количество наблюдений
Для этого я использую функцию pandas qcut().
pd.qcut(df['currentPrice'], 10).value_counts()
Разобьем текущие цены на дискретные интервалы
Для этого я использую функцию pandas cut():
pd.cut(df['currentPrice'], bins=[0, 100, 200, 300, 500, 1000, 3000, 5000, 10000]).value_counts()
Заключение
Когда вы попробуете каждую из этих функций, вы обнаружите, насколько мощным является язык программирования Python, если дело доходит до задач с анализом данных.