<p>以钢琴键为例,假设你有三个键,有30个强度级别。在</p>
<p>我会尽量以这种格式保存数据:</p>
<pre><code>import pandas as pd
df = pd.DataFrame([[10,'A',5],
[10,'B',7],
[13,'C',10],
[15,'A',15],
[20,'A',7],
[23,'C',0]], columns=["time", "key", "intensity"])
time key intensity
0 10 A 5
1 10 B 7
2 13 C 10
3 15 A 15
4 20 A 7
5 23 C 0
</code></pre>
<p>在那里你可以记录任何一个键的强度变化。从这里您已经可以得到每个键的笛卡尔坐标,作为<code>(time,intensity)</code>对</p>
^{pr2}$
<p>然后,您可以轻松地创建一个新列<code>increment</code>,它将指示该关键点在该时间点发生的强度变化(<code>intensity</code>仅表示强度的新值)</p>
<pre><code>df["increment"]=df.groupby("key")["intensity"].transform(
lambda x: x.sub(x.shift(), fill_value= 0 ))
df
time key intensity increment
0 10 A 5 5
1 10 B 7 7
2 13 C 10 10
3 15 A 15 10
4 20 A 7 -8
5 23 C 0 -10
</code></pre>
<p>然后,使用这个新列,可以生成<code>(time, total_intensity)</code>对作为笛卡尔坐标</p>
<pre><code>df.groupby("time").sum()["increment"].cumsum()
time
10 12
13 22
15 32
20 24
23 14
dtype: int64
</code></pre>
<h2>编辑:应用所讨论的特定数据</h2>
<p>假设数据是一个值列表,从元素id(person/piano key)开始,然后是一个因子乘以该元素的测量权重/强度,然后是一对时间值,指示一系列已知状态的开始和结束(负重/发射强度)。<strong>不确定数据格式是否正确</strong>。从你的问题来看:</p>
<pre><code>data1=['person1',3,0.0,10.0,10.0,10.0,10.0,10.0]
data2=['person2',4,0,20,20,25,25,40]
data3=['person3',5,0,5,5,15,15,40]
</code></pre>
<p>如果我们知道每个状态的重量/强度,我们可以定义:</p>
<pre><code>known_states = [5, 10, 15]
DF_columns = ["time", "id", "intensity"]
</code></pre>
<p>然后,我想到的加载数据的最简单方法包括以下函数:</p>
<pre><code>import pandas as pd
def read_data(data, states, columns):
id = data[0]
factor = data[1]
reshaped_data = []
for i in xrange(len(states)):
j += 2+2*i
if not data[j] == data[j+1]:
reshaped_data.append([data[j], id, factor*states[i]])
reshaped_data.append([data[j+1], id, -1*factor*states[i]])
return pd.DataFrame(reshaped_data, columns=columns)
</code></pre>
<p>请注意,<code>if not data[j] == data[j+1]:</code>避免在给定状态的<em>start</em>和<em>end</em>的时间相等时将数据加载到dataframe中(看起来不具信息性,而且无论如何不会出现在图中)。但如果你还想要这些条目,就把它拿出来。在</p>
<p>然后,加载数据:</p>
<pre><code>df = read_data(data1, known_states, DF_columns)
df = df.append(read_data(data2, known_states, DF_columns), ignore_index=True)
df = df.append(read_data(data3, known_states, DF_columns), ignore_index=True)
# and so on...
</code></pre>
<p>然后你就在这个答案的开头了(当然,用id和id代替key)</p>