Внесение пиццы в ваши данные

Вступление

Вы только что закончили составлять отчет и теперь хотите выделить ключевые цифры для своего начальника. Для тех из вас, кто знаком с Excel, условное форматирование - отличный способ выделить данные, которые соответствуют определенным критериям. Однако предположим, что вы провели анализ с помощью панд и хотите сделать то же самое. Будьте уверены, когда дело доходит до условного форматирования, pandas может делать все, что может Excel, а также кое-что.

В этом обзоре мы рассмотрим еженедельную динамику акций Nasdaq-100 на прошлой неделе, чтобы выделить некоторых победителей и проигравших. Мы рассмотрим четыре варианта стилей и в заключение воспользуемся одним из них, чтобы создать отличный отчет для вашего начальника.

Начало работы: получение данных

Прежде чем мы сможем приступить к стилизации наших данных, нам нужно выполнить некоторую обработку данных, вычислив еженедельную производительность каждой акции в Nasdaq 100. К счастью, python делает это очень легко, и это сводится к трем этапам: 1) удаление символов акций из Википедии 2) написание функции, которая вычисляет еженедельное изменение для каждого символа 3) сохранение результатов в DataFrame pandas.

Шаг 1:

# Step 1 Retrieve Tickers and store them in a list
nasdaq_df = pd.read_html("https://en.wikipedia.org/wiki/NASDAQ-100#Changes_in_2020")
nasdaq_df = nasdaq_df[3]
tickers = nasdaq_df['Ticker'].tolist()

Шаг 2:

# Function that calculates weekly change
def weekly_change(ticker):
    tick_data = yf.Ticker(ticker)
    data = tick_data.history(period='1wk')
    change = 100*((data['Close'].iloc[-1]-data['Close'].iloc[0])/data['Close'].iloc[0])
    return change

Шаг 3:

# Call our function and display our results
change = map(weekly_change, tickers)
df = pd.DataFrame(change, columns=['Weekly Change'], index=tickers)
df.head()

Стилизация данных: вариант 1 - красно-зеленые значения

После сохранения результатов в DataFrame теперь мы готовы его стилизовать. Давайте сначала выделим еженедельно проигравших красным, а победителей зеленым. В нашем DataFrame есть функция стиля, например. df.style.apply или df.style.applymap, что требует написания отдельной функции для стилизации DataFrame. Применяя это к нашему красно-зеленому варианту использования, мы напишем функцию, которая классифицирует отрицательные значения как красные, а положительные значения как зеленые:

def negative_red(val):
    color = 'red' if val < 0 else 'green'
    return 'color: %s' % color

Теперь мы можем вызвать эту функцию, чтобы соответствующим образом раскрасить наши данные с помощью df.style.applymap (negative_red):

df.head(10).style.applymap(negative_red)

Вариант 2: выделение ячеек желтым

Вместо того, чтобы раскрашивать наши значения красным или зеленым цветом, допустим, мы хотим сосредоточить внимание нашего начальника на записях, набравших определенный процент за неделю, выделив эти записи желтым цветом. Как и в случае с нашими красно-зелеными значениями, мы просто напишем функцию, которая выделяет ячейки, соответствующие определенным критериям - с получением не менее 5 процентов за неделю:

def highlight(val):
    yellow = 'background-color: yellow' if val > 5 else ''
    return yellow

Теперь применим эту функцию к нашим данным с помощью df.style.applymap (выделить):

df.style.applymap(highlight)

Вариант 3: Цветовой градиент

Предположим, вы хотите выделить ячейки на основе цветового спектра, с высокими значениями, соответствующими цвету (-ам) на одном конце спектра, и низкими значениями, соответствующими цвету (-ам) на другом конце, со значениями между ними, соответствующими цветам в середина. На самом деле Pandas имеет встроенную функцию, которая стилизует ваши данные с помощью этого метода. Отдельной функции не требуется:

# The background_gradient functionality did not like null values
test = df.dropna()
test.style.background_gradient(cmap='coolwarm')

Вариант 4: гистограммы

Вы также можете использовать метод стилизации Pandas для форматирования ячеек полосами, которые соответствуют количеству в каждой строке. Просто вызовите df.style.bar (subset = [столбец, к которому вы хотите применить гистограмму])

Создание интерактивного отчета для начальника

Мы изучили несколько способов стилизации данных с помощью панд. Теперь давайте выберем один, чтобы создать отчет для вашего начальника. Как и раньше, мы будем использовать панды для выделения определенных ячеек. Кроме того, мы также добавим в наши тикеры гиперссылки, что позволит нашему начальнику легко получить доступ к последним данным по выделенным тикерам, что упростит процесс:

nasdaq_df = pd.read_html("https://en.wikipedia.org/wiki/NASDAQ-100#Changes_in_2020")
nasdaq_df = nasdaq_df[3]
tickers = nasdaq_df['Ticker'].tolist()
def weekly_change(ticker):
    tick_data = yf.Ticker(ticker)
    data = tick_data.history(period='1wk')
    change = 100*((data['Close'].iloc[-1]-data['Close'].iloc[0])/data['Close'].iloc[0])
    return change
change = map(weekly_change, tickers)
df = pd.DataFrame({'Symbol' : tickers, 'Weekly Change': change})
df.sort_values(by='Weekly Change', ascending=False, inplace=True)
def make_clickable_both(val): 
    url = f"https://finance.yahoo.com/quote/{val}?p={val}"
    return f'<a href="{url}">{val}</a>'
df.style.format({'Symbol': make_clickable_both}).bar(subset=['Weekly Change'], align='mid', color=['#d65f5f', '#5fba7d'])

Заключение

Когда мы думаем о пандах, мы думаем о вычислении чисел и манипулировании данными. Но это только половина дела. Эффективное представление результатов анализа вашей аудитории - одна из важнейших частей анализа данных, которая отличает хорошего аналитика данных от хорошего. Не оставляйте стиль панд позади!

Дальнейшее чтение

Https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html