前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >day100-Exception继承定义错误信息&结算接口&结算数据结构

day100-Exception继承定义错误信息&结算接口&结算数据结构

原创
作者头像
少年包青菜
修改于 2020-03-30 07:29:33
修改于 2020-03-30 07:29:33
71600
代码可运行
举报
文章被收录于专栏:Python 学习Python 学习
运行总次数:0
代码可运行

1.Exception的继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 自定义继承类继承 Exception
class MyException(Exception):
    def __init__(self, code, msg):
        self.code = code
        self.msg = msg


# 自定义相应信息
class BaseResponse:
    def __init__(self):
        self.code = ''
        self.error = ''
        self.msg = ''

    @property
    def dict(self):
        return self.__dict__


# 实例化响应对象
my_res = BaseResponse()
try:
    if not 1:
        raise MyException(1000, 'test_my_exception')
    """其他代码"""
    """ll = int(s)"""
    """其他代码"""
    
# 这个对应的是 MyException 的错误
except MyException as e:
    my_res.code = e.code
    my_res.msg = e.msg
    
# 这个对应的是 try 对应的其他代码的未知错误
except Exception as e:
    my_res.msg = str(e)

print(my_res.dict)

2.接口

2.1models的代码,新加了 Coupon 和 CouponRecord

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models
from django.contrib.contenttypes.fields import GenericRelation, GenericForeignKey
from django.contrib.contenttypes.models import ContentType

# Create your models here.
__all__ = ["Category", "Course", "CourseDetail", "Teacher",
           "DegreeCourse", "CourseChapter",
           "CourseSection", "PricePolicy",
           "OftenAskedQuestion", "Comment",
           "Account", "CourseOutline",
           "Coupon", "CouponRecord"]


# 首先上面有课程分类
class Category(models.Model):
    """课程分类表"""
    title = models.CharField(max_length=32, unique=True, verbose_name="课程的分类")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "01-课程分类表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 每一条课程分类下面有课程
class Course(models.Model):
    """课程表"""
    title = models.CharField(max_length=128, unique=True, verbose_name="课程的名称")

    course_img = models.ImageField(upload_to="course/%Y-%m", verbose_name='课程的图片')
    # media/course/2018-11/xxx.png

    category = models.ForeignKey(to="Category", verbose_name="课程的分类")
    COURSE_TYPE_CHOICES = ((0, "付费"), (1, "vip专享"), (2, "学位课程"))
    course_type = models.SmallIntegerField(choices=COURSE_TYPE_CHOICES)
    degree_course = models.ForeignKey(to="DegreeCourse", blank=True, null=True, help_text="如果是学位课程,必须关联学位表")
    # course_type    degree_course_id
    #  0                null
    #  1                null
    #  2                2

    brief = models.CharField(verbose_name="课程简介", max_length=1024)
    level_choices = ((0, '初级'), (1, '中级'), (2, '高级'))
    level = models.SmallIntegerField(choices=level_choices, default=1)
    status_choices = ((0, '上线'), (1, '下线'), (2, '预上线'))
    status = models.SmallIntegerField(choices=status_choices, default=0)
    pub_date = models.DateField(verbose_name="发布日期", blank=True, null=True)
    order = models.IntegerField(verbose_name="课程顺序", help_text="从上一个课程数字往后排, 建议中间空几个数字")
    study_num = models.IntegerField(verbose_name="学习人数", help_text="只要有人买课程,订单表加入数据的同时给这个字段+1")
    is_free = models.BooleanField(default=False)

    # order_details = GenericRelation("OrderDetail", related_query_name="course")
    # coupon = GenericRelation("Coupon")
    # 只用于反向查询不生成字段
    price_policy = GenericRelation("PricePolicy")
    often_ask_questions = GenericRelation("OftenAskedQuestion")
    course_comments = GenericRelation("Comment")

    def save(self, *args, **kwargs):
        if self.course_type == 2:
            if not self.degree_course:
                raise ValueError("学位课必须关联学位课程表")
        super(Course, self).save(*args, **kwargs)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "02-课程表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 每一条课程里面都有课程详情
class CourseDetail(models.Model):
    """课程详细表"""
    course = models.OneToOneField(to="Course")
    hours = models.IntegerField(verbose_name="课时")
    course_slogan = models.CharField(max_length=125, blank=True, null=True, verbose_name="课程口号")
    # 视频简介链接
    video_brief_link = models.CharField(max_length=255, blank=True, null=True)
    summary = models.TextField(max_length=2048, verbose_name="课程概述")
    why_study = models.TextField(verbose_name="为什么学习这门课程")
    service = models.TextField(verbose_name="你将获得哪些服务")
    what_to_study_brief = models.TextField(verbose_name="我将学到哪些内容")
    career_improvement = models.TextField(verbose_name="此项目如何有助于我的职业生涯")
    prerequisite = models.TextField(verbose_name="课程先修要求", max_length=1024)
    recommend_courses = models.ManyToManyField("Course", related_name="recommend_by", blank=True)
    teachers = models.ManyToManyField("Teacher", verbose_name="课程讲师")

    def __str__(self):
        return self.course.title

    class Meta:
        verbose_name = "03-课程详细表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


class Teacher(models.Model):
    """讲师表"""
    name = models.CharField(max_length=32, verbose_name="讲师名字")
    brief = models.TextField(max_length=1024, verbose_name="讲师介绍")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "04-教师表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 只是一个单独的深度学习的title
class DegreeCourse(models.Model):
    """
    字段大体跟课程表相同,哪些不同根据业务逻辑去区分
    """
    title = models.CharField(max_length=32, verbose_name="学位课程名字")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "05-学位课程表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 课程章节表,课程有多个章节
class CourseChapter(models.Model):
    """课程章节表"""
    course = models.ForeignKey(to="Course", related_name="course_chapters")
    # 排序用的
    chapter = models.SmallIntegerField(default=1, verbose_name="第几章")
    title = models.CharField(max_length=32, verbose_name="课程章节名称")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "06-课程章节表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ("course", "chapter")


# 课时表,一章课程有多个课程
class CourseSection(models.Model):
    """课时表"""
    chapter = models.ForeignKey(to="CourseChapter", related_name="course_sections")
    title = models.CharField(max_length=32, verbose_name="课时")
    section_order = models.SmallIntegerField(verbose_name="课时排序", help_text="建议每个课时之间空1至2个值,以备后续插入课时")
    section_type_choices = ((0, '文档'), (1, '练习'), (2, '视频'))
    free_trail = models.BooleanField("是否可试看", default=False)
    section_type = models.SmallIntegerField(default=2, choices=section_type_choices)
    # 视频链接
    section_link = models.CharField(max_length=255, blank=True, null=True, help_text="若是video,填vid,若是文档,填link")

    def __str__(self):
        return "%s-%s" % (self.chapter, self.title)

    class Meta:
        verbose_name = "07-课程课时表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ('chapter', 'section_link')


# 价格策略表
class PricePolicy(models.Model):
    """价格策略表"""
    content_type = models.ForeignKey(ContentType)  # 关联course or degree_course
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    valid_period_choices = ((1, '1天'), (3, '3天'),
                            (7, '1周'), (14, '2周'),
                            (30, '1个月'),
                            (60, '2个月'),
                            (90, '3个月'),
                            (120, '4个月'),
                            (180, '6个月'), (210, '12个月'),
                            (540, '18个月'), (720, '24个月')
                            )
    valid_period = models.SmallIntegerField(choices=valid_period_choices)
    price = models.FloatField()

    def __str__(self):
        return "%s(%s)%s" % (self.content_object, self.get_valid_period_display(), self.price)

    class Meta:
        verbose_name = "08-价格策略表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ("content_type", 'object_id', "valid_period")


# 常见问题
class OftenAskedQuestion(models.Model):
    """常见问题"""
    content_type = models.ForeignKey(ContentType)  # 关联course or degree_course
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    question = models.CharField(max_length=255)
    answer = models.TextField(max_length=1024)

    def __str__(self):
        return "%s-%s" % (self.content_object, self.question)

    class Meta:
        verbose_name = "09-常见问题表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ('content_type', 'object_id', 'question')


# 用户评论表
class Comment(models.Model):
    """通用的评论表"""
    # 定位表
    content_type = models.ForeignKey(ContentType, blank=True, null=True)
    # 定位对象的id
    object_id = models.PositiveIntegerField(blank=True, null=True)
    # 定位对象
    content_object = GenericForeignKey('content_type', 'object_id')

    content = models.TextField(max_length=1024, verbose_name="评论内容")
    account = models.ForeignKey("Account", verbose_name="会员名")
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.content

    class Meta:
        verbose_name = "10-评价表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 用户表
class Account(models.Model):
    username = models.CharField(max_length=32, verbose_name="用户姓名")
    pwd = models.CharField(max_length=128)

    create_token_time = models.DateTimeField(auto_now=True)

    token = models.UUIDField(null=True, blank=True)

    def __str__(self):
        return self.username

    class Meta:
        verbose_name = "11-用户表"
        db_table = verbose_name
        verbose_name_plural = verbose_name


# 课程大纲,在课程详情里面
class CourseOutline(models.Model):
    """课程大纲"""
    course_detail = models.ForeignKey(to="CourseDetail", related_name="course_outline")
    title = models.CharField(max_length=128)
    order = models.PositiveSmallIntegerField(default=1)
    # 前端显示顺序

    content = models.TextField("内容", max_length=2048)

    def __str__(self):
        return "%s" % self.title

    class Meta:
        verbose_name = "12-课程大纲表"
        db_table = verbose_name
        verbose_name_plural = verbose_name
        unique_together = ('course_detail', 'title')


#################################################################

class Coupon(models.Model):
    """优惠券生成规则"""
    name = models.CharField(max_length=64, verbose_name="活动名称")
    brief = models.TextField(blank=True, null=True, verbose_name="优惠券介绍")
    coupon_type_choices = ((0, '立减券'), (1, '满减券'), (2, '折扣券'))
    coupon_type = models.SmallIntegerField(choices=coupon_type_choices, default=0, verbose_name="券类型")

    money_equivalent_value = models.IntegerField(verbose_name="等值货币", blank=True, null=True)
    off_percent = models.PositiveSmallIntegerField("折扣百分比", help_text="只针对折扣券,例7.9折,写79", blank=True, null=True)
    minimum_consume = models.PositiveIntegerField("最低消费", default=0, help_text="仅在满减券时填写此字段")

    content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField("绑定课程", blank=True, null=True, help_text="可以把优惠券跟课程绑定")
    content_object = GenericForeignKey('content_type', 'object_id')

    quantity = models.PositiveIntegerField("数量(张)", default=1)
    open_date = models.DateField("优惠券领取开始时间")
    close_date = models.DateField("优惠券领取结束时间")
    valid_begin_date = models.DateTimeField(verbose_name="有效期开始时间", blank=True, null=True)
    valid_end_date = models.DateTimeField(verbose_name="有效结束时间", blank=True, null=True)
    coupon_valid_days = models.PositiveIntegerField(verbose_name="优惠券有效期(天)", blank=True, null=True,
                                                    help_text="自券被领时开始算起")
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = "13-优惠券生成规则"

    def __str__(self):
        return "%s(%s)" % (self.get_coupon_type_display(), self.name)


class CouponRecord(models.Model):
    """优惠券发放、消费纪录"""
    coupon = models.ForeignKey("Coupon", on_delete=models.CASCADE)
    user = models.ForeignKey("Account", verbose_name="拥有者", on_delete=models.CASCADE)
    status_choices = ((0, '未使用'), (1, '已使用'), (2, '已过期'))
    status = models.SmallIntegerField(choices=status_choices, default=0)
    get_time = models.DateTimeField(verbose_name="领取时间", help_text="用户领取时间", null=True, blank=True)
    used_time = models.DateTimeField(blank=True, null=True, verbose_name="使用时间")

    class Meta:
        verbose_name_plural = "14-优惠券发放、消费纪录"

    def __str__(self):
        return '%s-%s-%s' % (self.user, self.coupon, self.get_status_display())

2.2结算接口,注意 # 时间属性必须转换格式才能被 json 序列化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AccountView(APIView):
    authentication_classes = [authentication.MyAuthentication, ]

    @staticmethod
    def get_user_coupons_dict(request, course_id=None):
        print('id', course_id)
        coupon_dict = {}
        coupons_query_set = models.CouponRecord.objects.filter(
            # 首先指定表id
            coupon__content_type_id=10,
            # 指定课程id
            coupon__object_id=course_id,
            status=0,
            user=request.user,
            coupon__valid_begin_date__lt=now(),
            coupon__valid_end_date__gt=now(),
        )
        for coupon_record in coupons_query_set:
            coupon_dict[coupon_record.id] = {
                'name': coupon_record.coupon.name,
                'brief': coupon_record.coupon.brief,
                'coupon_type': coupon_record.coupon.get_coupon_type_display(),
                'money_equivalent_value': coupon_record.coupon.money_equivalent_value,
                'off_percent': coupon_record.coupon.off_percent,
                'minimum_consume': coupon_record.coupon.minimum_consume,
                # 注意时间属性只有被转换格式才可以被序列化
                'valid_begin_date': coupon_record.coupon.valid_begin_date.strftime('%Y-%m-%d'),
                'valid_end_date': coupon_record.coupon.valid_end_date.strftime('%Y-%m-%d'),
            }
        return coupon_dict

    @staticmethod
    def post(request):
        """本接口仅仅对购物车进行结算"""
        # {course_list: [XX, XX, ...]}
        test_dict = {}
        my_res = BaseResponse()
        try:
            """1.以最新的结算为准,清除Redis里面该用户原来的结算数据"""
            user_id = request.user.pk
            account_key = ACCOUNT_KEY.format(user_id, '*')
            delete_list = REDIS_CONN.keys(ACCOUNT_KEY)
            if delete_list:
                REDIS_CONN.delete(*account_key)

            """2.判断课程列表里的课程是否合法"""
            course_list = request.data.get('course_list', '')
            # 类型是否为列表
            if type(course_list) is not list:
                raise MyException(601, '参数类型非法!')
            # 是否存在相同课程
            course_list = [str(emp).strip() for emp in course_list]
            if len(course_list) != len(set(course_list)):
                raise MyException('602', '课程id不能相同!')
            # 是否存在非法课程
            for course_id in course_list:
                if not REDIS_CONN.exists(SHOPPING_CAR.format(user_id, course_id)):
                    raise MyException(602, '不存在相关课程!')

            for course_id in course_list:
                """3.拿到课程信息字典"""
                course_info = REDIS_CONN.get(SHOPPING_CAR.format(user_id, course_id))
                test_dict['course_info_{}'.format(course_id)] = json.loads(course_info)

                """3.5.根据课程id拿到课程优惠券字典"""
                test_dict[ACCOUNT_KEY.format(user_id, course_id)] = AccountView.get_user_coupons_dict(
                    request, course_id=course_id
                )

            """4.拿到该用户的公共优惠券"""
            global_coupons_dict = AccountView.get_user_coupons_dict(request)
            test_dict['global_coupons_dict'] = global_coupons_dict
            my_res.code = 600
            my_res.msg = 'SUCCESS'
            my_res.data = test_dict

            """5.写进 Redis """
            """ ... """

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -600
            my_res.msg = str(e)
        return Response(my_res.dict)

2.3结算数据结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
account = {
        # 结算接口数据结构
        "account_{}_{}": {
            "course_info": {
                "id": "XXX",
                "title": "XXX",
                "course_img": "XXX",
                "price_policy_dict": {
                    "valid_period": "XXX",
                    "price": "XXX"
                },
                "default_price_policy_id": "XXX"
            },
            # ...
            # ...

            "course_coupons": {
                "1": {
                    'course_id': "XXX",
                    'name': "XXX",
                    'coupon_type': "XXX",
                    'money_equivalent_value': "XXX",
                    'off_percent': "XXX",
                    'minimum_consume': "XXX",
                    'valid_begin_date': "XXX",
                    'valid_end_date': "XXX",
                },
                # ...
                # ...
            }
        },

        "global_coupon": {
            "1": {
                'name': "XXX",
                'coupon_type': "XXX",
                'money_equivalent_value': "XXX",
                'off_percent': "XXX",
                'minimum_consume': "XXX",
                'valid_begin_date': "XXX",
                'valid_end_date': "XXX",
            },
            # ...
            # ...
        }

    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
LHE7909与ADS1299在脑电图实验中的对比测试(南大工作)
苏州领慧立芯科技有限公司是一家专注高性能模拟及混合信号芯片设计的解决方案提供商。公司致力于中高端高精度信号链和定制化MCU芯片的设计,可广泛应用于通讯、医疗、工业控制、消费类电子、汽车电子等领域。 详情请点击发消息!
云深无际
2025/06/19
420
LHE7909与ADS1299在脑电图实验中的对比测试(南大工作)
BCI-EEG脑电数据处理
EEG信号特征提取就是以脑电信号作为源信号,确定各种参数并以此为向量组成表征信号特征的特征向量。
MiChong
2020/09/24
3.7K0
BCI-EEG脑电数据处理
EEG时频主成分分析(TF-PCA)实用教程(附示例数据和代码)
时频主成分分析(TF-PCA)提供了一种数据缩减方法,它不依赖于关于感兴趣效应的特定时间或频率边界的先验约束,因此特别适合于存在认知发展变化的TF数据分析。本教程提供了背景知识、理论和实用指导,文章还附带了一个配套的GitHub存储库,该存储库包含示例代码、数据和如何执行TF-PCA的逐步指南:https://github.com/NDCLab/tfpca-tutorial。
悦影科技
2022/09/20
1.3K0
Where Does EEG Come From and What Does It Mean?
脑电(EEG)在认知、脑功能和功能障碍等研究中发挥了重要作用。但是,脑电信号从何而来,它们有何意义?事实上我们对这个问题知之甚少。著名脑电领域学者Michael X Cohen在Trends in Neurosciences发文,试图回答这一问题。神经振荡可能是EEG用以锚定的最佳特征,因为神经振荡在多物种的、跨时空尺度的大脑中广泛的得以观察和研究,并涉及广泛的认知和神经计算。
用户1279583
2019/07/10
5940
使用时空-频率模式分析从脑电数据的一些试验中提取N400成分
关于高小榕教授的介绍,可以查看本社区之前分享的《第1期 | 国内脑机接口领域专家教授汇总》
脑机接口社区
2020/07/28
8960
eLife:EEG和MEG中相位数据的贝叶斯分析
摘要:脑电图(EEG)和脑磁图(MEG)记录是研究人类神经反应的宝贵工具,但它们存在噪音,并可能受到多种过程的影响。为了解决这一问题,一个有效的方法是使用特定频率的刺激,并测量响应相位的一致性。本文描述了一种测量相位一致性的贝叶斯方法,并使用神经语言学的示例和模拟数据进行了阐述。本研究建议,与传统的统计方法相比,贝叶斯方法更具描述性和可解释性,并且在检测与刺激相关的差异时对参与者数量要求更低。
悦影科技
2024/02/28
2430
NeuroImage Clinical:EEG神经反馈对ADHD患者的α波振荡、注意力和抑制控制的影响
注意缺陷多动障碍(Attention-deficit hyperactivity disorder, ADHD)的核心症状是注意力不集中、冲动和多动。全世界约有2-7%的儿童受到ADHD的影响,部分会持续到成年期,成年人患病率为4 - 5%,且ADHD与不良的长期结果相关,如社会适应障碍、学业问题以及与其他精神疾病共病等。 研究发现ADHD儿童EEG普遍偏慢,其特征是低频节律波(如θ波4-7 Hz)功率增加和高频的节律波的功率(如β 14–25 Hz )。在健康发育过程中θ/β比值(TBR)逐渐下降,而ADHD患者的θ/β上升被认为反映了发育迟缓或皮质觉醒不足。然而,最近的研究对θ/β与觉醒的关系及其作为ADHD诊断的可靠依据提出了挑战。除了θ/β外,静息态α波(8-12 Hz)的功率也成为了成人ADHD患者研究的重要课题。研究发现,休息状态ADHD患者前部脑区α波更高且伴随警戒水平更低。而在健康被试中,α波振幅的升高与对刺激感知减弱、走神及注意力缺失有关,另外运动皮层α波振幅的增加与主动的运动抑制有关。然而近期一些研究发现,与健康对照组相比,ADHD成人的α波功率有所提高,而另一些研究则发现ADHD成人α波水平的降低或者没有显著差异。因此,研究中关于α波功率相互矛盾的结果被视为多种支持ADHD电生理表型可能性的证据。 面对这种矛盾的结果,使用神经反馈(neurofeedback,NFB)来控制特定脑区的振荡成了解决这一问题的一个较好的选择。神经反馈导致的可塑性已经在运动和纹状体回路中得到了证实,这与ADHD的病理机制有关。研究表明,神经反馈也许能用于改善ADHD患者的注意力不集中和冲动症状,对成年人的长期影响至少为6个月,且效应接近于哌醋甲酯(又名利他林,是一种治疗ADHD的常用一线药物)。特别是,在注意过程中被调节的α波节律波(8-12Hz)被认为是ADHD潜在的生物标记。在各类研究中,成人ADHD异常的脑电振荡活动模式被反复提及。近期,来自瑞士日内瓦大学的研究团队使用脑电神经反馈的方法让成年ADHD被试自我调节α波的节律,以探索α波振荡对注意力表现和大脑可塑性的调节作用。他们研究团队在NeuroImage Clinical上发表了题为《Linking alpha oscillations, attention and inhibitory control in adult ADHD with EEG neurofeedback》的研究论文(Deiber et al., 2020)。本文对该研究进行详细解读。
悦影科技
2021/01/27
1K0
NeuroImage Clinical:EEG神经反馈对ADHD患者的α波振荡、注意力和抑制控制的影响
真实飞行条件下使用六干电极EEG系统基于ERP和功率谱以监测飞行员的精神负荷
最近的技术进步使低成本和高度便携的大脑传感器得以发展,如内置预放大电路的干电极,可以在实验室之外测量认知活动。这项技术为在复杂的现实生活情况下(如操作飞机)监测“大脑工作”开辟了前景广阔的前景。然而,有必要在真实的操作条件下对这些传感器进行基准测试。
脑机接口社区
2023/02/14
7580
真实飞行条件下使用六干电极EEG系统基于ERP和功率谱以监测飞行员的精神负荷
长文解读|深度学习+EEG时频空特征用于跨任务的心理负荷量评估
心理负荷量显著影响特定任务中的人员绩效。适当的心理负荷量可以提高工作效率。但是,沉重的脑力劳动会降低人类的记忆力,反应能力和操作能力。由于某些职业的脑力劳动量很大,例如飞行员,士兵,机组人员和外科医生,沉重的脑力劳动会导致严重的后果。因此,心理负荷量评估仍然是一个重要的课题。 近年来,基于脑电图的脑力负荷评估取得了重要成就。但是,出色的结果通常集中于在同一天完成单一心理任务的单个被试。这些方法在实验室外的效果不佳。要达到好的效果,必须克服三个问题,即跨被试,跨日期和跨任务问题。所谓的跨任务问题就是算法可以在不同的实验范式中评估心理负荷量。跨任务的心理负荷量评估,难点在于找到可以推广到各种心理任务的高鲁棒性的EEG特征。特征集通常使用两种方法生成:手工设计特征和通过深度学习提取特征。 最常用的手工设计特征是从5个频段(δ[1-3 Hz],θ[5-8 Hz],α[9-12 Hz],β[14-31 Hz]和γ[33-42 Hz])和2个扩展频带(γ1 [33-57 Hz]和γ2 [63-99 Hz])中提取的功率谱密度(PSD)特征。事件相关电位(ERP)和事件相关同步/去同步(ERS/ ERD)也广泛用于对EEG信号进行分类。 但是,这些手工设计的特征对于跨任务问题未取得可使用的结果。原因除了设计的特征不适合之外,各种任务下的心理负荷量级别的定义也可能导致误导分类结果,心理负荷量状况的标签可能被主观地和错误地定义。 近期,来自清华大学精密仪器系精密测量技术与仪器国家重点实验室的研究团队在IEEE TRANSACTIONS ON NEURAL SYSTEMS AND REHABILITATION ENGINEERING杂志发表题目为《Learning Spatial–Spectral–Temporal EEG Features With Recurrent 3D Convolutional Neural Networks for Cross-Task Mental Workload Assessment》研究论文,其设计了两种不同类型的心理负荷量实验,通过行为数据验证了实验的有效性,并提出了一个基于深度循环神经网络(RNN)和3D卷积神经网络的级联网络结构(R3DCNN),以在没有先验知识的情况下学习跨任务的脑电特征。
悦影科技
2021/01/25
1.1K0
长文解读|深度学习+EEG时频空特征用于跨任务的心理负荷量评估
Brain Stimulation:实时EEG触发的TMS对抑郁症患者左背外侧前额叶皮层进行脑振荡同步刺激
请点击上面“思影科技”四个字,选择关注作者,思影科技专注于脑影像数据处理,涵盖(fMRI,结构像,DTI,ASL,EEG/ERP,FNIRS,眼动)等,希望专业的内容可以给关注者带来帮助,欢迎留言讨论,也欢迎参加思影科技的其他课程。(文末点击浏览)
用户1279583
2019/12/17
1.5K0
Brain Stimulation:实时EEG触发的TMS对抑郁症患者左背外侧前额叶皮层进行脑振荡同步刺激
解开神经科学中的交叉频率耦合
请点击上面“思影科技”四个字,选择关注我们,思影科技专注于脑影像数据处理,涵盖(fMRI,结构像,DTI,ASL,QSM,MRS,EEG/ERP,FNIRS,眼动)等,希望专业的内容可以给关注者带来帮助,欢迎留言讨论及转发推荐,也欢迎了解思影科技的课程及数据处理服务,可添加微信号siyingyxf或18983979082咨询(电话18580429226,杨晓飞)。(文末点击浏览)
用户1279583
2021/10/18
9300
解开神经科学中的交叉频率耦合
一种用于EEG超扫描研究的分析流程
超扫描方法使研究人员可以在自然环境中测量两个或更多个体之间神经活动的动态相互排列。超扫描研究日益增多需要开发一种透明且经过验证的数据分析方法,以进一步推动该领域的进一步发展。我们开发并测试了双脑电图分析流程(DEEP)。在对数据进行预处理之后,DEEP 允许用户计算锁相值 (PLV) 和跨频 PLV来作为每个参与者的脑间相位对齐,时频响应和 EEG 功率的指标。
悦影科技
2022/08/10
7930
PNAS:大脑区域间耦合的增加和减少会相应增加和减少人类大脑中的振荡活动
大脑中振荡活动的起源目前仍有争议,但许多假说都认为它们反映了大脑区域之间的相互作用。本文中,我们通过控制两个人类大脑区域之间的耦合强度来检验这种可能性,这两个区域是腹侧前运动皮层(ventral premotor cortex, PMv)和初级运动皮质(primary motor cortex, M1),并且检测其对运动系统中可测得(基于脑电图)的振荡活动的影响。我们增加或降低耦合强度,同时保持对通路中每个组分区域的影响不变。这是通过使用两种不同模式的经颅磁刺激PMv和M1成对脉冲刺激来实现的,其中只有一种方式增加了PMv对M1的影响。虽然刺激方案的时间模式不同,但它们由相同数量的M1和PMv脉冲组成。在一项运动任务中,我们测量了参与者做一个事先准备好的动作(Go)或不做(No-Go)时,对α、β和θ波段活动的影响。通过激发PMv - M1通路的同步突触前和突触后活动,增强了PMv和M1之间的皮层连接,分别增强了Go和No-Go试验中的β和θ振荡节律。α节律几乎没有变化。相比之下,在Go和No-Go试验中,PMv对M1影响的减弱分别降低了β和θ振荡节律。这表明PMv-M1通路中的皮质-皮质交流频率可以按照Hebbian棘波时间依赖可塑性被调节。本文发表在PNAS杂志。
用户1279583
2022/02/28
1K0
PNAS:大脑区域间耦合的增加和减少会相应增加和减少人类大脑中的振荡活动
Neuron:背侧流中θ振荡的选择性夹带可提高听觉工作记忆表现
已经证实背侧流(Dorsal Stream)在工作记忆中操作听觉信息的作用。然而,该网络中的振荡动力学及其与行为的因果关系仍未明确。通过同步使用MEG/EEG,我们发现在需要比较两种不同时间顺序模式差异的任务中,背侧流中θ振荡可以预测被试的操作能力。我们利用θ节律性TMS与EEG结合的方法,在两种刺激之间的静息态间隔内,对MEG识别目标(左侧顶内沟)进行脑振荡与行为之间的因果关系研究。节律性TMS引发了θ振荡并提高了被试的准确性。TMS诱发的振荡夹带随着行为增强而增加,而且这两种增强都随着被试的基线水平而产生变化。这些结果在旋律对比控制任务(melody-comparison control task)中没有观察到,在非节律性TMS中也没有观察到。这些数据表明,背侧流中的θ活动与记忆操作有因果关系。本文发表在Neuron杂志。
用户1279583
2022/02/28
7120
Neuron:背侧流中θ振荡的选择性夹带可提高听觉工作记忆表现
EEG/ERP研究中使用头皮表面拉普拉斯算法的问题和考虑
尽管表面拉普拉斯算法可能抵消的容积传导和对表面电位数据记录参考的不利影响,电生理学学科一直不愿采用这种方法进行数据分析。这种顾虑的原因是多方面的,往往涉及到对潜在转换性质的不熟悉、感知到的数学复杂性的威胁,以及对信号损失、密集电极排列需求或噪声敏感性的担忧。我们回顾了容积传导和允许任意选择脑电参考所引起的缺陷,以一种直观的方式描述了表面拉普拉斯变换的基本原理,并举例说明了常见参考模式(鼻子、连接乳突、平均)和用于频繁测量的EEG频谱(theta, alpha)以及标准ERP成分(如N1或P3)的表面拉普拉斯转换之间的差异。我们特别回顾了表面拉普拉斯算法普遍应用中的一些常见的局限,这些局限可以通过适当选择样条弹性参数和正则化常数进行球面样条内插来有效地解决。我们从实用主义的角度认为,这些局限不仅是没有根据的,而且一直使用表面电位对脑电图和ERP研究的进展构成了相当大的障碍。本文发表在International Journal of Psychophysiology杂志。
用户1279583
2022/02/28
1.1K0
EEG/ERP研究中使用头皮表面拉普拉斯算法的问题和考虑
国外研究团队对意识(认知)评估听觉范式的新型改善方法
利用Oddball(新异刺激)听觉范式(后文中部分内容译为:反常听觉范式)进行意识情况识别已成为脑机接口(BCI)领域的一个重要研究课题。对于注意力有限的患者来说,尽可能缩短获取评估所需的足够数据的时间是至关重要的。本研究旨在通过测试不同的设定和刺激方法,减少Oddball听觉范式的评估时间。一类范式使用被试主体自己的名字作为偏差声音刺激。另一类范式使用标准正弦波声音进行刺激。在一组9名健康被试人员中,在4种不同的Oddball听觉范式条件下记录被试者的脑电图(EEG)活动。为了进行对比,我们计算了每个范式下的P300曲线下的面积。首先,我们证明了含有受试者名字的范式下比正弦音范式下产生了更大面积的P300区域。更重要的是,我们发现与标准听觉范式相比,“名称范式”需要更少的试验刺激次数就能获得类似的结果。这意味着与使用正弦波相比,听觉范式的执行时间是可以被减少的。
脑机接口社区
2022/09/22
9140
国外研究团队对意识(认知)评估听觉范式的新型改善方法
睡眠时的局部目标记忆再激活
通过目标记忆再激活(targeted memory reaction,TMR)实现记忆巩固,TMR在睡眠期间重现训练线索或是内容。但是不清楚TMR对睡眠皮层振荡的作用是局部的还是整体的。本文利用嗅觉的独特功能神经解剖学及其同侧刺激处理,在一个脑半球进行局部TMR。在最初就有气味刺激条件下,受试者学习单词与出现在左右视野中的位置间的联系。本文发现在任务训练期间,侧向的时间相关电位表示单半球的记忆过程。在学习后的小睡中,在非快速眼动(non-rapid eye movement,NREM)睡眠中进行气味刺激。在睡眠期间进行局部TMR后,cued半球(与受刺激鼻孔同侧)处理特定单词的记忆得到改善。单侧气味刺激调控局部慢波(slow-wave,SW)功率,即相较于uncued半球,cued半球的区域SW功率增加较慢,且与提示单词的选择记忆呈负相关。另外,在cued半球中,局部TMR改善了慢震荡和睡眠纺锤波间的相位振幅耦合(PAC)。在学习期间没有气味刺激条件下,睡眠期间进行单侧气味刺激,结果表明记忆表现和皮层睡眠振荡间并不存在任何效应。因此,睡眠中TMR通过选择性地促进与局部睡眠振荡相关的特定记忆,而超过了整体活动。
悦影科技
2021/11/11
6910
国内研究者提出了一种新颖的基于VR的脑电情感诱发范式
最近,国内的研究人员提出了一种新颖的情感诱发范式,该范式将VR技术与EEG技术结合。相比于传统音视频刺激等范式,该范式在情感诱发方面具有显著优势。
脑机接口社区
2023/02/13
1.1K0
Current Biology脑电研究:自闭症患者双眼竞争较慢
请点击上面“思影科技”四个字,选择关注我们,思影科技专注于脑影像数据处理,涵盖(fMRI,结构像,DTI,ASL,EEG/ERP,FNIRS,眼动)等,希望专业的内容可以给关注者带来帮助,欢迎留言讨论,也欢迎参加思影科技的其他课程。(文末点击浏览)
用户1279583
2019/11/01
1.2K0
Current Biology脑电研究:自闭症患者双眼竞争较慢
Neuron:老年人脑波在睡眠时失耦合:慢波-纺锤波同步、脑萎缩和遗忘
请点击上面“思影科技”四个字,选择关注作者,思影科技专注于脑影像数据处理,涵盖(fMRI,结构像,DTI,ASL,EEG/ERP,FNIRS,眼动)等,希望专业的内容可以给关注者带来帮助,欢迎留言讨论,也欢迎参加思影科技的其他课程。(文末点击浏览)
用户1279583
2019/12/17
1.5K0
Neuron:老年人脑波在睡眠时失耦合:慢波-纺锤波同步、脑萎缩和遗忘
推荐阅读
LHE7909与ADS1299在脑电图实验中的对比测试(南大工作)
420
BCI-EEG脑电数据处理
3.7K0
EEG时频主成分分析(TF-PCA)实用教程(附示例数据和代码)
1.3K0
Where Does EEG Come From and What Does It Mean?
5940
使用时空-频率模式分析从脑电数据的一些试验中提取N400成分
8960
eLife:EEG和MEG中相位数据的贝叶斯分析
2430
NeuroImage Clinical:EEG神经反馈对ADHD患者的α波振荡、注意力和抑制控制的影响
1K0
真实飞行条件下使用六干电极EEG系统基于ERP和功率谱以监测飞行员的精神负荷
7580
长文解读|深度学习+EEG时频空特征用于跨任务的心理负荷量评估
1.1K0
Brain Stimulation:实时EEG触发的TMS对抑郁症患者左背外侧前额叶皮层进行脑振荡同步刺激
1.5K0
解开神经科学中的交叉频率耦合
9300
一种用于EEG超扫描研究的分析流程
7930
PNAS:大脑区域间耦合的增加和减少会相应增加和减少人类大脑中的振荡活动
1K0
Neuron:背侧流中θ振荡的选择性夹带可提高听觉工作记忆表现
7120
EEG/ERP研究中使用头皮表面拉普拉斯算法的问题和考虑
1.1K0
国外研究团队对意识(认知)评估听觉范式的新型改善方法
9140
睡眠时的局部目标记忆再激活
6910
国内研究者提出了一种新颖的基于VR的脑电情感诱发范式
1.1K0
Current Biology脑电研究:自闭症患者双眼竞争较慢
1.2K0
Neuron:老年人脑波在睡眠时失耦合:慢波-纺锤波同步、脑萎缩和遗忘
1.5K0
相关推荐
LHE7909与ADS1299在脑电图实验中的对比测试(南大工作)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档