循环创建图形

时间:2017-05-02 19:52:38

标签: python loops pandas graphing

我正在寻求一些关于如何最好地自动化循环以创建由dict进行的一些计算的图形可视化的指导。

我将以下代码拼凑在一起以创建单个图形,但需要生成许多相似的图形(使用不同的变量),而不是多次输出每个变量(将有100个变量)。

对于单个图,我有以下代码(见下文),其中Calclist是一个字典,而variable1是该字典中的特定列:

 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)

到目前为止,非常好 - 这就是代码将产生的内容:

Single iteration

我真正想做的是迭代变量1(变量2,变量3,......)。

我尝试了几件事,并且认为我已经接近但可能缺少一些基本的东西。

具体来说,我尝试使用"参数"嵌套另一个迭代系列的循环,它包含我对可视化感兴趣的变量名称:

 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 :(得分:0)

你不能以这种方式迭代大熊猫系列。 试试

for j in ["variable1","variable2"]:

或其中的一些变体

编辑:或查找如何迭代大熊猫系列 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.iteritems.html

答案 1 :(得分:0)

您的错误消息是由初始化Parameters

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

您必须将数组,字典或标量值传递给pd.Series。此外,迭代Parameters将返回其值。最后,您应该为每个Sets初始化parameter

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)