Как отобразить несколько парных столбцов фрейма данных на диаграмме рассеяния?

#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()