Я хочу построить несколько переменных из фрейма данных, используя matplotlib, но окончательный график выглядит так странно

У меня есть фрейм данных, содержащий акции нескольких компаний и столбец даты. Я хочу отобразить значения этих акций по оси y и дату по оси x на одном графике.

Каждая акция начинается с разной стоимости (например, Amazon начинается с 3103 долларов, а Apple — со 112 долларов).

Когда я это делаю, мой сюжет выглядит так

Вот мой код сюжета:

import matplotlib.pyplot as plt

%matplotlib inline
fig2 = plt.figure()
ax2 = fig2.add_subplot('111')
ax2.plot(plot_stocks['Amazon High'])
ax2.plot(plot_stocks['Apple High'])
ax2.plot(plot_stocks['Facebook High'])
ax2.plot(plot_stocks['Microsoft High'])

Вот пример данных:

Date  Amazon High  Apple High Facebook High Microsoft High
0  2020-12-04     $3198.21   $122.8608       $283.46        $215.38
1  2020-12-03     $3228.64     $123.78       $286.65      $216.3757
2  2020-12-02        $3232     $123.37       $291.78        $215.47
3  2020-12-01     $3248.95   $123.4693        $289.3        $217.32
4  2020-11-30     $3228.39     $120.97        $277.7        $214.76
5  2020-11-27     $3216.19     $117.49       $279.13        $216.27
6  2020-11-25        $3198     $116.75       $280.18        $215.29
7  2020-11-24     $3134.25     $115.85     $277.8199        $214.25
8  2020-11-23    $3139.745   $117.6202     $270.9471        $212.29
9  2020-11-20     $3132.89     $118.77          $273       $213.285

Одна вещь, которую я забыл упомянуть, это то, что столбцы High являются строковыми, и я не мог их изменить даже после того, как сделал это:

plot_stocks['Amazon High'] = plot_stocks['Amazon High'].replace(r'$', '')

Возможно, будет проще манипулировать данными до построения графика. Если у вас есть мультииндексный фрейм данных с уровнем 0 — высоким, а уровнем 1 — Amazon, Apple, Facebook и Microsoft, то он должен быть более автоматическим.

David Erickson 11.12.2020 01:08

@DavidErickson Как я могу это сделать?

user10976183 11.12.2020 01:09

Каков формат данных о стоимости акций? Похоже, что они могут быть строками вместо чисел с плавающей запятой на основе меток оси Y?

Jtradfor 11.12.2020 01:05

@Jtradfor Это строки iirc. Я пытался их изменить, но это не сработало

user10976183 11.12.2020 01:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
4
508
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете манипулировать своими данными, создав мультииндекс с помощью pd.MultiIndex.from_tuples():

Это заставляет plot автоматически давать вам результат, который вы ищете:

Настройка панд:

plot_stocks['Date'] = pd.to_datetime(plot_stocks['Date'])
plot_stocks = plot_stocks.replace('\$', '', regex=True)
plot_stocks.iloc[:,1:] = plot_stocks.iloc[:,1:].astype(float)
plot_stocks = plot_stocks.set_index('Date')
plot_stocks.columns = pd.MultiIndex.from_tuples([(col.split()[1], col.split()[0])
                                        for col in plot_stocks.columns])
plot_stocks
Out[1]: 
                High                              
              Amazon     Apple  Facebook Microsoft
Date                                              
2020-12-04  3198.210  122.8608  283.4600  215.3800
2020-12-03  3228.640  123.7800  286.6500  216.3757
2020-12-02  3232.000  123.3700  291.7800  215.4700
2020-12-01  3248.950  123.4693  289.3000  217.3200
2020-11-30  3228.390  120.9700  277.7000  214.7600
2020-11-27  3216.190  117.4900  279.1300  216.2700
2020-11-25  3198.000  116.7500  280.1800  215.2900
2020-11-24  3134.250  115.8500  277.8199  214.2500
2020-11-23  3139.745  117.6202  270.9471  212.2900
2020-11-20  3132.890  118.7700  273.0000  213.2850

Код Matplotlib:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
company_list = [col[1] for col in plot_stocks.columns]
plot_stocks.plot(ax=ax, title=f'Daily Stock Prices ({(", ").join(company_list)})')
ax.legend(title='Companies', labels=company_list)
ax.set_ylabel('Stock Prices')
plt.show()

Другие вопросы по теме