Построение двух датафреймов pandas с n столбцами, каждый из которых представляет координату оси?

Вопрос или проблема

У меня есть два датафрейма, каждый из которых имеет n столбцов (изменяется в зависимости от входных данных), где каждый датафрейм представляет координаты оси. Каждый столбец представляет отдельные линии, которые я хочу построить.

Пример датафреймов (первый — это координаты x, второй — координаты y):вставьте описание изображения сюда

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

Мой текущий код:

#Используя datapull
from jdK_RS import RelStr, rsMOM
rs= RelStr
rsMO = rsMOM

#Удаляем первую строку и столбец, чтобы все точки можно было построить
rs = rs.iloc[1:,:]
rsMO = rsMO.iloc[1:,:]

#Создаем легенду из заголовков столбцов 
legend = rs.columns.values.tolist()

#Объединяем матрицы для создания графиков
rrg = pd.DataFrame()
rrg.reindex_like(rs)
rrg = pd.DataFrame({x: zip(rs[x], rsMO[x]) for x in rs.columns})

#Построение RRG
plt.plot(rrg)
plt.figure(figsize=(8,8))
plt.legend(legend)
plt.show()

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

пример с stockcharts.com

Вот как я это сделал:

Воспроизводя ваши данные:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

data1=[
["2022-03-23",101.309106,99.773478,101.172967],

["2022-03-24",100.153241,102.079970,99.553582],

["2022-03-25",101.454518,100.903563,101.097076],

["2022-03-28",99.821442,101.924765,102.355196]
]

data2=[
["2022-03-23",100.740636,100.392111,100.974014],

["2022-03-24",100.578897,100.216871,99.600151],

["2022-03-25",102.463595,100.002197,101.820720],

["2022-03-28",100.216871,101.387072,101.605115]
]

columns=['Дата','XLF','XLK','XLRE']
rs=pd.DataFrame(data1,columns=columns)
rsMO=pd.DataFrame(data2,columns=columns)

Удаление первого столбца (в вашем оригинальном коде вы удалили первую строку):

rs = rs.iloc[:,1:]
rsMO = rsMO.iloc[:,1:]

Используя iteritems():

for (column_name, column_data) in rs.iteritems():
    plt.plot(column_data,rsMO[column_name],'-o',label=column_name)
    plt.legend()
plt.figure(figsize=(8,8))
plt.show()

Таким образом, мы проходим через n столбцов датафрейма rs, получаем column_name, который используем как метку, а затем строим пару, образованную column_data, которую мы получили из rs, и данными с тем же column_name из датафрейма rsMO.

Pandas iteritems()

.

Ответ или решение

Построение графиков для двух DataFrame с переменным количеством колонок

Введение

Графическое представление данных — важная задача в области анализа данных и визуализации. В этом руководстве мы рассмотрим, как построить график, используя два DataFrame из библиотеки Pandas, где каждый DataFrame содержит переменное количество колонок, представляющих координаты по осям X и Y.

Описание задачи

У нас есть два DataFrame, первый из которых содержит значения по оси X, а второй — по оси Y. Каждый столбец представляет собой отдельную линию на графике. Задача состоит в том, чтобы динамически построить график, который будет адаптироваться к количеству столбцов в обоих DataFrame, не требуя их жесткой привязки.

Пример данных

Рассмотрим пример, где у нас есть два DataFrame, каждый с несколькими колонками:

import pandas as pd
import matplotlib.pyplot as plt

data1 = [
    ["2022-03-23", 101.31, 99.77, 101.17],
    ["2022-03-24", 100.15, 102.08, 99.55],
    ["2022-03-25", 101.45, 100.90, 101.09],
    ["2022-03-28", 99.82, 101.92, 102.36]
]

data2 = [
    ["2022-03-23", 100.74, 100.39, 100.97],
    ["2022-03-24", 100.57, 100.21, 99.60],
    ["2022-03-25", 102.46, 100.00, 101.82],
    ["2022-03-28", 100.22, 101.39, 101.61]
]

columns = ['Date', 'XLF', 'XLK', 'XLRE']
rs = pd.DataFrame(data1, columns=columns).set_index('Date')
rsMO = pd.DataFrame(data2, columns=columns).set_index('Date')

Построение графика

Для построения графика мы можем использовать метод iteritems(), который позволяет нам перебрать все столбцы в DataFrame. Каждый столбец будет передан в функцию plot, чтобы можно было динамически добавлять линии на график.

# Удаляем первый столбец, так как он является индексом
rs = rs.iloc[:, 1:]
rsMO = rsMO.iloc[:, 1:]

# Установим размер графика
plt.figure(figsize=(10, 6))

# Проходим по каждому столбцу и строим линии
for column_name in rs.columns:
    plt.plot(rs.index, rs[column_name], marker='o', label=f'X: {column_name}')
    plt.plot(rsMO.index, rsMO[column_name], marker='x', label=f'Y: {column_name}')

# Настройка графика
plt.title('График зависимости X от Y')
plt.xlabel('Дата')
plt.ylabel('Значение')
plt.xticks(rotation=45)
plt.legend()
plt.grid()
plt.tight_layout()

# Показ графика
plt.show()

Объяснение кода

  1. Подготовка данных: Мы загружаем данные в два DataFrame, устанавливаем Date в качестве индекса и убираем первый столбец, чтобы работать только с числовыми значениями.

  2. Построение графика: Используя цикл for, мы перебираем все названия столбцов в DataFrame rs. Для каждого столбца поочередно строим линию для значений по оси X и Y.

  3. Настройка графика: Мы добавляем заголовки, метки для осей, поворачиваем метки на оси X для удобства чтения, добавляем сетку и легенду.

Заключение

Таким образом, описанный подход позволяет динамически строить графики на основе данных из двух DataFrame, независимо от их количественного состава. Используя библиотеки Pandas и Matplotlib, мы можем эффективно визуализировать данные для дальнейшего анализа. Этот метод обеспечит гибкость при работе с различными наборами данных, что делает его незаменимым в arsenal’е любого аналитика данных.

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

Капча загружается...