2017-05-02 13 views
1

dict에서 만든 일부 계산의 그래픽 시각화를 생성하는 루프를 가장 잘 자동화하는 방법에 대한 지침을 찾고 있습니다.그래프 생성을위한 루핑

하나의 그래프를 만들기 위해 다음 코드를 조합했지만 다른 변수를 사용하여 많은 유사한 그래프를 생성해야하며 각 변수를 여러 번 입력하지 않아야합니다 (100 초의 변수가 있음). 이것은 무엇이다 -

가 지금까지 너무 좋아
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

Sets = {} 
labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100'] 
blocks = [-1,5,25,50,75,100] 

for i in Calclist: 

    out = pd.cut(Calclist[i]['variable1'], bins = blocks) 
    Sets[i] = (pd.value_counts(out)/Calclist[i]['variable1'].count())*100 

df = pd.DataFrame(Sets) 
df.reset_index(level=0, inplace=True) 
df.rename(index = str, columns = {'index':'blocks'}, inplace=True) 

ax = df.plot.bar(title='One iteration - works well') 
ax.set_xlabel("x-axis label") 
ax.set_ylabel("y-axis label") 
ax.set_xticklabels(labels, rotation=45) 

: 하나의 그래프에 대한

, 나는 Calclist가 딕셔너리입니다 (아래 참조) 변수 1가 딕셔너리 내의 특정 열입니다 코드를 다음 한 코드가 생성됩니다

Single iteration

는 내가 정말하고 싶은 것은 (변수 2, variable3, .....에) 변수 1을 반복합니다.

나는 몇 가지 시도를 해봤지만, 내가 가깝다고 생각하지만 근본적인 무언가를 놓치고 있다고 생각합니다.

특히, 나는 또 다른 루프를 중첩 시도하는 내가 시각화에 관심 변수 이름을 가지고 "매개 변수"를 사용하여 일련의 이상 반복 :

Sets = {} 
labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100']  
blocks = [-1,5,25,50,75,100]         

Parameter = pd.Series("variable1","variable2") 

for j in Parameter: 

    for i in Calclist: 

     out = pd.cut(Calclist[i][Parameter[j]], bins = blocks) 
     Sets[i] = (pd.value_counts(out)/Calclist[i] 
     [Parameter[j]].count())*100 

그러나 나는 다음과 같은 오류가 발생합니다 :

TypeError: Index(...) must be called with a collection of some kind, 
'powertotal_total' was passed 

모든 제안 사항에 크게 감사드립니다.

+2

코드가 ... 정말 재현 할되지 않는다는 것 도움이 될 것입니다. –

답변

0

귀하의 오류 메시지가 당신이 Parameters를 초기화하는 방식으로 인해 발생하는 팬더 시리즈를 반복하는 방법을 찾아 볼 :

parameter = pd.Series('variable1', 'variable2') 
... 
TypeError: Index(...) must be called with a collection of some kind, 
'variable2' was passed 

배열 형식, 스칼라 값 ~ pd.Series. 또한 Parameters을 반복하면 해당 값이 반환됩니다. 마지막으로, 각 parameter에 대한 Sets를 초기화해야한다 : 당신이 Calclist``예를 들어 데이터를 제공하지 않기 때문에 당신이 더미`Calclist`와 코드를 업데이트 할 수 있다면

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

labels = ['0 - 5','5 - 25','25 - 50','50 - 75','75 - 100'] 
blocks = [-1,5,25,50,75,100] 

Parameters = pd.Series(['variable1', 'variable2']) 

for parameter in Parameters: 
    Sets = {} 
    for i in Calclist: 
     out = pd.cut(Calclist[i][parameter], bins = blocks) 
     Sets[i] = (pd.value_counts(out)/Calclist[i][parameter].count())*100 

    df = pd.DataFrame(Sets) 
    df.reset_index(level=0, inplace=True) 
    df.rename(index=str, columns={'index': 'blocks'}, inplace=True) 

    ax = df.plot.bar(title=parameter) 
    ax.set_xlabel("x-axis label") 
    ax.set_ylabel("y-axis label") 
    ax.set_xticklabels(labels, rotation=45) 
+0

이것은 특히 백 ​​클립을 통해 Calclist 루프에서 플롯을 제거한 경우 완벽하게 작동했습니다. 이 코드에 대한 도움과 pd.Series에 대한 교육에 감사드립니다. – Newstudent14

+0

플로팅이 Calclist 루프 외부에 있도록 코드를 변경했습니다. –