2017-04-11 43 views
5

Mam dane, które odczytuję z arkusza kalkulacyjnego Excel. Dane mają szereg obserwacji dla każdego z sześciu scenariuszy, od S1 do S6. Kiedy czytam w danych do mojego dataframe df, wygląda następująco:Panda danych procesowych na skrzypce

 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 

Chcę stworzyć violinplot że ma inny skrzypcach dla każdej z sześciu scenariuszy. Jestem nowy w Pandach i modelach danych, i pomimo wielu badań/testów przeprowadzonych w ciągu ostatniego dnia, nie jestem w stanie wymyślić eleganckiego sposobu przekazania referencji do mojej ramki danych (aby podzielić ją na różne serie dla każdego scenariusza), które będą działać w instrukcji axes.violinplot(). Na przykład wypróbowałem następujące, które nie działa. Dostaję "ValueError: nie mogę skopiować sekwencji o rozmiarze 1752 do osi tablicy z wymiarem 2" w mojej instrukcji 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() 
+0

@ImportanceOfBeingErnest Ach, używałem minus kiedy próbuje to (jako proof of concept) z cała kolumna danych nieparametrycznych (df.iloc [:, 1]). W końcu muszę sprawić, by wartości danych były całkowicie przeciwne do tego, czym są, ale mogę to później rozwiązać. Na razie. Nadal dostaję nowy błąd, ale zaktualizuję wpis, aby to odzwierciedlić. Usuwam także pozycję, ponieważ domyślnie powinno to być w porządku. –

Odpowiedz

4

Trzeba być ostrożnym, jak utworzyć zestaw danych do wykresu. W kodzie z pytaniem masz listę list jednej ramki danych. Jednak potrzebujesz po prostu listy jednokolumnowych ramek danych.

W związku z tym należy również pobrać tylko kolumnę "LMP" z filtrowanych ramek danych, w przeciwnym razie na instrumencie nie będzie wiadomo, którą kolumnę wydrukować.

Oto przykład pracy, która pozostaje blisko do oryginalnego kodu:

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

enter image description here

6

Możesz używać seaborn. W takim przypadku importuj seaborn, a następnie użyj violin plot, aby wizualizować scenariusze.

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

enter image description here