1.polars源码解析——DataFrame
2.BackTrader 中文文档(四)
3.干货 | PySpark DataFrame的常用入门操作分享!
4.R语言基础(9)——数据框(dataframe)
5.R语言笔记(五):数据转换(dplyr)
6.Pandas filter 筛选标签
polars源码解析——DataFrame
从源码解析的角度,DataFrame在polars中的核心构造和功能将逐一揭示。DataFrame,作为基本的二维数据结构,由一系列Series组成,二板接力分时源码公式这些Series都是在polars-core中的ChunkedArray、Series和DataFrame等数据结构之上构建的。DataFrame的简洁设计使其能直接利用Vec容器特性,如pop和is_empty,许多函数如hstack、width和insert_at_idx等都巧妙地利用了Vec的相应方法。
重点函数如select,其调用链为select->select_impl->select_series_impl。filter函数则展现出polars的多线程优化策略,如take和sort操作都借助了并行计算。至于groupby,它主要操作是创建GroupBy结构,接受一个通过IntoIterator和AsRef trait实现的列名迭代器,用于指定分组列。首先通过select_series选择列,再通过groupby_with_series生成分组的DataFrame表示。
在对单个key进行分组时,groupby会调用group_tuples,根据DataFrame的key排序情况使用不同的存储方式,如Slice或Idx。一旦分组完成,我们看到df.groupby(["date"])会返回一个包含select方法的GroupBy结构。接着,通过.select(["temp"])明确要进行聚合操作的列,结果还是GroupBy对象。当调用count等聚合函数时,mol指标源码polars利用groups的分组索引,采用多线程处理每个分组的行,进行高效计算。
BackTrader 中文文档(四)
Backtrader中文文档(四)
数据供稿 - 过滤器过滤器
实现过滤器功能相对较晚,需适应内部结构,灵活性与全功能性可能受限,但在多数情况下仍能实现所需目的。即插即用的过滤器链接尝试提供便利,但现有结构导致难以保证始终可实现。因此,部分过滤器可能被链接,而另一些可能未链接。
实现目标简化了两个明显过滤器的直接使用,分别为:
过滤器工作流程
对于现有数据源,使用数据源的addfilter方法即可操作。
即使与重新采样/重播过滤器兼容,仍能执行特定操作。
过滤器接口
一个filter必须满足特定接口,包括:
实例化时调用的初始化方法(`__init__`)和处理数据输入的调用方法(`__call__`)。
初始化方法接收数据源、`*args`和`**kwargs`参数。
调用方法在每个新输入值后执行,返回值指示是否需要重新尝试从数据源获取数据。
基于类的过滤器可实现额外方法,如:
在数据源结束时调用的`last`方法,允许过滤器处理可能已缓冲的数据。
过滤器实例化示例
一个快速过滤器实现展示如下:
使用此过滤器时的流程
过滤器数据伪-API示例
在上述示例中,展示如何通过调用`data.backwards()`从流中移除当前条。数据源对象的有用调用,旨在作为过滤器的伪-API。
示例过滤器:粉鱼过滤器
此过滤器旨在链接至其他过滤器,源码几个网址如replay过滤器,实现特定功能。粉鱼名称源自库主页描述,使用每日数据执行仅在分时数据中可能的操作。
实现效果逻辑
与以下内容一起工作
使用案例
代码实现
过滤器参考
Backtrader提供了多种过滤器类,包括:
SessionFilter: 可应用于数据源,过滤掉超出常规会话时间的盘中bar。
SessionFilterSimple: 与SessionFilter类似,但管理数据堆栈的方式不同。
SessionFiller: 声明会话开始/结束时间内的数据源的Bar Filler。
CalendarDays: 添加缺失的交易日的Bar Filler。
BarReplayer_Open: 将一个bar拆分为两部分,模拟回放,无需使用replay过滤器。
DaySplitter_Close: 将每日bar拆分为两部分,模拟用于重放数据的2个tick。
HeikinAshi: 重新构建开盘价、最高价、最低价、收盘价以绘制平均趋势烛。
Renko: 修改数据流以绘制砖形图(或砖块)。
雅虎数据源注意事项
Backtrader支持雅虎数据源,但自年5月起,雅虎停止了用于历史数据下载的现有csv格式API。新的API和CSV下载格式更改迅速标准化并实施。
使用v7 API/格式为默认行为。若需使用旧的API/格式,请选择相应选项。
Pandas数据源示例
Backtrader支持使用Pandas Dataframes作为数据源,解析CSV等不同格式的数据。必须安装pandas及其依赖项。源码获取教程
数据源的重要声明
示例代码展示如何加载标准示例CSV数据,并解释如何跳过标题。
测试示例代码确保正确加载Pandas Dataframe。
数据源参考
Backtrader提供多种数据源类,包括CSV、交互经纪人数据、InfluxDB等。
每个类负责特定任务,如文件打开、解析行、链接数据、填充间隙等。
例如:`BacktraderCSVData`解析用于测试的自定义CSV数据。
`CSVDataBase`实现CSV数据源类的基类。
`Chainer`用于链接数据的类。
`DataClone`用于克隆数据源数据。
`DataFilter`类从数据源过滤条目,接受可调用对象作为过滤函数。
`GenericCSVData`根据定义的顺序和字段存在性解析CSV文件。
`IBData`实现交互经纪人数据源,支持特定合同规范。
其他数据源类涵盖不同格式和API,如Quandl、PandasDirectData、VChartCSVData等。
干货 | PySpark DataFrame的常用入门操作分享!
PySpark DataFrame常用入门操作概览
DataFrame在PySpark中支持两种主要的编程风格:DSL(领域特定语言)和SQL风格。 DSL风格,也就是DataFrame特有的API调用,如df.where()和df.limit(),以命令方式处理数据,时钟指标源码直观且灵活。 SQL风格则允许通过spark.sql()和SQL语句,如"SELECT * FROM xxx",对DataFrame进行数据操作。DSL中的show()方法用于展示数据,默认显示条,直接呈现DataFrame内容。
printSchema()方法用于打印DataFrame的列结构信息。
select()方法用于选择DataFrame中的特定列,支持列名或Column对象作为参数。
filter()和where()用于过滤DataFrame数据,返回过滤后的DataFrame。
groupBy()功能将数据按指定列分组,返回的GroupedData对象可进行聚合操作。
为了使用SQL风格,可以将DataFrame注册为表,以便执行SQL查询。PySpark.sql()函数是核心,配合pyspark.sql.functions包中的计算函数,如F对象下的函数,实现复杂的数据处理。 下面是一些基本操作的代码示例,详细函数使用将在后续的学习中深入探讨。R语言基础(9)——数据框(dataframe)
数据框,类似于数据库表或Excel数据表,可以通过函数data.frame()创建。
将向量、列表、矩阵转换成数据框可以使用as.data.frame(x)。
在创建数据框时,可以通过设置选项stringsAsFactors=FALSE来避免将字符型列转换为因子。
如果数据框的某一列为常数,可以在data.frame()调用中只给该列赋一个值,生成的结果会自动重复这个值,使得该列与其他列等长。
可以使用nrow(d)来获取数据框d的行数,ncol(d)或length(d)来获取列数。
names(d)或colnames(d)可以用于访问或修改列名。
数据框可以用矩阵格式访问,例如访问单个元素或第二列,结果为向量。
为了提取一列为向量,应使用双方括号格式或$格式,不应使用tibble。
或者使用attach和detach,可以直接用变量名而不需要使用$。
按列名访问列的方式如下。
可以同时获取行子集和列子集。
tibble是一种改进的数据框。readr包的read_csv()函数是read.csv()函数的一个改进版本,它将CSV文件读入为tibble类型。
使用as_tibble()可以将一个数据框转换为tibble。
dplyr包提供了filter()、select()、arrange()、mutate()等函数,用于对tibble选取行子集、列子集,排序、修改或定义新变量。
使用tribble()可以按类似于CSV格式输入一个tibble。
read_csv()也支持从一个多行字符串直接读入数据。
R语言笔记(五):数据转换(dplyr)
数据处理主要内容包括:
本文我们将深入了解数据转换的相关知识,相关链接可参考笔记(四)。
如有任何错误或需要补充的地方,欢迎各位高手不吝赐教,作者会持续进行更新!
2. 数据转换
在这一部分,我们将分别介绍R语言在处理数据转换时所使用的base包与dplyr包中的函数。
2.1 筛选(subset/filter/select)
筛选函数包括x:向量(vector),矩阵(matrix)或数据框(dataframe)subset:目标行符合的条件select:目标列的序数。
以下是一些筛选函数的例子:
四种函数仅适用于dataframe结构的筛选,其中filter()与slice()用于筛选行,filter()根据条件进行筛选,slice()根据行序数进行筛选;select()与rename()用于筛选列,以下为R给出的例子。
注filter()函数的用法与subset()基本相似,区别在于subset()可以处理向量和矩阵,并且可以通过select参数直接筛选列,因此我们将主要介绍其他三种函数。
首先是slice()函数,用法相对简单,主要根据行序数进行筛选。
select()函数用法较多,但都非常简单,作者直接将dplyr包的examples复制过来了。
另附
参考资料:
rename()函数主要用于变量重命名,select()也可以实现,区别在于rename()会返回所有列。
2.2 排序(order/arrange)
根据变量名对变量进行排序,可以通过手动进行排序;使用基本包中的order()排序;使用dplyr包中的arrange()排序。
以iris数据集为例:
2.3 转换(transform/mutate/transmute)
基本包中的transform()函数可以为数据框添加新的变量,也可以对已有的变量进行编辑/删除。dplyr包提供了两个添加新变量的函数,mutate()和transmute()。
三者区别在于,mutate()在transform()能添加新变量的基础上,可以同时使用刚添加的变量再创建其他变量;mutate()返回添加新变量后的新数据框,而transmute()仅返回新创建的变量。接下来我们来看看它们是如何实现变量编辑的:
2.4 分组与概括(group_by/summarise)
group_by()和summarise()都是dplyr包中的函数,处理对象都是数据框结构。
实际工作中,group_by()经常配合其他函数使用,因此,接下来我们先来举例介绍summarise()的用法和效果,再结合group_by()函数看看差异。
接下来结合group_by():
cyl变量表示气缸个数,取值为4, 6和8,因此对该变量进行分类便将dat分为三个group。再对其使用summarise()会对三个group分别计算其四分之一分位数、中位数、四分之三分位数。我们再试试对两个变量分组的效果:
gear表示的是forward gears(前齿轮?)个数,取值为3, 4和5;cyl有三个取值,因此对两个变量进行分组,应该会有3×3=9个group,但实际只有8个,是因为对八个气缸的车型没有4个forward gears,该组为空集,不填补缺失值就会被drop掉。分组后再使用summarise()的结果十分清晰,cyl作为第一分组依据,gear作为第二分组依据,分别对各组计算四分之一数、中位数和四分之三分位数。
Pandas filter 筛选标签
Pandas的filter方法允许根据指定的索引标签筛选数据框的行或列,适用于DataFrame、Series和分组对象DataFrameGroupBy。
使用filter方法时,参数items、like和regex参数必须互斥,轴默认为使用[]索引时的信息轴(按行)。
DataFrame的应用示例:
filter方法在Series中的应用与DataFrame相似,但由于Series只有一个轴,不能设置axis=1,只能通过索引查询数据。
对于DataFrameGroupBy,它能返回不包含筛选元素的数据框副本,当组中元素不满足特定的布尔表达式(为False)时被筛选掉。通常与匿名函数lambda配合使用,类似于SQL中的having操作。
在分组对象的使用中,filter方法的语法如下,参数和返回值与之前相同,但每个子帧都会被赋予“name”属性,用于识别当前处理的组。不支持变异传递对象的函数。
以下是一个分组筛选的例子,筛选所在组组B列平均值大于3的所有数据。
其他代码示例展示了如何在不同的Pandas对象上应用filter方法。
Pandas支持的对象中,除了DataFrame、Series和DataFrameGroupBy,还可以在apply()方法上调用filter。
更多信息和代码示例可参阅本书网页和Pandas在线教程。
欢迎关注公众号“盖若”(公号ID:gairuo)或通过作者在网页中的****添加微信进行交流。
Python内置的filter()函数和Pandas中的DataFrame.filter()参数及用法
Python中的filter()函数是内置的迭代器过滤工具,它接受一个函数和一个序列作为输入,返回一个由原序列中满足函数条件的元素组成的新序列。这个函数通常用于数据处理和筛选,简化代码并提高效率。
而在Pandas库中,DataFrame.filter()是一个更高级的特性,它针对DataFrame对象提供了更加灵活的筛选功能。DataFrame.filter()允许你通过列名或列的布尔索引来选择或排除DataFrame中的特定列,或者根据函数对数据进行条件筛选。它不仅限于列,还可以处理DataFrame的每一列数据,返回的结果可以是DataFrame、Series或者ndarray。
与filter()函数相比,DataFrame.filter()提供了更丰富的功能,适合处理大型数据集和复杂的数据过滤需求。然而,两者在使用时需要明确目标和数据结构,filter()适合轻量级的列筛选,而DataFrame.filter()则适用于需要深度定制筛选规则的场景。
总结来说,Python的filter()函数和Pandas的DataFrame.filter()都是数据处理中不可或缺的工具,选择使用哪个取决于你的具体需求和数据处理的复杂程度。