Перейти к содержимому

Как построить график из csv файла python

  • автор:

Как реализовать построение графика из данных CSV файла?

Нужно реализовать построение графика, исходя из этих данных. За ось X отвечают года, за Y- данные из последнего столбца. Создаю следующий фрейм:

data = pd.read_csv('путь к файлу', skiprows=c,nrows=d). data2 = pd.DataFrame(data,columns=['A','B','C','D','E','F','G']) 

Параметры пропуска я получаю при запуске, т.е. возможны варианты вывода графика как с 1981 по 1985, так и с 1983-1985. Таким образом я рассчитывал реализовать пропуск ненужных данных при считывании. Далее, делаю еще одну переменную, которая должна в себе содержать только последний столбец:

df = pd.DataFrame(data2['G']) 

введите сюда описание изображения

И соответственно, теперь осталось использовать этот набор данных для построения графика. Проблема в том, что в переменную df записываются NaN . Как это грамотно (или же хоть как-то) реализовать, чтобы я сам это смог понять? csv файл https://dropmefiles.com/4vUsn
если взять ваш пример, то график получается линией, как раз то что мне и нужно, при использовании данных с другого файла, картина меняется, не подскажете, как изменить его вид? Пробовал стиль графика менять, закончилось тем, что график становился просто линией внизу

Анализ данных с помощью pandas. Часть 1: Чтение данных из csv файла

Python 3 логотип

Эта часть показывает способ обработки данных, хранящихся в формате csv, а также построение простейших графиков.

Необходимые импорты и настройки

Чтение из csv файла

Можно читать данные из CSV файла с помощью функции read_csv . По умолчанию предполагается, что поля разделены запятыми.

Мы рассмотрим некоторые данные о велосипедистах Монреаля. Скачаем данные отсюда.

Этот набор данных описывает, сколько людей находилось на 7 различных велосипедных дорожках Монреаля, каждый день.

Просто взять и прочитать с помощью read_csv не получится, нужно задать аргументы, которые сделают следующее:

  • Изменят разделитель на ;
  • Изменят кодировку на ‘latin1’ (по умолчанию считается ‘utf8’ )
  • Обработают даты в колонке ‘Date’
  • Скажут, что сначала идёт день, а потом месяц (формат YYYY-DD-MM)
  • Изменят индекс на значения в колонке ‘Date’
Berri 1 Brébeuf (données non disponibles) Côte-Sainte-Catherine Maisonneuve 1 Maisonneuve 2 du Parc Pierre-Dupuy Rachel1 St-Urbain (données non disponibles)
Date
2012-01-01 35 NaN 0 38 51 26 10 16 NaN
2012-01-02 83 NaN 1 68 153 53 6 43 NaN
2012-01-03 135 NaN 2 104 248 89 3 58 NaN

Выбор колонок

Когда вы обрабатываете CSV с помощью pandas, вы получаете объект под названием DataFrame , который состоит из строк и столбцов. Вы можете получать столбцы таким же образом, каким получаете элементы словаря.

Date 2012-01-01 35 2012-01-02 83 2012-01-03 135 2012-01-04 144 2012-01-05 197 2012-01-06 146 2012-01-07 98 2012-01-08 95 2012-01-09 244 2012-01-10 397 Name: Berri 1, dtype: int64

Графики

Просто добавьте .plot() в конец! Что может быть проще этого? =)

Мы можем видеть (сюрприз!), что не так много людей катаются на велосипеде в январе, феврале и в марте.

Мы также можем построить график для всех колонок. Также мы сделаем картинку чуть-чуть побольше.

Мы видим, что все велосипедные дорожки ведут себя в основном одинаково — если это плохой день для велосипедистов, то это плохой день везде.

На этом данная часть заканчивается. Подписывайтесь и ждите продолжения!

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Визуализация данных — Python: Pandas

При анализе информации и данных часто нужно строить графики, диаграммы и гистограммы. Визуализация помогает оценивать масштабы значений, сравнивать показатели, понимать тренды и многое другое.

В библиотеке Pandas есть встроенный функционал для большинства типов графиков. Эти методы построены на базе библиотеки Matplotlib — одного из популярных среди аналитиков решений для визуализации на Python. В этом уроке мы познакомимся с часто используемыми в анализе данных инструментами визуализации библиотеки Pandas и научимся применять их на практике.

Работать будем на датасете кликов с сайтов четырех магазинов одной сети:

import pandas as pd df_clicks = pd.read_csv('./data/Cite_clicks_outliers.csv', index_col=0) print(df_clicks.head()) # => SHOP1 SHOP2 SHOP3 SHOP4 # day # 1 319.0 -265.0 319.0 328.0 # 2 292.0 4.0 292.0 301.0 # 3 283.0 301.0 274.0 283.0 # 4 328.0 364.0 328.0 NaN # 5 391.0 355.0 373.0 337.0 

В данных есть ошибки: пропущенные, отрицательные и сильно завышенные значения кликов.

Влияние ошибок в данных на результаты анализа

Чтобы построить линейный график, используем метод plot() :

# plot_1 df_clicks.plot() 

На графике видны разрывы, завышенные и отрицательные значения — это говорит о наличии ошибок.

Важно отметить техническую деталь при отрисовке графиков. Если использовать Jupyter Notebook, то для вывода графика достаточно выполнить код выше. Если писать код в виде обычного Python скрипта и выполнять его в терминале, то код необходимо дополнить методом отрисовки plt.show() из библиотеки matplotlib следующим образом:

import matplotlib.pyplot as plt # plot_1 df_clicks.plot() plt.show() 

Далее по тексту будем придерживаться способа для Jupyter Notebook.

Чтобы построить график конкретного магазина, необходимо указать его метку в качестве индекса и применить тот же метод plot() :

# plot_2 df_clicks['SHOP1'].plot() 

Разрывы стали еще более наглядными. Есть пропуски для данного магазина.

Начнем подготовку данных. Заполним пропуски средним значением для кликов по всем магазинам:

df_clicks = df_clicks.fillna(df_clicks.mean().mean()) print(df_clicks.head()) # => SHOP1 SHOP2 SHOP3 SHOP4 # day # 1 319.0 -265.0 319.0 328.000000 # 2 292.0 4.0 292.0 301.000000 # 3 283.0 301.0 274.0 283.000000 # 4 328.0 364.0 328.0 377.342796 # 5 391.0 355.0 373.0 337.000000 

Избавимся от отрицательных и слишком больших значений следующим методом. Найдем среднее и стандартное отклонение от него. Порядка 70% всех значений будет укладываться в интервал, указанный ниже:

# Среднее и стандартное отклонение mean_val = df_clicks.values.mean() std_val = df_clicks.values.std() print(f'(mean_val:.2f> - std_val:.2f>, mean_val:.2f> + std_val:.2f>)') # => (375.68 - 415.10, 375.68 + 415.10) 

Зададим маску, с помощью верхней границы данного интервала и значения в десять кликов в качестве минимального ограничения:

# Маска для фильтрации значений standard_mask = (df_clicks >= 10) & (df_clicks  mean_val + std_val) 

Применим данную маску для фильтрации:

df_clicks = df_clicks.where(standard_mask, mean_val) print(df_clicks.head()) # => SHOP1 SHOP2 SHOP3 SHOP4 # day # 1 319.0 375.684946 319.0 328.000000 # 2 292.0 375.684946 292.0 301.000000 # 3 283.0 301.000000 274.0 283.000000 # 4 328.0 364.000000 328.0 377.342796 # 5 391.0 355.000000 373.0 337.000000 

Посмотрим, как изменился график кликов первого магазина:

# plot_3 df_clicks['SHOP1'].plot() 

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

Также посмотрим на всю сеть:

# plot_4 df_clicks.plot() 

Эти графики показывают, как наличие ошибок в данных влияет на качество их анализа. После обработки на всех магазинах стала прослеживаться сезонность — волны кликов по выходным дням.

Кроме визуального анализа и построения гипотез о закономерностях в данных используют продвинутые алгоритмы машинного обучения. Указанным алгоритмам непросто выучить закономерности в данных при наличии в них ошибок. Аналитику необходимо перед анализом всегда готовить данные.

Сравнительный анализ показателей

Типы графиков могут быть разными. Задается тип с использованием параметра kind . На примере ниже показаны столбчатые диаграммы для первых семь дней. С их помощью можно производить анализ динамики изменений кликов по всей сети или же сравнивать значения в разрезе дней:

# plot_5 df_clicks[:7].plot(y=['SHOP1', 'SHOP2', 'SHOP3', 'SHOP4'], kind="bar") 

По данной столбчатой диаграмме можно сказать, что кликов на сайте магазина SHOP2 в начале недели было больше, чем во всех остальных по сети — первые три столбца слева. Также возрастает тренд в кликах ближе к выходным дням — размер столбцов увеличивается слева направо.

Статистический анализ

Анализировать статистические показатели можно с помощью визуализации плотности распределения кликов. Чтобы получить ее, нужно построить гистограмму, которая также задается через параметр kind :

# plot_6 df_clicks['SHOP1'].plot(kind='hist') 

Для первого магазина количество кликов смещено к значениям 300-350.

Для второго магазина наиболее типичным являются случаи кликов в интервале 350-400 в день:

# plot_7 df_clicks['SHOP2'].plot(kind='hist') 

Интегральные показатели

Чтобы сравнить интегральные показатели, можно использовать горизонтальные столбчатые диаграммы. В примере ниже задействован параметр fontsize , который отвечает за размер шрифта:

# plot_8 df_clicks.sum().plot(kind="barh", fontsize=10) 

Одним из часто встречаемых в презентациях типов диаграмм является представление интегральных данных в виде пирога — круговые диаграммы:

# plot_9 df_clicks.sum().plot(kind="pie", ylabel='Total clicks', fontsize=8) 

Обе из диаграмм выше показывают, что в целом показатели кликов по магазинам практически совпадают.

Поиск зависимостей в данных

Чтобы найти зависимости в данных, используются различные подходы. Одним из них — корреляционный анализ. Чтобы найти в данных линейные закономерности, используют корреляцию Пирсона. При этом такой характер зависимости величин можно увидеть и на точечном графике.

Параметр scatter позволяет построить точки с координатами (x, y) . В качестве значений координат возьмем подневные значения двух магазинов:

# plot_10 df_clicks.plot(x="SHOP1", y="SHOP2", kind="scatter") 

На примере выше показано, как расположились точки для 1 и 2 магазина. При этом зависимость здесь не усматривается. Но если посмотреть на пару 1 и 3 магазина, то ситуация меняется:

# plot_11 df_clicks.plot(x="SHOP1", y="SHOP3", kind="scatter") 

Несмотря на отклонения, точки расположились вдоль прямой — прослеживается линейная зависимость.

Выводы

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

  • Эффекты ошибок данных на результаты анализа
  • Способы интегральной оценки показателей
  • Подходы к визуализации зависимостей в данных

Визуализация данных упрощает:

  • Поиск выбросов и пропущенных значений
  • Анализ статистических и интегральных характеристик

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Построение графиков с помощью pandas и seaborn

Библиотека matplotlib может быть инструментом довольно низкого уровня. График собирается из его базовых компонентов: отображения данных (т.е. тип графика: линия, полоса, прямоугольник, разброс, контур и т.д.), легенды, заголовка, меток и других аннотаций. В библиотеке pandas мы можем получить множество столбцов данных, а также метки строк и столбцов. В pandas имеются встроенные методы, которые упрощают визуализацию объектов DataFrame и Series . Еще одна библиотека для статистических графиков — seaborn .

Линейные графики

Объекты Series и DataFrame имеют метод plot для создания базовых типов графиков. По умолчанию plot() создает линейные графики

In [32]: s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10)) In [33]: s.plot() Out[33]:

Индекс объекта Series передается в plot библиотеки matplotlib для оси \( x \). При этом такое поведение можно отключить с помощью параметра use_index = False . В таблице visual:plt-with-pandas:tbl:1 дается полный список параметров функции Series.plot .

Большинство графических методов pandas принимают опциональный параметр ax , который может являться объектом subplot . Это позволяет размещать подграфики на сетке.

Таблица 2. Параметры метода Series.plot

Параметр Описани
label Метка для легенды
ax Объект subplot из matplotlib , в который выводится график. Если не задан — вывод идет в активный подграфик
style Строка, задающая стиль графика (например, ko-- )
alpha Прозрачность заполнения графика (от 0 до 1)
kind Тип графика. Может быть: 'area' , 'bar' , 'barh' , 'density', 'hist' , 'kde' , 'line' , 'pie'
logy Использовать ли логарифмический масштаб по оси y
use_index Использовать ли объект индекс для меток оси
rot Поворот меток оси
xticks Значения для меток оси x
yticks Значения для меток оси x
xlim Границы по оси x (например, [0, 10] )
ylim Границы по оси y
grid Отображать ли сетку по осям (включено по умолчанию)

Метод plot объекта DataFrame выводит график для каждого столбца данных в виде линии на одном и том же подграфике, создавая при этом легенду автоматически:

In [34]: df = pd.DataFrame(np.random.randn(10, 4).cumsum(0), . columns=['A', 'B', 'C', 'D'], . index=np.arange(0, 100, 10)) In [35]: df.plot() Out[35]:

Атрибут plot содержит «семейство» методов для различных типов графиков. Например, df.plot() эквивалентно df.plot.line() .

В DataFrame есть несколько параметры, которые обеспечивают некоторую гибкость при обработке столбцов. Например, следует ли разместить их все на одном подграфике или создавать отдельные. В таблице visual:plt-with-pandas:tbl:2 представлены такие параметры.

Таблица 3. Специфичные для DataFrame параметры plot

Параметр Описание
subplots Рисовать ли каждый столбец DataFrame в отдельном подграфике
sharex Если subplots=True , использовать ли одну и ту же ось x , связывая метки оси
sharey Если subplots=True , использовать ли одну и ту же ось y
figsize Размер рисунка для создания в виде кортежа
title Заголовок рисунка в виде строки
legend Добавлять ли легенду на рисунок (по умолчанию True )
sort_columns Отображать ли столбцы в алфавитном порядке

Столбчатые диаграммы

Методы plot.bar() и plot.barh() строят вертикальные и горизонтальные столбчатые диаграммы. В этом случае индексы объектов Series и DataFrame в качестве меток на оси x ( bar ) или y ( barh ).

In [36]: fig, axes = plt.subplots(2, 1) In [37]: data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) In [38]: data.plot.bar(ax=axes[0], color='k', alpha=0.7) Out[38]: In [39]: data.plot.barh(ax=axes[1], color='k', alpha=0.7) Out[39]:

Параметры color='k ' и alpha=0.7 устанавливают цвет графика в черный и частичную прозрачность для заполнения.

В DataFrame столбчатые диаграммы группируют каждую строку значений вместе в группу столбиков, соответствующих каждому значению в строке:

In [40]: df = pd.DataFrame(np.random.rand(6, 4), . index=['one', 'two', 'three', 'four', 'five', 'six'], . columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus')) In [41]: df Out[41]: Genus A B C D one 0.927796 0.523404 0.854142 0.581220 two 0.605077 0.625539 0.416703 0.243262 three 0.766480 0.045345 0.151112 0.079766 four 0.911277 0.331451 0.130595 0.408353 five 0.732850 0.283842 0.046650 0.577424 six 0.056685 0.303711 0.126910 0.879065 In [42]: df.plot.bar() Out[42]:

Обратите внимание на то, что имя столбцов 'Genus' используется в качестве заголовка легенды. Для создания столбчатых диаграмм с накоплением для DataFrame задается параметр stacked=True , в результате чего значение в каждой строке будут сгруппировано вместе

In [42]: df.plot.barh(stacked=True, alpha=0.5) Out[42]:

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

In [43]: tips = pd.read_csv('tips.csv') In [44]: tips.head() Out[44]: total_bill tip smoker day time size 0 16.99 1.01 No Sun Dinner 2 1 10.34 1.66 No Sun Dinner 3 2 21.01 3.50 No Sun Dinner 3 3 23.68 3.31 No Sun Dinner 2 4 24.59 3.61 No Sun Dinner 4 In [45]: party_counts = pd.crosstab(tips['day'], tips['size']) In [46]: party_counts Out[46]: size 1 2 3 4 5 6 day Fri 1 16 1 1 0 0 Sat 2 53 18 13 1 0 Sun 0 39 15 18 3 1 Thur 1 48 4 5 1 3 In [47]: party_counts = party_counts.loc[:, 2:5]

Теперь нормализуем данные так, чтобы сумма в каждой строке была равна \( 1 \) и построим столбчатую диаграмму:

In [48]: party_pcts = party_counts.div(party_counts.sum(1), axis=0) In [49]: party_pcts Out[49]: size 2 3 4 5 day Fri 0.888889 0.055556 0.055556 0.000000 Sat 0.623529 0.211765 0.152941 0.011765 Sun 0.520000 0.200000 0.240000 0.040000 Thur 0.827586 0.068966 0.086207 0.017241 In [50]: party_pcts.plot.bar() Out[50]:

Таким образом, видно, что количество участников вечеринок в данном наборе увеличивается в выходные дни.

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

In [51]: import seaborn as sns In [52]: tips['tip_pct'] = tips['tip']/(tips['total_bill'] - tips['tip']) In [53]: tips.head() Out[53]: total_bill tip smoker day time size tip_pct 0 16.99 1.01 No Sun Dinner 2 0.063204 1 10.34 1.66 No Sun Dinner 3 0.191244 2 21.01 3.50 No Sun Dinner 3 0.199886 3 23.68 3.31 No Sun Dinner 2 0.162494 4 24.59 3.61 No Sun Dinner 4 0.172069 In [54]: sns.barplot(x='tip_pct', y='day', data=tips, orient='h') Out[54]:

Функция barplot библиотеки seaborn принимает параметр data , который может быть объектом DataFrame . Остальные параметры ссылаются на имена столбцов. Поскольку в день имеется несколько наблюдений, то столбцы диаграммы представляют собой среднее значение параметра tip_pct . Черные линии, нарисованные на столбцах диаграммы, представляют 95-процентный доверительный интервал (это можно настроить с помощью опционального параметра).

Функция barplot имеет параметр hue , который позволяет разделить отображение по дополнительному категориальному значению:

In [55]: sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h') Out[55]:

Гистограммы и графики плотности распределения

Гистограмма — это своего рода столбчатая диаграмма, которая дает дискретное отображение частоты значений. Составим гистограмму процентных долей от общего счета, используя метод plot.hist объекта Series :

In [56]: tips['tip_pct'].plot.hist(bins=50) Out[56]:

Связанный с гистограммой тип графиков — график плотности, который формируется путем вычисления оценки непрерывного распределения вероятности, которое могло бы генерироваться наблюдаемыми данными. Обычная процедура заключается в аппроксимации этого распределение как смеси «ядер», то есть более простых распределений, таких как нормальное распределение. Таким образом, графики под графиками плотности также можно понимать графики оценки плотности ядра (*K*ernel *D*ensity *E*stimate). Функции plot.kde и plot.density строят график плотности, используя подход KDE:

In [57]: tips['tip_pct'].plot.kde() Out[57]:

Библиотека seaborn упрощает создание гистограмм и графиков плотности с помощью метода distplot , который позволяет одновременно строить как гистограмму, так и непрерывную оценку плотности. В качестве примера рассмотрим бимодальное распределение, состоящее из двух разных стандартных нормальных распределений:

In [58]: comp1 = np.random.normal(0, 1, size=200) In [59]: comp2 = np.random.normal(10, 2, size=200) In [60]: values = pd.Series(np.concatenate([comp1, comp2])) In [61]: sns.distplot(values, bins=100, color='k') Out[61]:

Диаграммы рассеяния или точечные графики

Диаграммы рассеяния полезны при изучении связей между двумя одномерными рядами данных. Например, загрузим набор данных из файла macrodata.csv проекта Statmodels. Выберем некоторые переменные и вычислим «логарифмические разности»:

In [62]: macro = pd.read_csv('macrodata.csv') In [63]: data = macro[['cpi', 'm1', 'tbilrate', 'unemp']] In [64]: trans_data = np.log(data).diff().dropna() In [65]: trans_data[-5:] Out[65]: cpi m1 tbilrate unemp 198 -0.007904 0.045361 -0.396881 0.105361 199 -0.021979 0.066753 -2.277267 0.139762 200 0.002340 0.010286 0.606136 0.160343 201 0.008419 0.037461 -0.200671 0.127339 202 0.008894 0.012202 -0.405465 0.042560 

Теперь воспользуемся функцией regplot библиотеки seaborn , которая строит графики рассеяния и предлагает график линейной регрессии:

In [66]: sns.regplot('m1', 'unemp', data=trans_data) Out[66]: In [67]: plt.title('Зависимость $\log$ <> от $\log$ <>'.format('m1', 'unemp')) Out[67]: Text(0.5, 1.0, 'Зависимость $\\log$ m1 от $\\log$ unemp') 

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

In [68]: sns.pairplot(trans_data, diag_kind='kde', plot_kws='alpha': 0.2>) Out[68]:

Категориальные данные

Одним из способов визуализации данных с множеством категориальных переменных является использование сетки фасетов (facet grid). В библиотеке seaborn есть удобная функция catplot , которая упрощает создание сетки фасетов:

In [69]: sns.catplot(x='day', y='tip_pct', hue='time', col='smoker', . kind='bar', data=tips[tips.tip_pct < 1])Out[69]:

Вместо отображения разными цветами столбцов диаграмм в фасете мы также можем расширить сетку фасетов, добавив одну строку по времени:

In [70]: sns.catplot(x='day', y='tip_pct', row='time', . col='smoker', . kind='bar', data=tips[tips.tip_pct < 1])Out[70]:

Функция catplot поддерживает другие типы графиков, которые могут быть полезны. Например, блочные графики, которые показывают медиану, квартили и выбросы:

In [71]: sns.catplot(x='tip_pct', y='day', kind='box', data=tips[tips.tip_pct 0.5]) Out[71]:

Можно создавать свои собственные сетки фасетов, используя более общий класс seaborn.FacetGrid (см. документацию seaborn).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *