如何重塑多个时间序列信号以与sns.tsplot一起使用?

时间:2016-04-14 05:33:45

标签: python numpy pandas reshape seaborn

我试图重新塑造看起来像这样的数据:

    t  trial signal  value
 0  0  0     y       -1
 1  0  1     y        0
 2  0  2     y        1
 3  1  0     y        0
 4  1  1     y        1
 5  1  2     y        2
 6  2  0     y        1
 7  2  1     y        2
 8  2  2     y        3
 9  3  0     y        2
10  3  1     y        3
11  3  2     y        4
12  4  0     y        3
13  4  1     y        4
14  4  2     y        5

这样的事情:

sns.tsplot

以便我可以将其提供给import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns fig = plt.figure() num_points = 5 # Create some dummy line signals and assemble a data frame t = np.arange(num_points) y0 = t - 1 y1 = t y2 = t + 1 df = pd.DataFrame(np.vstack((t, y0, y1, y2)).transpose(), columns=['t', 'y0', 'y1', 'y2']) print(df) # Do some magic transformations df = pd.melt(df, id_vars=['t']) print(df) # Plot the time-series data sns.tsplot(time="t", value="value", unit="trial", condition="signal", data=df, ci=[68, 95]) plt.savefig("dummy.png") plt.close()

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>



    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"/>
</android.support.v4.widget.DrawerLayout>

我希望为这些行实现这个目标:

following source code

enter image description here https://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.tsplot.html

1 个答案:

答案 0 :(得分:1)

我认为您可以使用melt进行重塑,通过indexing with str获取第一个和第二个字符,并使用重新排序列获取sort_values

df1 = pd.melt(df, id_vars=['t'])
#create helper Series
variable = df1['variable']
#extract second char, convert to int
df1['trial'] = variable.str[1].astype(int)
#extract first char
df1['signal'] = variable.str[0]
#sort values by column t, reset index
df1 = df1.sort_values('t').reset_index(drop=True)
#reorder columns
df1 = df1[['t','trial','signal','value']]
print df1
    t trial signal  value
0   0     0      y     -1
1   0     1      y      0
2   0     2      y      1
3   1     0      y      0
4   1     1      y      1
5   1     2      y      2
6   2     0      y      1
7   2     1      y      2
8   2     2      y      3
9   3     0      y      2
10  3     1      y      3
11  3     2      y      4
12  4     0      y      3
13  4     1      y      4
14  4     2      y      5

另一种解决方案,如果列signal中的所有值都只是y

#remove y from column name, first value of column names is same
df.columns = df.columns[:1].tolist() + [int(col[1]) for col in df.columns[1:]]
print df
   t  0  1  2
0  0 -1  0  1
1  1  0  1  2
2  2  1  2  3
3  3  2  3  4
4  4  3  4  5

df1 = pd.melt(df, id_vars=['t'], var_name=['trial'])
#all values in column signal are y
df1['signal'] = 't'
#sort values by column t, reset index
df1 = df1.sort_values('t').reset_index(drop=True)
#reorder columns
df1 = df1[['t','trial','signal','value']]
print df1
    t trial signal  value
0   0     0      t     -1
1   0     1      t      0
2   0     2      t      1
3   1     0      t      0
4   1     1      t      1
5   1     2      t      2
6   2     0      t      1
7   2     1      t      2
8   2     2      t      3
9   3     0      t      2
10  3     1      t      3
11  3     2      t      4
12  4     0      t      3
13  4     1      t      4
14  4     2      t      5