Обрабатывать данные панды в скрипке
У меня есть данные, которые я читаю из таблицы Excel. Данные имеют ряд наблюдений для каждого из шести сценариев, от S1 до S6. Когда я читаю данные в моем dataframe df, это выглядит следующим образом:
Scenario LMP
0 S1 -21.454544
1 S1 -20.778094
2 S1 -20.027689
3 S1 -19.747170
4 S1 -20.814405
5 S1 -21.955406
6 S1 -23.018960
...
12258 S6 -34.089906
12259 S6 -34.222814
12260 S6 -26.712010
12261 S6 -24.555973
12262 S6 -23.062616
12263 S6 -20.488411
Я хочу создать скрипичный сюжет, в котором есть скрипка для каждого из шести сценариев. Я новичок в Pandas и фреймах данных, и, несмотря на большое количество исследований / тестирований за последний день, я не могу найти элегантный способ передать некоторые ссылки на мой фрейм данных (разделить их на разные серии для каждого сценария).), который будет работать в операторе axes.violinplot(). Например, я попробовал следующее, которое не работает. Я получаю "ValueError: не могу скопировать последовательность с размером 1752 на ось массива с измерением 2" в моем операторе axes.violinplot.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
axes.violinplot(dataset = [[df.loc[df.Scenario == 'S1']],
[df.loc[df.Scenario == 'S2']],
[df.loc[df.Scenario == 'S3']],
[df.loc[df.Scenario == 'S4']],
[df.loc[df.Scenario == 'S5']],
[df.loc[df.Scenario == 'S6']]
]
)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
2 ответа
Вы должны быть осторожны, как создать набор данных для построения графика. В коде из вопроса у вас есть список списков одного фрейма данных. Однако вам нужен просто список из одной колонки данных.
Поэтому вам также нужно будет взять только столбец "LMP" из отфильтрованных кадров данных, иначе график скрипки не будет знать, какой столбец построить.
Вот рабочий пример, который остается близким к исходному коду:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = np.random.poisson(lam =3, size=100)
y = np.random.choice(["S{}".format(i+1) for i in range(6)], size=len(x))
df = pd.DataFrame({"Scenario":y, "LMP":x})
fig, axes = plt.subplots()
axes.violinplot(dataset = [df[df.Scenario == 'S1']["LMP"],
df[df.Scenario == 'S2']["LMP"],
df[df.Scenario == 'S3']["LMP"],
df[df.Scenario == 'S4']["LMP"],
df[df.Scenario == 'S5']["LMP"],
df[df.Scenario == 'S6']["LMP"] ] )
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()
Вы можете использовать морского рожка. В этом случае импортируйте seaborn, а затем используйте скрипичный сюжет для визуализации сценариев.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# load data into a dataframe
df = pd.read_excel('Modeling analysis charts.xlsx',
sheetname='lmps',
parse_cols=[7,12],
skiprows=0,
header=1)
fontsize = 10
fig, axes = plt.subplots()
# plot violin. 'Scenario' is according to x axis,
# 'LMP' is y axis, data is your dataframe. ax - is axes instance
sns.violinplot('Scenario','LMP', data=df, ax = axes)
axes.set_title('Day Ahead Market')
axes.yaxis.grid(True)
axes.set_xlabel('Scenario')
axes.set_ylabel('LMP ($/MWh)')
plt.show()