#python #pandas #matplotlib
#python #панды #matplotlib
Вопрос:
У меня есть фрейм данных с возвратами (среднее значение) и стандартным отклонением четырех запасов (всего 8 столбцов)
Я хочу построить все четыре запаса, используя точечные графики рассеяния, при этом ось y является доходностью, а ось x — стандартным отклонением на том же графике.
Вот фрейм данных, который у меня есть:
Dates AAPL Mean AAPL STD AMZN Mean AMZN STD GS Mean GS STD SP500 Mean SP500 STD Portfolio Mean Portfolio STD
2009 0.003819 0.021369 0.004349 0.033053 0.003524 0.038186 0.000983 0.017188 0.003858 0.024681
2010 0.001832 0.016856 0.001367 0.020573 0.000212 0.019343 0.000542 0.011372 0.001125 0.014509
2011 0.001040 0.016539 0.000139 0.024192 -0.002127 0.023905 0.000107 0.014661 -0.000313 0.016933
2012 0.001299 0.018566 0.001680 0.020038 0.001603 0.018009 0.000536 0.008043 0.001512 0.013373
2013 0.000472 0.017987 0.001985 0.017021 0.001450 0.013557 0.001054 0.006973 0.001289 0.010746
2014 0.001447 0.013643 -0.000784 0.020297 0.000466 0.010903 0.000454 0.007163 0.000372 0.010869
2015 0.000020 0.016843 0.003308 0.021147 -0.000138 0.014043 0.000019 0.009760 0.001053 0.013520
2016 0.000575 0.014702 0.000586 0.018711 0.001332 0.016911 0.000395 0.008249 0.000823 0.012360
2017 0.001637 0.011091 0.001856 0.013207 0.000374 0.012406 0.000716 0.004212 0.001276 0.008679
2018 -0.000057 0.018106 0.001256 0.022744 -0.001495 0.016160 -0.000199 0.010741 -0.000098 0.016156
- Одна пара столбцов может быть построена с помощью следующего кода
fig, ax = plt.subplots()
ax.plot(Means['AAPL STD'], Means['AAPL Mean'], 'ob', label = 'AAPL')
plt.title('Matplot scatter plot')
plt.xlabel('Annualized Standard Deviation')
plt.ylabel('Annualized Returns')
leg = ax.legend()
- Как можно отобразить все пары столбцов без создания каждого графика вручную?
Ответ №1:
- Убедитесь
Dates
, что задано в качестве индекса. Это предотвратит его включение в группы столбцов для построения графика. - Используйте понимание списка для создания групп для каждого тикера
[a[k:k n] for k in range(0, len(a), n)]
- Это работает, потому что столбцы тикера расположены рядом друг с другом.
- Постройте каждую группу
- Чтобы удалить
Portfolio
из графика, используйтеcol_groups[:-1]
вместоcol_groups
.
import pandas as pd
import matplotlib.pyplot as plt
# set the Dates column as the index
df.set_index('Dates', inplace=True)
# get the df column name
a = df.columns
# create a list of column names in groups of 2
col_groups = [a[k:k n] for k in range(0, len(a), 2)]
# setup the figure
plt.figure(figsize=(8, 6))
# iterate through the groups
for y, x in col_groups:
# plot each group
plt.scatter(df[x], df[y], label=f'{y.split(" ")[0]}')
# add the legend
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# add labels
plt.ylabel('Returns')
plt.xlabel('Standard Deviation')
# add a grid
plt.grid()
# show the plot
plt.show()
Комментарии:
1. Большое вам спасибо, Трентон. Это идеально и эффективно. Определенно собираюсь использовать это.
2. @BilalAmiri Всегда пожалуйста. Я рад, что это сработало для вас.
Ответ №2:
Я нашел это решение, которое работает просто отлично, и я могу построить точечные графики доходности всех акций по сравнению со стандартным отклонением на одном графике:
fig, ax = plt.subplots()
ax.plot(Means['AAPL STD'], Means['AAPL Mean'], 'ob', label = 'AAPL')
ax.plot(Means['AMZN STD'], Means['AMZN Mean'], 'og', label = 'AMZN')
ax.plot(Means['GS STD'], Means['GS Mean'], 'oy', label = 'GS')
ax.plot(Means['SP500 STD'], Means['SP500 Mean'], 'ob', label ='SP500')
ax.plot(Means['Portfolio STD'], Means['Portfolio Mean'], 'or', label ='Portfolio')
plt.title('Matplot scatter plot')
plt.xlabel('Annualized Standard Deviation')
plt.ylabel('Annualized Returns')
leg = ax.legend()