利用Python进行数据分析(10)-移动窗口函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Python进行数据分析(10)-移动窗口函数相关的知识,希望对你有一定的参考价值。
参考技术APython-for-data-移动窗口函数
本文中介绍的是 ,主要的算子是:
统计和通过其他移动窗口或者指数衰减而运行的函数,称之为 移动窗口函数
<style scoped="">.dataframe tbody tr th:only-of-type vertical-align: middle; <pre><code>.dataframe tbody tr th vertical-align: top; .dataframe thead th text-align: right; </code></pre></style>
2292 rows × 3 columns
rolling算子,行为和resample和groupby类似
rolling可以在S或者DF上通过一个window进行调用
<style scoped="">.dataframe tbody tr th:only-of-type vertical-align: middle; <pre><code>.dataframe tbody tr th vertical-align: top; .dataframe thead th text-align: right; </code></pre></style>
2292 rows × 3 columns
指定一个常数衰减因子为观测值提供更多的权重。常用指定衰减因子的方法:使用span(跨度)
一些统计算子,例如相关度和协方差等需要同时操作两个时间序列。
例如,金融分析中的股票和基准指数的关联性问题:计算时间序列的百分比变化pct_change()
<style scoped="">.dataframe tbody tr th:only-of-type vertical-align: middle; <pre><code>.dataframe tbody tr th vertical-align: top; .dataframe thead th text-align: right; </code></pre></style>
在rolling及其相关方法上使用apply方法提供了一种在移动窗口中应用自己设计的数组函数的方法。
唯一要求:该函数从每个数组中产生一个单值(缩聚),例如使用rolling()...quantile(q)计算样本的中位数
sql server中的窗口移动平均
【中文标题】sql server中的窗口移动平均【英文标题】:Window moving average in sql server 【发布时间】:2011-03-23 15:04:11 【问题描述】:我正在尝试在 SQLServer 2008 中创建一个计算窗口移动平均线的函数。我对 SQL 很陌生,所以我遇到了一些困难。我试图对其执行移动平均的数据需要按天分组(它都是带时间戳的数据),然后需要对其应用可变的移动平均窗口。
我已经有一个按天(和@id)对数据进行分组的函数,它显示在底部。我有几个问题:
在移动平均函数内部调用分组函数会更好还是我应该一次完成?
是否可以获取输入到函数中的日期的移动平均线,但返回 n 天开始移动平均线,以便第一个 n 返回数据的天数不会有 0 的平均值? (即,如果他们想要从 01-08-2011 到 02-08-2011 的 7 天移动平均线,我在 01 开始计算移动平均线-01-2011 这样他们定义的第一天就有值了?)
我正在研究如何进行移动平均,并且知道移动窗口似乎是最好的选择(currentSum = prevSum + todayCount - nthDayAgoCount) / nDays 但我我仍在努力弄清楚这个的 SQL 实现。
我有一个如下所示的分组函数(出于可见性目的删除了一些变量):
SELECT
'ALL' as GeogType,
CAST(v.AdmissionOn as date) as dtAdmission,
CASE WHEN @id IS NULL THEN 99 ELSE v.ID END,
COUNT(*) as nVisits
FROM dbo.Table1 v INNER JOIN dbo.Table2 t ON v.FSLDU = t.FSLDU5
WHERE v.AdmissionOn >= '01-01-2010' AND v.AdmissionOn < DATEADD(day,1,'02-01-2010')
AND v.ID = Coalesce(@id,ID)
GROUP BY
CAST(v.AdmissionOn as date),
CASE WHEN @id IS NULL THEN 99 ELSE v.ID END
ORDER BY 2,3,4
返回一个像这样的表:
ALL 2010-01-01 1 103
ALL 2010-01-02 1 114
ALL 2010-01-03 1 86
ALL 2010-01-04 1 88
ALL 2010-01-05 1 84
ALL 2010-01-06 1 87
ALL 2010-01-07 1 82
编辑:回答我问的第一个问题:
我最终创建了一个函数,该函数声明了一个临时表并将 count 函数的结果插入其中,然后使用 user662852
中的示例计算移动平均值。
【问题讨论】:
【参考方案1】:从查询中取出硬编码的日期范围。将输出(如最后的示例)写入临时表(我在下面将其称为#visits)。 试试这个到临时表的自连接:
Select list.dtadmission
, AVG(data.nvisits) as Avg
, SUM(data.nvisits) as sum
, COUNT(data.nvisits) as RollingDayCount
, MIN(data.dtadmission) as Verifymindate
, MAX(data.dtadmission) as Verifymaxdate
from #visits as list
inner join #visits as data
on list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission) group by list.dtadmission
编辑:我在评论中没有足够的空间来回答您的问题:
我的连接是“有点笛卡尔”,因为它在连接约束中使用了一个 between。列表中的每条记录都与其他记录相对,然后我想要我报告的日期在 (-7) 天和今天的下限之间的记录。每个数据日期都可用于列出日期,这是您问题的关键。我可以将连接条件写为
list.dtadmission between DATEADD(DD,-6,data.dtadmission) and data.dtadmission
但真正发生的事情是我测试了它
list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission
它不返回任何记录,因为语法是“介于 LOW 和 HIGH 之间”。我面对 0 条记录并交换了论点,仅此而已。
尝试以下操作,看看我的意思:这是仅针对一个列表日期的笛卡尔连接:
SELECT
list.[dtAdmission] as listdate
,data.[dtAdmission] as datadate
,data.nVisits as datadata
,DATEADD(dd,6,list.dtadmission) as listplus6
,DATEADD(dd,6,data.dtAdmission ) as datapplus6
from [sandbox].[dbo].[admAvg] as list inner join [sandbox].[dbo].[admAvg] as data
on
1=1
where list.dtAdmission = '5-Jan-2011'
将此与实际连接条件进行比较
SELECT
list.[dtAdmission] as listdate
,data.[dtAdmission] as datadate
,data.nVisits as datadata
,DATEADD(dd,6,list.dtadmission) as listplus6
,DATEADD(dd,6,data.dtAdmission ) as datapplus6
from [sandbox].[dbo].[admAvg] as list inner join [sandbox].[dbo].[admAvg] as data
on
list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission)
where list.dtAdmission = '5-Jan-2011'
查看所有记录中 datadate 和 dataplus6 之间的列出日期如何?
【讨论】:
是的,抱歉,硬编码的日期范围以及该查询中的其他一些内容只是为了了解它/用于测试目的,而实际函数具有这些变量。不过我会试试看的! 您能否向我解释一下这是前 6 天加上当天的情况?我知道它确实做到了,但是当我查看它时,由于 DATEADD 功能,我认为它增加了 6 天 非常感谢:D 我希望我能多次投票!以上是关于利用Python进行数据分析(10)-移动窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
Python-OpenCV下的窗口鼠标事件交互操作(实现鼠标移动轨迹的绘制)