目的分析

目的分析:

  1. 由于眼动程序生成的文件格式是tsv (tobii支持),为了excel处理方便
    在源代码中改成了xls,但excel不能正常打开,所以不能直接使用pandas。
    解决思路:通过with open打开,通过数据格式处理,转为pandas支持的数据框。
  2. 输出的眼动文件中,以屏幕中心为0点。但为了方便计算,需要改成以左上角为0点。
    解决思路:显示器分辨率为1920*1080,因此,x + 960, y + 540
  3. 在Event列,输出的眼动文件中,只在每一事件开始时的一行写triiger。为了后续
    分析方面,需要连续写入相同triiger,直到该事件结束。
    解决思路:
    1) 使用fillna(method=‘ffill’),以前一个trigger为准,填充空值
    2) 使用fillna(‘Event’)填充其他空值
  4. 原眼动文件中空值的标记方式是"np.nan",为了方便后续在matlab中计算眼动,需改成"-1"
    解决思路:在Event列处理完成后通过fillna(-1)实现
  5. 删除特定行,如Event1, Event’Event’等
    解决思路:获取特定行的index,使用tolist()转为列表,通过drop()删除
import os
import pandas as pd
import numpy as np
import logging"""
目的分析:
1. 由于眼动程序生成的文件格式是tsv (tobii支持),为了excel处理方便在源代码中改成了xls,但excel不能正常打开,所以不能直接使用pandas。解决思路:通过with open打开,通过数据格式处理,转为pandas支持的数据框。
2. 输出的眼动文件中,以屏幕中心为0点。但为了方便计算,需要改成以左上角为0点。解决思路:显示器分辨率为1920*1080,因此,x + 960, y + 540
3. 在Event列,输出的眼动文件中,只在每一事件开始时的一行写triiger。为了后续分析方面,需要连续写入相同triiger,直到该事件结束。解决思路:1) 使用fillna(method='ffill'),以前一个trigger为准,填充空值2) 使用fillna('Event')填充其他空值
4. 原眼动文件中空值的标记方式是"np.nan",为了方便后续在matlab中计算眼动,需改成"-1"解决思路:在Event列处理完成后通过fillna(-1)实现
5. 删除特定行,如Event==1, Event=='Event'等解决思路:获取特定行的index,使用tolist()转为列表,通过drop()删除
6. 将TimeStamp列时间递增。即第二个试次的开始时间为第一个试次的结束时间。
"""file_src = r'E:\expdata\exp1\formal\test'
output_src = r'E:\expdata\exp1\formal\eyemoveConvert'
os.chdir(file_src)
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s -  \%(levelname)s - %(message)s')def convert_to_pd(files):"""input-----用于将眼动文件转为pandas的DataFrame.:param file_list:待转换的眼动文件return------转换后的文件"""with open(files) as f:data = f.read().split('\n')[6:]columns = data[0].split('\t')data_list = [i.split('\t') for i in data]# 对df赋值df = pd.DataFrame(data_list[1:], columns=columns)# trial的计算:因为每个试次时分开写入,所以其中都会包含"TimeStamp"行# 以及"Session End"行# 因此,将"TimeStamp"和"Session End"中间的数据记为一个试次# 在新添trial列df['Trial'] = np.nan# 试次开始行index    time_loc = df['TimeStamp'].loc[df['TimeStamp'] == 'TimeStamp'].index# 试次结束行indexsessi_end = df['TimeStamp'].loc[df['TimeStamp'] == 'Session End'].index# 因为第一行数据是数据,所以插入0time_loc = time_loc.insert(0, 0)block_loc = list(zip(time_loc, sessi_end))n = 1for i in block_loc:df['Trial'].iloc[i[0]: i[1]] = nn = n + 1df = df.drop(df[(df.GazePointXLeft.isnull()) |(df.TimeStamp == 'TimeStamp') |(df.GazePointXLeft == '')].index.tolist())df_convert = df.loc[:, columns[0:11]].astype(float)df['Event'] = df['Event'].replace('', np.nan)df_convert['Event'] = df['Event'].astype(float)df_convert['Trial'] = df['Trial'].astype(float)return df_convertdef get_file_list(file_src):"""获取待处理的文件名称.:param files_src: 输入路径"""file_lists = []for foldername, subfolders, folders in os.walk(file_src):for i in folders:if i.endswith('xls'):file_lists.append(i)return file_listsdef data_process(df_convert):"""转为原点; 更改Event中trigger; 更改空值; 转换为连续时间:param df_convert:转换后的dataframe"""# 获取trialtrail_lists = df_convert['Trial'].unique()# 刚跟不同trial块填充试次    for i in trail_lists:df_convert['Event'].loc[df_convert['Trial'] == i] \= df_convert['Event'].loc[df_convert['Trial'] == i].fillna(method='ffill')# 删除不需要的行    df_convert['Event'] = df_convert['Event'].fillna('Event')df_convert = df_convert.drop(df_convert[df_convert.Event == 'Event'].index.tolist())df_convert = df_convert.drop(df_convert[(df_convert.Event == 1) | (df_convert.Event == 0) | (df_convert.TimeStamp < 0)].index.tolist())df_convert = df_convert.drop(df_convert[(df_convert.Event == 33330) | (df_convert.Event == 33331)| (df_convert.Event == 33332) | (df_convert.Event == 33333)].index.tolist())# 转为以左上角为0点    df_convert.loc[:, ['GazePointXLeft', 'GazePointXRight', 'GazePointX']] = df_convert.loc[:,['GazePointXLeft', 'GazePointXRight', 'GazePointX']] + 960df_convert.loc[:, ['GazePointYLeft', 'GazePointYRight', 'GazePointY']] = df_convert.loc[:,['GazePointYLeft', 'GazePointYRight', 'GazePointY']] + 540# 填充空值df_convert.fillna(-1, inplace=True)    # 重置indexdf_convert.reset_index(inplace=True, drop=True)# 获取新的trial(删除了填充试次)new_trial_lists = df_convert['Trial'].unique()# 根据试次累加时间for i in new_trial_lists[1:]:last_trial_index = df_convert['TimeStamp'].loc[df_convert['Trial'] == i].index[0]-1last_trial_endtime = df_convert['TimeStamp'].iloc[last_trial_index]df_convert['TimeStamp'].loc[df_convert['Trial'] == i] \= df_convert['TimeStamp'].loc[df_convert['Trial'] == i] + last_trial_endtimereturn df_convertdef main():file_lists = get_file_list(file_src)try:for i in file_lists:file_name = i.split('.')[0] + '_convert.xlsx'df_convert = convert_to_pd(i)df_out = data_process(df_convert)df_out.to_excel(output_src + os.sep + file_name, index=False)logging.debug(i.split('.')[0] + ' is converted!')except:logging.debug(i.split('.')[0] + ' has some problems!')if __name__ == '__main__':main()

使用python处理眼动数据相关推荐

  1. 眼动数据中的AOI是什么?

    关注"心仪脑"查看更多脑科学知识的分享. 我们在关注眼动数据分析时,经常能看到AOI一词.在今天的实验小知识里,我们将给大家解释什么是AOI及其分析指标. AOI被称作兴趣区,在我 ...

  2. 大话脑影像:你真的了解你的眼动数据吗!—数据清洗的“神秘”力量

    我从小就做眼动数据处理,,,, 统计检验是当前所有定量分析研究所必经的途径,尽管在今天我们已经有大量不同的统计方法来完成与我们的数据特征相符合的统计检验,但几乎所有的分析都建立在重要的基本假设之上.如 ...

  3. 眼动数据中瞳孔大小这个数据怎么用?

    关注"心仪脑"查看更多脑科学知识的分享. 瞳孔位于眼球内的角膜也晶状体之间,是由巩膜围成的一个孔隙.巩膜内由环形排列的瞳孔括约肌和散射状排列的瞳孔散大肌,两者分别控制瞳孔的缩小和扩 ...

  4. Ubuntu下使用眼动仪Tobii Eye Tracker 4C

    01 安装 & 使用 安装.使用过程参考:https://github.com/Eitol/tobii_eye_tracker_linux_installer 下面过程主要是github中自述 ...

  5. 眼动数据分析(基于EyeLink眼动仪数据)

    本文首发在个人博客上(7988888.xyz),此文章中所有链接均通过博客进行访问. 在EyeLink系列眼动仪中,我们在采集数据的过程中会得到格式为EDF(EyeLink Data File)的数据 ...

  6. 眼动和脑电多模态数据融合分析

    眼动和脑电多模态数据融合分析 本文参考网址:http://www2.hu-berlin.de/eyetracking-eeg/tutorial.html 本文首发在个人博客(7988888.xyz) ...

  7. 眼动数据分析基础_数据和指标的导出

    在Tobii Pro Lab中计算和导出眼动指标 了解如何在Pro Lab中计算和导出AOI和基于事件的指标 建立成功的眼动追踪研究的关键因素是能够为您的研究问题定义和计算适当的度量. 除了选择正确的 ...

  8. matlab 处理眼动仪数据总结(一) :数据读取

    matlab 处理眼动仪数据总结(一) :数据读取 因为虚拟现实技术的不断提高,其独有的安全性和有效性,使得其在市场调研.医疗康复.教育等领域开始被普遍使用,同时也开始被多数高校的运动实验室所采用的. ...

  9. matlab 处理眼动仪数据总结(一) :数据读取

        由于虚拟现实技术的不断提升,其独有的安全性和有效性,使得其在市场调研.医疗康复.教育等领域开始被广泛使用,同时也开始被多数高校的运动实验室所采用的.现在主流的眼动仪是tobii和vive两大公 ...

最新文章

  1. OpenFace学习(2):FaceNet+SVM匹配人脸
  2. 互为质数的勾股数c语言,c语言 寻求勾股数满足x2+y2=z2的正整数x,y和z称为一组勾股数(pythagorean...
  3. 26.删除排序数组中的重复项
  4. Android应用程序打包时,出现错误:XXX is not translated in af (Afrikaans), am (Amharic), ar (Arabic).....(...
  5. 云linux搭建 arm开发,arm集成开发环境搭建
  6. 云计算不可及?私有云对IT架构三大影响
  7. win安装soapui
  8. 莫兰迪紫rgb_莫兰迪rgb参数_译述北京 | RGB的前世今生
  9. 美团斗鱼百度笔试概录
  10. 利用rpm命令安装软件
  11. 下一代Windows命名为Win 11?微软的下一步要来了
  12. 具体怎么使用视频播放屏幕的感重力切换横竖屏
  13. 计算机毕业设计 在线免费小说微信小程序(源码+论文)
  14. redis的hash与string区别
  15. Lambda使用指北(上)
  16. 西门子S7-1200 作MODBUS TCP客户端配置方法补充
  17. element-ui 表单校验,el-select校验失效问题
  18. 深入浅出零知识证明(一):Schnorr协议
  19. python自动注册邮箱_python2+selenium+mail,自动登录126邮箱
  20. 1663 例题1 取石子游戏1(LOJ10241) 巴什博弈 Bash game

热门文章

  1. android和harmonyos对比,HarmonyOS和Android深度对比
  2. CSS3实现图片超立体3D效果
  3. Thinkpad X220更换无线网卡 - Intel 6300 AGN对比测试(Wifi 无线信号测试)
  4. 商业邮箱申请方法及建议
  5. Linux C++ TCP编程
  6. 命令行下打开文件管理器
  7. JavaWeb入门学习
  8. html怎么做左侧广告,利用DIV+CSS制作浮动广告
  9. 百度世界2021:李彦宏带你看AI如何开启美好生活
  10. 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)