Вопрос или проблема
У меня есть два датафрейма, каждый из которых имеет 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()
Когда я создаю точечную диаграмму, она правильно отображает точки, но, к сожалению, не создает отдельные линии, которые мне нужны для анализа. В качестве примера визуализации, которую я хотел бы увидеть…
Вот как я это сделал:
Воспроизводя ваши данные:
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.
.
Ответ или решение
Построение графиков для двух 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()
Объяснение кода
-
Подготовка данных: Мы загружаем данные в два
DataFrame
, устанавливаемDate
в качестве индекса и убираем первый столбец, чтобы работать только с числовыми значениями. -
Построение графика: Используя цикл
for
, мы перебираем все названия столбцов вDataFrame
rs
. Для каждого столбца поочередно строим линию для значений по оси X и Y. -
Настройка графика: Мы добавляем заголовки, метки для осей, поворачиваем метки на оси X для удобства чтения, добавляем сетку и легенду.
Заключение
Таким образом, описанный подход позволяет динамически строить графики на основе данных из двух DataFrame
, независимо от их количественного состава. Используя библиотеки Pandas
и Matplotlib
, мы можем эффективно визуализировать данные для дальнейшего анализа. Этот метод обеспечит гибкость при работе с различными наборами данных, что делает его незаменимым в arsenal’е любого аналитика данных.