Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用时间序列编码变量_Python_Numpy_Pandas_Time Series - Fatal编程技术网

Python 用时间序列编码变量

Python 用时间序列编码变量,python,numpy,pandas,time-series,Python,Numpy,Pandas,Time Series,作为我在一次实验中苦苦挣扎的一件事情的后续,我一直在分析一些相当复杂的行为数据,这些数据来自于对大熊猫的老鼠追踪实验 我的数据的相关子集如下所示: data.iloc[0] time_stamp 21/11/2013 13:06 subject 1276270 trial

作为我在一次实验中苦苦挣扎的一件事情的后续,我一直在分析一些相当复杂的行为数据,这些数据来自于对大熊猫的老鼠追踪实验

我的数据的相关子集如下所示:

data.iloc[0]

time_stamp                                     21/11/2013 13:06
subject                                                 1276270
trial                                                         0
stimuli                                                      14
resp                                                          2
rt                                                         1145
x             [-0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0....
y             [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
t             [1, 26, 26, 35, 45, 55, 65, 75, 85, 95, 105, 1...
Name: 0, dtype: object
其中,
x
y
t
是鼠标坐标和时间戳的1D numpy数组

我想利用Pandas的大量时间序列数据资源,将这些坐标转换为
TimeSeries
对象并进行分析。我可以将它们转换为
TimeSeries
对象(
rx
ry
),每个对象都具有通过将时间戳插入20毫秒间隔而生成的索引

data.rx.iloc[0]

0     -0
20     0
40     0
60     0
80     0
100    0
120    0
140    0
160    0
180    0
200    0
220    0
240    0
260    0
280    0
...
2720    1
2740    1
2760    1
2780    1
2800    1
2820    1
2840    1
2860    1
2880    1
2900    1
2920    1
2940    1
2960    1
2980    1
3000    1
Length: 151, dtype: float64
然而,这种方法,在
数据帧的每一行嵌套2个
时间序列
,显然不是惯用的方法(请参阅);尽管我已经能够用它做很多事情,但我觉得我正在与熊猫对抗,并使我的生活变得困难

我认为,正确的方法是将
rx
ry
存储为独立的数据结构,或者将302列添加到我现有的
数据中,在
rx
ry
中的每个时间步都有一列

第一种方法的问题是我无法访问我的分类数据(即
主题
刺激
,以及
resp
列,以及我在这里遗漏的其他列),而第二种方法的问题是我最终得到了一个
数据框
数千列宽(对于我应用的每个变换,范围也更广:每一步的速度、每一步的角度等等),并且没有访问特定时间序列的有用方法(即,我当前调用的
data.rx.mean().plot()

所有这些都只是我问题的序言,我的问题是:

Pandas或任何其他python库是否提供了一种处理大量时间序列数据的方法,同时保留了它们附带的编码数据?

谢谢


Eoin

有人通过电子邮件问我是否找到了解决我想在这里做什么的方法,因此我将分享我迄今为止所做的事情。这可能不是使用
pandas
的标准方式,但对我来说已经足够了

简言之,我已经将数据拆分为几个数据帧。 第一个,
data
,如上所述,但我只使用对应于单个值的列,如
trial
stimulus
resp
rt

对于我的时间序列数据,我使用了两个额外的数据帧,一个用于x坐标数据,一个用于y坐标数据。虽然可能有一种更优雅的方法来生成这些数据帧,但我的代码执行以下操作

data.iloc[0]

    time_stamp                                     21/11/2013 13:06
    subject                                                 1276270
    trial                                                         0
    stimuli                                                      14
    resp                                                          2
    rt                                                         1145
    x             [-0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0....
    y             [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
    t             [1, 26, 26, 35, 45, 55, 65, 75, 85, 95, 105, 1...
    Name: 0, dtype: object

data['nx'], data['ny'] = zip(*
     [even_time_steps(x, y, t)
     for x, y, t, in zip(data.x, data.y, data.t)])
     # Using function even_time_steps from package squeak
     # https://github.com/EoinTravers/Squeak 
     # Simpler applications could use
     # data['nx'] = [pd.TimeSeries(x) for y in data['x']]
     # data['ny'] = [pd.TimeSeries(x) for y in data['y']]

# Seperate DataFrames
nx = pd.concat(list(data.nx), axis=1).T
ny = pd.concat(list(data.ny), axis=1).T

# Remove redundant columns
redundant = ['nx', 'ny', 'x', 'y'] # etc...
data = data.drop(redundant, axis=1)

# Important - reindex data
data.index = range(len(data)) # 0, 1, 2, ..., len(data)
现在
data
包含我的所有编码信息,
nx
我的所有x坐标信息,以及
ny
我的y坐标信息

nx.head()

       0    1    2    3    4    5    6    7    8        9     ...          91
    0    0    0    0    0    0    0    0    0    0  0.00000   ...     0.953960   
    1    0    0    0    0    0    0    0    0    0  0.00099   ...     1.000000   
    2    0    0    0    0    0    0    0    0    0  0.00000   ...     1.010000   
    3    0    0    0    0    0    0    0    0    0  0.00000   ...     0.870396   
    4    0    0    0    0    0    0    0    0    0  0.00000   ...     1.000000   

             92        93        94       95        96   97   98   99   100  
    0  0.993564  1.000000  1.000000  1.00000  1.000000    1    1    1    1  
    1  1.000000  1.000000  1.000000  1.00000  1.000000    1    1    1    1  
    2  1.010000  1.008812  1.003960  1.00000  1.000000    1    1    1    1  
    3  0.906238  0.936931  0.973564  0.98604  0.993366    1    1    1    1  
    4  1.000000  1.000000  1.000000  1.00000  1.000000    1    1    1    1  

    [5 rows x 101 columns]
最后,为了选择
x
y
数据的特定子集,根据
data
中存储的编码变量,我只取相关数据子集的
索引

subject1_index = data[data.subject==1].index
print subject1_index

    Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
    18, 19, 20,  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
    36, 37, 38, 39], dtype='int64')
并使用
iloc
方法选择
nx
ny
的匹配子集

sub1_x = nx.iloc[subject1_index]
sub1_y = ny.iloc[subject1_index]
for i in subject1_index:
    plt.plot(nx.iloc[i], ny.iloc[i], 'r', alpha=.3)
plt.plot(sub1_x.mean(), sub1_y.mean(), 'r', linewidth=2)


编辑:为了完整起见,请注意,我的许多分析需要很长的时间 格式化数据(并在R中执行)。同样,可能会有更优雅的 这样做的方法(所以使用时要自担风险!),但我的代码是这样的(注意,这是真正的代码,来自不同的数据集, 我还没有费心修改变量名以匹配原始示例):

# Long format data
wide_data = data.copy()
steps = nx.columns
for i in steps:
    wide_data['nx_%i' % i] = nx[i]
    wide_data['ny_%i' % i] = ny[i]

id_vars = ['subject_nr', 'condition', 'count_trial_sequence',
    'trial_id', 'choice', 'accuracy']

# Long data with 'nx' as the variable
long_data = pd.melt(wide_data, id_vars=id_vars, value_vars = ['nx_%i' % i for i in steps])
long_data['step'] = long_data.variable.map(lambda s: int(s[3:]))
long_data['nx'] = long_data.value

# Same with 'ny'
tmp_long = pd.melt(wide_data, id_vars=id_vars, value_vars = ['ny_%i' % i for i in steps])
# Combine in single data frame
long_data['ny'] = tmp_long['value']
del tmp_long

long_data = long_data.drop(['variable', 'value'], axis=1)
long_data.to_csv(os.path.join('data', 'long_data.csv'))

long_data.head()
Out[41]: 
       subject_nr      condition  count_trial_sequence  trial_id choice accuracy  
    0   505250022              A                     0        13   rsp1     True   
    1   505250022              A                     1        16   rsp1     True   
    2   505250022              B                     2         2   rsp2    False   
    3   505250022              B                     3         0   rsp1    False   
    4   505250022              C                     4        33   rsp2    False   

       step  nx  ny  
    0     0   0   0  
    1     0   0   0  
    2     0   0   0  
    3     0   0   0  
    4     0   0   0