回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图从使用Python的不同时间更改状态的函数中求和(并绘制)总数熊猫.DataFrame. 例如:</p>
<p>假设我们有3个人,他们的状态可以是a)什么都不拿,b)拿着5磅的重量,c)拿着10磅的重量。随着时间的推移,这些人拿起重物放下。我想画出总重量。因此,考虑到:</p>
<p>我的暴力赎罪尝试:</p>
<pre><code>import pandas as ps
import math
import numpy as np
person1=[3,0,10,10,10,10,10]
person2=[4,0,20,20,25,25,40]
person3=[5,0,5,5,15,15,40]
allPeopleDf=ps.DataFrame(np.array(zip(person1,person2,person3)).T)
allPeopleDf.columns=['count','start1', 'end1', 'start2', 'end2', 'start3','end3']
allPeopleDfNoCount=allPeopleDf[['start1', 'end1', 'start2', 'end2', 'start3','end3']]
uniqueTimes=sorted(ps.unique(allPeopleDfNoCount.values.ravel()))
possibleStates=[-1,0,1,2] #extra state 0 for initialization
stateData={}
comboStates={}
#initialize dict to add up all of the stateData
for time in uniqueTimes:
comboStates[time]=0.0
allPeopleDf['track']=-1
allPeopleDf['status']=-1
numberState=len(possibleStates)
starti=-1
endi=0
startState=0
for i in range(3):
starti=starti+2
print starti
endi=endi+2
for time in uniqueTimes:
def helper(row):
start=row[starti]
end=row[endi]
track=row[7]
if start <= time and time < end:
return possibleStates[i+1]
else:
return possibleStates[0]
def trackHelp(row):
status=row[8]
track=row[7]
if track<=status:
return status
else:
return track
def Multiplier(row):
x=row[8]
if x==0:
return 0.0*row[0]
if x==1:
return 5.0*row[0]
if x==2:
return 10.0*row[0]
if x==-1:#numeric place holder for non-contributing
return 0.0*row[0]
allPeopleDf['status']=allPeopleDf.apply(helper,axis=1)
allPeopleDf['track']=allPeopleDf.apply(trackHelp,axis=1)
stateData[time]=allPeopleDf.apply(Multiplier,axis=1).sum()
for k,v in stateData.iteritems():
comboStates[k]=comboStates.get(k,0)+v
print allPeopleDf
print stateData
print comboStates
</code></pre>
<p>随着时间的推移,重量图可能如下所示:</p>
<p><img src="https://i.stack.imgur.com/aTaiV.jpg" alt="enter image description here"/></p>
<p>强度随时间的总和可能看起来像下面的黑线:</p>
<p><img src="https://i.stack.imgur.com/clH5T.jpg" alt="enter image description here"/></p>
<p>用笛卡尔点定义黑线:(0,0磅),(5,0磅),(5,5磅),(15,5磅),(15,10磅),(20,10磅),(20,15磅),(25,15磅),(25,20磅),(40,20磅)。但是,我很灵活,不一定需要将组合强度线定义为一组笛卡尔点。独特的时间可以通过以下方式找到:
打印列表(set(uniqueTimes).intersection(allnocount[<a href="https://i.stack.imgur.com/aTaiV.jpg" rel="nofollow noreferrer">1</a>])。值.ravel())。排序()
,但我无法想出一个巧妙的方法来获得相应的强度值。在</p>
<p>一开始我用了一个非常难看的函数来分解每个“人”的图,这样所有人都可以同时拥有开始和停止时间(尽管很多停止和开始时间没有状态变化),然后我就可以把所有的时间“块”加起来。这很麻烦;必须有一个圆滑的熊猫处理方式。如果有人能给我一个建议,或者给我指出我可能错过的另一个建议,我将非常感谢你的帮助!在</p>
<p>如果我的简单例子不清楚,另一个例子可能是绘制钢琴声音的强度:有许多音符在不同的持续时间和不同的强度下演奏。我想要的强度总和从钢琴随着时间的推移。虽然我的例子过于简单,但我需要一个更像钢琴曲的解决方案:每个键有数千个离散的强度级,并且在一首歌的整个过程中有许多键起作用。在</p>
<p><strong><em>编辑——mgab提供的解决方案的实现:</em></strong></p>
^{pr2}$
<p>TypeError:不支持-:“str”和“int”的操作数类型</p>
<p><strong><em>结束编辑</em></strong></p>