这或许是全网最全时间序列特征工程构造的文章了

news2025/1/15 6:57:51

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。

那特征工程是什么?

特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。

特征工程又包含了 Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和 Feature construction(特征构造)等子问题,本章内容主要讨论特征构造的方法。
图片

文章目录

    • 0x01 特征构造介绍
    • 0x02 时间特征构造
      • 1.连续值时间特征
      • 2.离散值时间特征
        • 1)时间特征拆解
          • 程序实现
        • 2)时间特征判断
          • 程序实现
      • 3.结合时间维度的聚合特征
        • 1)首日聚合特征
        • 2)最近时间聚合特征
        • 3)区间内的聚合特征
    • 0x03 时间序列特征构造
      • 1.时间序列聚合特征
          • 1)平均值
          • 2)最小值
          • 3)最大值
          • 4)扩散值
          • 5)离散系数值
          • 6)分布性
      • 2.时间序列历史特征
        • 1)前一(或n)个窗口的取值
        • 2)周期性时间序列前一(或n)周期的前一(或n)个窗口的取值
      • 3.时间序列复合特征
        • 1)趋势特征
        • 2)窗口差异值特征
        • 3)自相关性特征
    • 0x0FF 总结
      • 1.时间特征主要有两大类:
        • 1)从时间变量提取出来的特征
        • 2)对时间变量进行条件过滤,然后再对其他变量进行聚合操作所产生的特征
        • 2\. 时间序列数据可以从带有时间的流水数据统计得到,实际应用中可以分别从带有时间的流水数据以及时间序列数据中构造特征,这些特征可以同时作为模型输入特征。
        • 参考文献

0x01 特征构造介绍

时间特构造以及时间序列特征构造的具体方法:
图片

0x02 时间特征构造

对于时间型数据来说,即可以把它转换成连续值,也可以转换成离散值。

1.连续值时间特征

  • 持续时间(单页浏览时长);

  • 间隔时间;

  • 上次购买/点击离现在的时长;

  • 产品上线到现在经过的时长;

2.离散值时间特征

1)时间特征拆解

  • 年;

  • 月;

  • 日;

  • 时;

  • 分;

  • 数;

  • 一天中的第几分钟;

  • 星期几;

  • 一年中的第几天;

  • 一年中的第几个周;

  • 一天中哪个时间段:凌晨、早晨、上午、中午、下午、傍晚、晚上、深夜;

  • 一年中的哪个季度;

程序实现
import pandas as pd
# 构造时间数据
date_time_str_list = [
    '2019-01-01 01:22:26', '2019-02-02 04:34:52', '2019-03-03 06:16:40',
    '2019-04-04 08:11:38', '2019-05-05 10:52:39', '2019-06-06 12:06:25',
    '2019-07-07 14:05:25', '2019-08-08 16:51:33', '2019-09-09 18:28:28',
    '2019-10-10 20:55:12', '2019-11-11 22:55:12', '2019-12-12 00:55:12',
]
df = pd.DataFrame({'时间': date_time_str_list})
# 把字符串格式的时间转换成Timestamp格式
df['时间'] = df['时间'].apply(lambda x: pd.Timestamp(x))

# 年份
df['年']=df['时间'].apply(lambda x: x.year)

# 月份
df['月']=df['时间'].apply(lambda x: x.month)

# 日
df['日']=df['时间'].apply(lambda x: x.day)

# 小时
df['时']=df['时间'].apply(lambda x: x.hour)

# 分钟
df['分']=df['时间'].apply(lambda x: x.minute)

# 秒数
df['秒']=df['时间'].apply(lambda x: x.second)

# 一天中的第几分钟
df['一天中的第几分钟']=df['时间'].apply(lambda x: x.minute + x.hour*60)

# 星期几;
df['星期几']=df['时间'].apply(lambda x: x.dayofweek)

# 一年中的第几天
df['一年中的第几天']=df['时间'].apply(lambda x: x.dayofyear)

# 一年中的第几周
df['一年中的第几周']=df['时间'].apply(lambda x: x.week)

# 一天中哪个时间段:凌晨、早晨、上午、中午、下午、傍晚、晚上、深夜;
period_dict ={
    23: '深夜', 0: '深夜', 1: '深夜',
    2: '凌晨', 3: '凌晨', 4: '凌晨',
    5: '早晨', 6: '早晨', 7: '早晨',
    8: '上午', 9: '上午', 10: '上午', 11: '上午',
    12: '中午', 13: '中午',
    14: '下午', 15: '下午', 16: '下午', 17: '下午',
    18: '傍晚',
    19: '晚上', 20: '晚上', 21: '晚上', 22: '晚上',
}
df['时间段']=df['时'].map(period_dict)

# 一年中的哪个季度
season_dict = {
    1: '春季', 2: '春季', 3: '春季',
    4: '夏季', 5: '夏季', 6: '夏季',
    7: '秋季', 8: '秋季', 9: '秋季',
    10: '冬季', 11: '冬季', 12: '冬季',
}
df['季节']=df['月'].map(season_dict)

图片

2)时间特征判断

  • 是否闰年;

  • 是否月初;

  • 是否月末;

  • 是否季节初;

  • 是否季节末;

  • 是否年初;

  • 是否年尾;

  • 是否周末;

  • 是否公共假期;

  • 是否营业时间;

  • 两个时间间隔之间是否包含节假日/特殊日期;

程序实现
import pandas as pd
# 构造时间数据
date_time_str_list = [
    '2010-01-01 01:22:26', '2011-02-03 04:34:52', '2012-03-05 06:16:40',
    '2013-04-07 08:11:38', '2014-05-09 10:52:39', '2015-06-11 12:06:25',
    '2016-07-13 14:05:25', '2017-08-15 16:51:33', '2018-09-17 18:28:28',
    '2019-10-07 20:55:12', '2020-11-23 22:55:12', '2021-12-25 00:55:12',
    '2022-12-27 02:55:12', '2023-12-29 03:55:12', '2024-12-31 05:55:12',
]
df = pd.DataFrame({'时间': date_time_str_list})
# 把字符串格式的时间转换成Timestamp格式
df['时间'] = df['时间'].apply(lambda x: pd.Timestamp(x))

# 是否闰年
df['是否闰年'] = df['时间'].apply(lambda x: x.is_leap_year)

# 是否月初
df['是否月初'] = df['时间'].apply(lambda x: x.is_month_start)

# 是否月末
df['是否月末'] = df['时间'].apply(lambda x: x.is_month_end)

# 是否季节初
df['是否季节初'] = df['时间'].apply(lambda x: x.is_quarter_start)

# 是否季节末
df['是否季节末'] = df['时间'].apply(lambda x: x.is_quarter_end)

# 是否年初
df['是否年初'] = df['时间'].apply(lambda x: x.is_year_start)

# 是否年尾
df['是否年尾'] = df['时间'].apply(lambda x: x.is_year_end)

# 是否周末
df['是否周末'] = df['时间'].apply(lambda x: True if x.dayofweek in [5, 6] else False)

# 是否公共假期
public_vacation_list = [
    '20190101', '20190102', '20190204', '20190205', '20190206',
    '20190207', '20190208', '20190209', '20190210', '20190405',
    '20190406', '20190407', '20190501', '20190502', '20190503',
    '20190504', '20190607', '20190608', '20190609', '20190913',
    '20190914', '20190915', '20191001', '20191002', '20191003',
    '20191004', '20191005', '20191006', '20191007',
] # 此处未罗列所有公共假期
df['日期'] = df['时间'].apply(lambda x: x.strftime('%Y%m%d'))
df['是否公共假期'] = df['日期'].apply(lambda x: True if x in public_vacation_list else False)

# 是否营业时间
df['是否营业时间'] = False
df['小时']=df['时间'].apply(lambda x: x.hour)
df.loc[((df['小时'] >= 8) & (df['小时'] < 22)), '是否营业时间'] = True

df.drop(['日期', '小时'], axis=1, inplace=True)

图片

3.结合时间维度的聚合特征

具体就是指结合时间维度来进行聚合特征构造,聚合特征构造的具体方法可以参考《聚合特征构造以及转换特征构造》中的《聚合特征构造》章节。

1)首日聚合特征

例如:注册首日投资总金额、注册首日页面访问时长、注册首日总点击次数等;

2)最近时间聚合特征

例如:最近N天APP登录天数、最近一个月的购买金额、最近购物至今天数等;

3)区间内的聚合特征

例如:2018年至2019年的总购买金额、每天下午的平均客流量、在某公司工作期间加班的天数等;

0x03 时间序列特征构造

时间序列不仅包含一维时间变量,还有一维其他变量,如股票价格、天气温度、降雨量、订单量等。时间序列分析的主要目的是基于历史数据来预测未来信息。对于时间序列,我们关心的是长期的变动趋势、周期性的变动(如季节性变动)以及不规则的变动。

按固定时间长度把时间序列划分成多个时间窗,然后构造每个时间窗的特征。

1.时间序列聚合特征

按固定时间长度把时间序列划分成多个时间窗,然后使用聚合操作构造每个时间窗的特征。

1)平均值

例子:历史销售量平均值、最近N天销售量平均值。

2)最小值

例子:历史销售量最小值、最近N天销售量最小值。

3)最大值

例子:历史销售量最大值、最近N天销售量最大值。

4)扩散值

分布的扩散性,如标准差、平均绝对偏差或四分位差,可以反映测量的整体变化趋势。

5)离散系数值

离散系数是策略数据离散程度的相对统计量,主要用于比较不同样本数据的离散程度。

6)分布性

时间序列测量的边缘分布的高阶特效估计(如偏态系数或峰态系数),或者更进一步对命名分布进行统计测试(如标准或统一性),在某些情况下比较有预测力。

程序实现:洗发水销售数据

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

# 平均值
mean_v = df['value'].mean()
print('mean: {}'.format(mean_v))

# 最小值
min_v = df['value'].min()
print('min: {}'.format(min_v))

# 最大值
max_v = df['value'].max()
print('max: {}'.format(max_v))

# 扩散值:标准差
std_v = df['value'].std()
print('std: {}'.format(std_v))

# 扩散值:平均绝对偏差
mad_v = df['value'].mad()
print('mad: {}'.format(mad_v))

# 扩散值:四分位差
q1 = df['value'].quantile(q=0.25)
q3 = df['value'].quantile(q=0.75)
irq = q3 - q1
print('q1={}, q3={}, irq={}'.format(q1, q3, irq))

# 离散系数
variation_v = std_v/mean_v
print('variation: {}'.format(variation_v))

# 分布性:偏态系数
skew_v = df['value'].skew()
print('skew: {}'.format(skew_v))
# 分布性:峰态系数
kurt_v = df['value'].kurt()
print('kurt: {}'.format(kurt_v))

# 输出:
mean: 312.59999999999997
min: 119.3
max: 682.0
std: 148.93716412347473
mad: 119.66666666666667
q1=192.45000000000002, q3=411.1, irq=218.65
variation: 0.47644646232717447
skew: 0.8945388528534595
kurt: 0.11622821118738624

注:

  • 上面是单个时间序列的实现代码,多个时间序列的数据集构造特征时需要先进行分组再计算。如IJCAI-17口碑商家客流量预测比赛中,数据集中包含多个商家的历史销售数据,构造特征时需要先按商家分组,然后再构建特征。

  • 上述代码都是使用所有历史数据来构造特征,实际项目中如果待预测目标为t时刻的值,则使用t时刻之前的值来构造特征,不同的t值都可以分别构造训练样本对应的特征。
    如:使用t时刻的y值作为label,则使用t-1时刻之前的y值来构造特征;使用t-1时刻的y值作为label时,则使用t-2时刻之前的y值来构造特征。如此类推,我们可以得到多个训练样本,每个样本有多个特征。

2.时间序列历史特征

1)前一(或n)个窗口的取值

例子:昨天、前天和3天前的销售量。

2)周期性时间序列前一(或n)周期的前一(或n)个窗口的取值

例子:写字楼楼下的快餐店的销售量一般具有周期性,周期长度为7天,7天前和14天前的销售量。

程序实现:洗发水销售数据

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)


df['-1day'] = df['value'].shift(1)
df['-2day'] = df['value'].shift(2)
df['-3day'] = df['value'].shift(3)

df['-1period'] = df['value'].shift(1*12)
df['-2period'] = df['value'].shift(2*12)

display(df.head(60))

图片

3.时间序列复合特征

1)趋势特征

趋势特征可以刻画时间序列的变化趋势。

例子:每个用户每天对某个Item行为次数的时间序列中,User一天对Item的行为次数/User三天对Item的行为次数的均值,表示短期User对Item的热度趋势,大于1表示活跃逐渐在提高;三天User对Item的行为次数的均值/七天User对Item的行为次数的均值表示中期User对Item的活跃度的变化情况;七天User对Item的行为次数的均值/ 两周User对Item的行为次数的均值表示“长期”(相对)User对Item的活跃度的变化情况。

程序实现:

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

df['last 3 day mean'] = (df['value'].shift(1) + df['value'].shift(2) + df['value'].shift(3))/3
df['最近3天趋势'] = df['value'].shift(1)/df['last 3 day mean']
display(df.head(60))

图片

2)窗口差异值特征

一个窗口到下一个窗口的差异。例子:商店销售量时间序列中,昨天的销售量与前天销售量的差值。

程序实现:

import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

df['最近两月销量差异值'] = df['value'].shift(1) - df['value'].shift(2)
display(df.head(60))

图片

3)自相关性特征

原时间序列与自身左移一个时间空格(没有重叠的部分被移除)的时间序列相关联。

程序实现:

import statsmodels.tsa.api as smt
import pandas as pd
# 加载洗发水销售数据集
df = pd.read_csv('shampoo-sales.csv')
df.dropna(inplace=True)
df.rename(columns={'Sales of shampoo over a three year period': 'value'}, inplace=True)

print('滞后数为1的自相关系数:{}'.format(df['value'].autocorr(1)))
print('滞后数为2的自相关系数:{}'.format(df['value'].autocorr(2)))
# 输出:
滞后数为1的自相关系数:0.7194822398024308
滞后数为2的自相关系数:0.8507433352850972

除了上面描述的特征外,时间序列还有历史波动率、瞬间波动率、隐含波动率、偏度、峰度、瞬时相关性等特征。

0x0FF 总结

1.时间特征主要有两大类:

1)从时间变量提取出来的特征

  • 如果每条数据为一条训练样本,时间变量提取出来的特征可以直接作为训练样本的特征使用。

例子:用户注册时间变量。对于每个用户来说只有一条记录,提取出来的特征可以直接作为训练样本的特征使用,不需要进行二次加工。

  • 如果每条数据不是一条训练样本,时间变量提取出来的特征需要进行二次加工(聚合操作)才能作为训练样本的特征使用。

例子:用户交易流水数据中的交易时间。由于每个用户的交易流水数量不一样,从而导致交易时间提取出来的特征的数据不一致,所以这些特征不能直接作为训练样本的特征来使用。我们需要进一步进行聚合操作才能使用,如先从交易时间提取出交易小时数,然后再统计每个用户在每个小时(1-24小时)的交易次数来作为最终输出的特征。

2)对时间变量进行条件过滤,然后再对其他变量进行聚合操作所产生的特征

主要是针对类似交易流水这样的数据,从用户角度进行建模时,每个用户都有不定数量的数据,因此需要对数据进行聚合操作来为每个用户构造训练特征。而包含时间的数据,可以先使用时间进行条件过滤,过滤后再构造聚合特征。

2. 时间序列数据可以从带有时间的流水数据统计得到,实际应用中可以分别从带有时间的流水数据以及时间序列数据中构造特征,这些特征可以同时作为模型输入特征。

例如:美团的商家销售量预测中,每个商家的交易流水经过加工后可以得到每个商家每天的销售量,这个就是时间序列数据。

参考文献

[1] https://machinelearning-notes.readthedocs.io/zh_CN/latest/feature/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E2%80%94%E2%80%94%E6%97%B6%E9%97%B4.html
[2] https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12
[3] https://gplearn.readthedocs.io/en/stable/examples.html#symbolic-classifier
[4] 利用 gplearn 进行特征工程. https://bigquant.com/community/t/topic/120709
[5] Practical Lessons from Predicting Clicks on Ads at Facebook. https://pdfs.semanticscholar.org/daf9/ed5dc6c6bad5367d7fd8561527da30e9b8dd.pdf
[6] Feature Tools:可自动构造机器学习特征的Python库. https://www.jiqizhixin.com/articles/2018-06-21-2
[7] 各种聚类算法的系统介绍和比较. https://blog.csdn.net/abc200941410128/article/details/78541273

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

饼图、柱形图、堆积柱、折线图、散点图,到底应该怎么选?

“随着数字经济的发展&#xff0c;各行业的数据都出现了爆炸式的增长&#xff0c;如何快速从海量数据中提取出有效信息&#xff0c;最大化地挖掘数据价值&#xff0c;是所有转型的企业都在面临的问题。” 想要快速直观地以易于理解、内容简单的方式了解相关数据&#xff0c;就需…

[附源码]java毕业设计家政管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

软件测试面试真题 | TCP为什么要进行三次握手和四次挥手呢?

TCP为什么要进行三次握手和四次挥手呢&#xff1f; 在这个三次握手的过程中对应的消息内容是怎样进行传递的呢&#xff1f; 在四次挥手的过程中&#xff0c;是怎样告知对方断开连接的呢&#xff1f; 三次握手 在说对应概念之前&#xff0c;我们先来了解一个场景&#xff1a…

计算机网络 4 - 网络层

第4章 网络层&#xff1a;数据层面(Network Layer: Data Plane)4.1 网络层概述4.2 IP: Internet Protocol分类 IP 地址子网划分无分类域间路由 CIDRIP 地址的特点4.3 地址解析协议 ARP4.4 IP 数据包格式路由转发示例路由器转发算法使用二叉树查找转发表4.5 IP分配技术DHCPNAT 网…

celery

一 介绍 官网&#xff1a;https://docs.celeryq.dev/en/latest/index.html celery是一个简单、灵活、可靠的分布式系统&#xff0c;用于 处理大量消息&#xff0c;同时为操作提供 维护此类系统所需的工具。 Celery架构 Celery的架构由三部分组成&#xff0c;消息中间件&…

纸牌游戏新版小猫钓鱼设计制作

新版纸牌游戏《小猫钓鱼》设计制作 此游戏设计是我新创制的简单的卡牌游戏。属于儿童益智类游戏&#xff0c;适用于儿童的认知教育。 游戏规则很简单&#xff1a;找配对的牌消去。 游戏设置2个玩家对玩&#xff0c;鱼池置牌21张&#xff0c;玩家每人5张牌&#xff0c;二人轮转…

從turtle海龜動畫 學習 Python - 高中彈性課程系列 6.1 內嵌正多邊形 類似禪繞圖

Goal: 藉由有趣的「海龜動畫繪圖」學會基礎的 Python 程式設計 本篇介紹基礎的 Python 海龜動畫繪圖, 確實可以只以簡單的指令畫出極為複雜有趣或美麗的圖案: 內嵌正多邊形之圖案, 禪繞圖等 “Talk is cheap. Show me the code.” ― Linus Torvalds 老子第41章 上德若谷 大白…

Redis--1.CentOS8安装redis服务器

一、登录root账号 设置root密码&#xff1a; sudo passwd root切换到root账号&#xff1a; su root二、下载解压安装包 切换到根目录: cd / 1、创建存放路径: mkdir -p /usr/local/redis cd /usr/local/redis2、下载redis安装包&#xff1a;去官网找到redis连接地址如&…

基于jsp+mysql+ssm进销存管理系统-计算机毕业设计

本java进销存系统主要完成对超市的管理&#xff0c;包括会员管理、厂家管理、商品管理、退货管理&#xff0c;销售管理、进货管理、员工管理、系统管理等几个方面。系统可以完成对各类信息的浏览、查询、添加、删除、修改等功能。 系统采用了jsp的mvc框架,SSM(springMvcspringM…

告别手机自带浏览器,分享2022年好用的手机浏览器

对于喜欢使用手机上网冲浪的人来说&#xff0c;最喜欢用的一般都是小巧、强大、干净简洁的APP。作为上网常用的软件&#xff0c;好用的浏览器能够提高工作效率。而手机自带的浏览器往往占用资源大&#xff0c;而且广告很多&#xff0c;并夹带新闻、小说等无用功能&#xff0c;不…

自制操作系统日记(7):字符串显示

代码仓库地址&#xff1a;https://github.com/freedom-xiao007/operating-system 简介 上篇中我们在屏幕上画出了界面的大致轮廓&#xff0c;系统有了点模样&#xff0c;本篇继续跟着书籍&#xff0c;让程序中的字符串显示在屏幕上 效果展示 先放最终的效果&#xff0c;可以…

Linux磁盘分区,挂载介绍

分区的方式: mbr分区: 1.最多支持四个主分区 ⒉系统只能安装在主分区 3.扩展分区要占一个主分区 4.MBR最大只支持2TB&#xff0c;但拥有最好的兼容性 gtp分区: 1.支持无限多个主分区&#xff08;但操作系统可能限制&#xff0c;比如windows下最多128个分区) ⒉.最大支持18E…

仿大众点评——秒杀系统部分02

秒杀系统优化 接口限流和安全措施 令牌桶限流单用户访问频率限流抢购接口隐藏 接口限流&#xff1a; 在面临高并发的请购请求时&#xff0c;我们如果不对接口进行限流&#xff0c;可能会对后台系统造成极大的压力。尤其是对于下单的接口&#xff0c;过多的请求打到数据库会对…

MVCC 底层实现原理

文章目录概述事务并发出现的问题脏读不可重复读幻读事务隔离级别MVCC 底层实现原理隐式字段undo 日志Read View总结概述 MVCC(Multi-Version Concurrency Control) &#xff0c;叫做基于多版本的并发控制协议。 MVCC 是乐观锁的一种实现方式&#xff0c;它在很多情况下&#…

多线程增量下载K线数据

准备一份股票列表的CSV文件&#xff0c;文件格式如下 codenameclosecmvdate_ipo300434金石亚药12.89427982959020150424300380安硕信息19.31241993416320140128688123聚辰股份132.821114087266620191223300586美联新材20.34790882138120170104300534陇神戎发12.96389465063120…

Arduino与Proteus仿真实例-密码输入、验证与更新仿真

密码输入、验证与更新仿真 本次实例将通过4X4矩阵键盘、LCD1602、EEPROM实现一个密码输入匹配、储存、更新。 1、仿真电路原理图 在仿真电路原理图中,4X4矩阵键盘通过PCF8574 IO扩展器驱动,请参考前面文章: Arduino与Proteus仿真实例-PCF8574驱动4x4矩阵键盘仿真Arduino与…

大数据:Flume安装部署和配置

文章目录Flume 简介一&#xff0c;Flume下载和安装1&#xff09;登录[Flume官网](https://flume.apache.org/)&#xff0c;下载 apache-flume-1.9.0-bin.tar.gz2&#xff09;解压文件到 /opt 目录下3&#xff09;改名为 flume二&#xff0c;Flume配置1&#xff09;修改 /conf/ …

.Net开发——EFCore

1 EFCore是一个ORM框架 EFCore(EntityFramworkCore)是对底层ADO.NET重新封装的一个数据操作框架&#xff0c;因此ADO.NET支持的多种数据库都可以被EFCore支持。 EF Core 可用作对象关系映射程序 (O/RM)&#xff0c;这可以实现以下两点&#xff1a; 使 .NET 开发人员能够使用…

Python医学数据分析入门,推荐你学习这本书

医学生学习Python的难点通常在于 没有系统的编程教育&#xff0c;很难短时间内使用编程语言描述问题及其解答过程相关教程、案例少&#xff0c;想要练习缺少素材 所以这里就给大家推荐一本比较新比较前沿的教医学生学习Python的书《Python医学数据分析入门》 这本书的切入点为…

代码随想录——分割回文串 II

题目 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;1 解释&#xff1a;只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子…