У меня есть фрейм данных, содержащий акции нескольких компаний и столбец даты. Я хочу отобразить значения этих акций по оси 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'$', '')
@DavidErickson Как я могу это сделать?
Каков формат данных о стоимости акций? Похоже, что они могут быть строками вместо чисел с плавающей запятой на основе меток оси Y?
@Jtradfor Это строки iirc. Я пытался их изменить, но это не сработало
Вы можете манипулировать своими данными, создав мультииндекс с помощью 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()
Возможно, будет проще манипулировать данными до построения графика. Если у вас есть мультииндексный фрейм данных с уровнем 0 — высоким, а уровнем 1 — Amazon, Apple, Facebook и Microsoft, то он должен быть более автоматическим.