В этой статье я предоставляю пошаговое руководство по некоторым очень полезным утилитам 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)Понимание основных характеристик данных PythonВ данной части кода, я знакомлюсь с высокоуровневыми данными: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()Проверьте, существует ли столбец или набор столбцов, используя функцию PythonЗдесь я использую ‘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Преобразование столбцов в строки на PythonЯ преобразую значения столбца цен в виде отдельных строк, используя функцию 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, если дело доходит до задач с анализом данных.Статья была взята из следующего источника:uproger.comМощные утилиты Python для анализа данных