循环创建图形
Looping for creating graphs
我正在寻求一些指导,以了解如何最好地自动化循环以创建一些从 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)
到目前为止一切顺利 - 这就是代码将产生的结果:
我真正想做的是遍历 variable1(到 variable2,variable3,.....)。
我已经尝试了几件事,我认为我很接近,但可能遗漏了一些基本的东西。
具体来说,我尝试嵌套另一个循环,该循环使用 "Parameter" 迭代一个系列,其中包含我感兴趣的可视化变量名称:
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
非常感谢任何和所有建议。
您不能以这种方式遍历 pandas 系列。
尝试
for j in ["variable1","variable2"]:
或它的一些变体
编辑:或查看如何遍历 pandas 系列
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.iteritems.html
您的错误消息是由您初始化的方式引起的 Parameters
:
parameter = pd.Series('variable1', 'variable2')
...
TypeError: Index(...) must be called with a collection of some kind,
'variable2' was passed
您必须将类数组、字典或标量值传递给pd.Series
。此外,迭代 Parameters
将 return 它的值。最后,您应该为每个 parameter
:
初始化 Sets
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)
我正在寻求一些指导,以了解如何最好地自动化循环以创建一些从 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)
到目前为止一切顺利 - 这就是代码将产生的结果:
我真正想做的是遍历 variable1(到 variable2,variable3,.....)。
我已经尝试了几件事,我认为我很接近,但可能遗漏了一些基本的东西。
具体来说,我尝试嵌套另一个循环,该循环使用 "Parameter" 迭代一个系列,其中包含我感兴趣的可视化变量名称:
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
非常感谢任何和所有建议。
您不能以这种方式遍历 pandas 系列。 尝试
for j in ["variable1","variable2"]:
或它的一些变体
编辑:或查看如何遍历 pandas 系列 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.iteritems.html
您的错误消息是由您初始化的方式引起的 Parameters
:
parameter = pd.Series('variable1', 'variable2')
...
TypeError: Index(...) must be called with a collection of some kind,
'variable2' was passed
您必须将类数组、字典或标量值传递给pd.Series
。此外,迭代 Parameters
将 return 它的值。最后,您应该为每个 parameter
:
Sets
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)