当前位置: 首页 > news >正文

【数据挖掘】如何修复时序分析缺少的日期

一、说明

        我撰写本文的目的是通过引导您完成一个示例来帮助您了解 TVF 以及如何使用它们,该示例解决了时间序列分析中常见的缺失日期问题。

        我们将介绍:

  • 如何生成日期以填补数据中缺失的空白
  • 如何创建 TVF 和参数的使用
  • 如何呼叫 TVF
  • 我们将考虑扩展我们的日期生成器以获得更大的灵活性。
  • 最后,我将分享如何访问我的TVF,并向您介绍一个名为BigFunctions的开源项目。

二、简述

在某些情况下,数据为零的日期很重要,必须在数据集中显示/包含。例如:

  • 企业可以从识别零售中没有销售的天数中受益。这些日子受到假期或客户行为变化的影响。
  • 查找数据中缺失的日期有助于揭示由系统故障或不完整的数据捕获引起的异常或异常值,从而提高数据质量。显示缺少的日期是实现此目标的有用工具。

        这些缺失的日期可能会导致分析和可视化问题。因此,您需要一个解决方案来确保输出中存在所有日期,即使没有相应的数据也是如此。

        在本文结束时,您将拥有自己的 TVF,它可以生成这个......

        从一行代码开始吧!

三、缺失日期如何补救?

        请考虑以下方案:您运行了一个查询,该查询按日期提供过去四周的总调查响应结果。然后,您将结果导入 Google 表格,以快速可视化数据。

        上图没有突出显示任何缺失的数据;它看起来完全符合预期。即使您选择在 x 轴上显示所有日期,您也没有注意到 7 月中缺少的两天也是可以原谅的。

        上图是真实数据,并真实反应7月缺少两天的数据,因而数据较窄。从中可以看出,Google的数据填充是天衣无缝的感觉,问题是离开Google,我们自己是否依然能够处理好这种缺失问题?答案是:需要经过一番研究。

四、我们如何解决这个问题

         为了解决这个问题,我创建了我喜欢称之为日期轴的东西。 此日期/周/月列(无论需要什么时间段)都是与正在分析的数据集分开构建的。这可确保日期是独立的,并且不依赖于数据存在。

        创建日期轴相当简单,尽管如果您经常需要创建一个,则很麻烦。

        下面是一个简单的示例,它生成2023-6-16到 2023-6-19 日之间的日期。


WITH date_axis as (SELECTdates
FROMUNNEST(generate_date_array("2023-06-19","2023-07-16")) as dates
)SELECTdates
FROMdate_axis

        generate_date_array函数是其中的关键部分,但正如函数名称所暗示的那样,输出以数组形式返回。因此,我们必须在下一步中取消嵌套(展平)此数组。

        日期轴存在于 CTE 中,因为我们需要将其视为一个单独的表,将我们的实际数据左连接到日期列表。

WITH date_axis as (SELECTdates
FROMUNNEST(generate_date_array("2023-06-19","2023-07-16")) as dates
)SELECTdates,responses as original_responses,ifnull(responses,0) as new_responses
FROMdate_axis as axis
LEFT JOIN`spreadsheep-20220603.Case_Studies.survey_responses` as surveyON axis.dates = survey.date

        正如您在上面看到的,我们在survey_responses表中为 7 月 2 日和 1 日的值,因为这些日期不存在。使用日期轴,我们可以轻松发现这些并适当地处理它们,在这种情况下,值将替换为0。

        重新绘制更新的数据,我们现在捕捉到7月初缺乏回复的情况。

五、关于TVF的使用(table value Function)?

5.1 什么是TVF

        TVF 是表值函数的缩写,table value Function。与 UDF(用户定义函数)非常相似,它们允许您指定一系列任务,这些任务将在调用自定义函数时运行。

        两者之间的区别在于 UDF 为数据集中的每一行返回结果,而 TVF 返回整个表。

        您可能想知道,如果 CTE 方法完美地完成了这项工作,那有什么意义。好吧,在 TVF 中,我们可以扩展日期轴函数的功能和可重用性并简化我们的代码。

        有许多创造性和有用的方法来使用 TVF,在本文中,我们将使用一种方法来生成日期轴。

5.2 创建TVF

CREATE OR REPLACE TABLE FUNCTION `spreadsheep-20220603.Case_Studies.generate_dates`(start_date DATE, end_date DATE)
AS (
SELECTdates
FROMUNNEST(generate_date_array(start_date,end_date)) as dates
)

        创建 TVF 既好又容易;从“开始,然后是要在项目中保存 TVF 的位置。然后,您可以添加参数,我们在此示例中添加了两个参数。create or replace table function

        start_date DATE, end_date DATE

        如下所示,这两个参数替换了我们添加到 generate_date_array 函数的静态值。

        unnest(generate_date_array(start_date,end_date)) as dates

        创建 TVF 后,您可以像调用表一样调用新函数。请注意,我在 FROM 子句末尾添加了括号,以指定我希望 TVF 使用哪些值,其中 7 月 1 日作为开始日期,7 月 7 日作为结束日期。

SELECT dates 
FROM `spreadsheep-20220603.Case_Studies.generate_dates`("2023-07-01", "2023-07-07")

        我们现在可以更新原始查询以使用新的 TVF。

WITH date_axis as (
SELECT dates 
FROM `spreadsheep-20220603.Case_Studies.generate_dates`("2023-06-19", "2023-07-16")
)SELECTdates,responses as original_responses,ifnull(responses,0) as new_responses
FROMdate_axis as axis
LEFT JOIN`spreadsheep-20220603.Case_Studies.survey_responses` as surveyON axis.dates = survey.date

5.3 在TVF上扩展

        到目前为止,该函数非常有限,因为它只提供日期。如果我们想要一周的开始日期,一周从星期日开始,或者我们想要过去几年的季度开始和结束日期,该怎么办?

        虽然我们可以将该逻辑添加到调用 TVF 的 CTE 中,但让我们在 TVF 中处理它,以便在需要时它就在那里。

        我的最终版本增加了一些其他可能性,具体取决于您是否需要每周、每月或每季度的日期范围。

CREATE OR REPLACE TABLE FUNCTION `spreadsheep-20220603.Case_Studies.generate_dates`(start_date DATE, end_date DATE)
OPTIONS (description="Generate a table of dates") AS (
(
selectdate,format_date("%a", date) as day_of_week,date_trunc(date, week(monday)) as week_start_monday,date_trunc(date, week(monday)) + 6 as week_end_monday,date_trunc(date, week(sunday)) as week_start_sunday,date_trunc(date, week(sunday)) + 6 as week_end_sunday,date_trunc(date, month) as month_start,date_add(date_trunc(date, month), interval 1 month) - 1 as month_end,date_trunc(date, quarter) as quarter_start,date_add(date_trunc(date, quarter), interval 1 quarter) - 1 as quarter_end,
from unnest(generate_date_array(start_date,end_date)
) as date
)
);

        这为我们提供了在本文开头看到的输出,其中单个查询行可以生成数年的日期,以及它们的周、月和季度部分。

        作为奖励,我们创建的这个函数不会查询任何实际数据。这意味着它是完全免费的,而且速度快如闪电。

        即使生成从 1820 年到现在的日期也只需 1 秒。

SELECT * FROM `spreadsheep-20220603.Case_Studies.generate_dates`("1820-07-01","2023-07-15")

摄影:Benjamin Davies on Unsplash

5.4 访问BigFunctions

        为了节省一些时间,您不必在项目中创建此 TVF;您可以使用公共版本,该版本存在于 BigFunctions 开源项目中。

        要将 BigFunctions 添加到项目中,您可以使用资源管理器添加功能,然后“按名称为项目加星标”,如下所示。

        这些函数在每个区域中都可用,在每个数据集中,您可以在“例程”下找到generate_dates。试试下面的代码!

SELECT * FROM `bigfunctions.europe_west2.generate_dates`("2022-01-01", "2023-01-01");

        有关 BigFunctions 的更多详细信息可以在这里找到,其中充满了很棒的自定义函数,其中一些甚至使用 Python 来运行各种整洁的东西。如果您在日常角色中使用 BigQuery,请查看它。

相关文章:

【数据挖掘】如何修复时序分析缺少的日期

一、说明 我撰写本文的目的是通过引导您完成一个示例来帮助您了解 TVF 以及如何使用它们,该示例解决了时间序列分析中常见的缺失日期问题。 我们将介绍: 如何生成日期以填补数据中缺失的空白如何创建 TVF 和参数的使用如何呼叫 TVF我们将考虑扩展我们的日…...

CDN、P2P、PCDN的区别是什么

本篇文章为大家介绍一下与网络加速有关的几个重要概念,一起了解一下CDN,P2P和PCDN究竟是什么吧! 1. CDN CDN即Content Delivery Network,中文全称为内容分发网络。 如果内容离用户远,用户可能无法获得及时的响应,那…...

MYSQL练习一答案

练习1答案 构建数据库 数据库 数据表 answer开头表为对应题号答案形成的数据表 表结构 表数据 答案: 1、查询商品库存等于50的所有商品,显示商品编号,商 品名称,商品售价,商品库存。 SQL语句 select good_no,good…...

路由器(第二十五课)

路由器的深入学习 一、路由 1、路由 1) 什么是路由:路由就是数据包从一个网络到另外一外网络的过程 2)支持路由功能的设备:路由器、三层交换机、防火墙 3 路由器转发数据包的依据: -每一台路由器都维护着一张路由表 -路由器是依靠这张路由表来转发数据的 -这张路由表就…...

物联网网关模块可以带几台plc设备吗?可以接几个modbus设备?

随着物联网技术的快速发展,物联网网关模块已经成为了实现物联网应用的重要工具。很多客户在选择物联网网关模块时想了解物联网网关模块的设备接入能力,一个物联网网关模块可以带几台PLC设备?可以接几个Modbus设备? 物联网网关模块…...

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址(已开源):https://gitee.com/sizhaohe/mini-mybatis.git 跟着源码及下述UML图来理解上手会更快,拒绝浮躁,沉下心来搞 定义&#x…...

结构化思维:高效能项目经理人的底层能力

大家好,我是老原。 我们经常会说「高效能」,那怎么成为高效能人士?其实除了拼体力和心力以外,高效能更重要的是脑力,这里的脑力不是指智力,而是结构化思维。 随着你在职场中不断成长和进阶,级…...

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址:torch.nn — PyTorch 2.0 documentation 常用的:Sigmoid、ReLU、LeakyReLU等。 作用:为模型引入非线性特征,这样才能在训练过程中…...

vue3+ts+elementui-plus二次封装树形表格

复制粘贴即可&#xff1a; 一、定义table组件 <template><div classmain><div><el-table ref"multipleTableRef" :height"height" :default-expand-all"isExpend" :data"treeTableData"style"width: 100%…...

机器学习/深度学习常见算法实现(秋招版)

包括BN层、卷积层、池化层、交叉熵、随机梯度下降法、非极大抑制、k均值聚类等秋招常见的代码实现。 1. BN层 import numpy as npdef batch_norm(outputs, gamma, beta, epsilon1e-6, momentum0.9, running_mean0, running_var1)::param outputs: [B, L]:param gamma: mean:p…...

京东技术专家首推:Spring 微服务架构设计,GitHub 星标 128K

前言 本书提供了实现大型响应式微服务的实用方法和指导原则&#xff0c;并通过示例全面 讲解如何构建微服务。本书深入介绍了 Spring Boot、Spring Cloud、 Docker、Mesos 和 Marathon&#xff0c;还会教授如何用 Spring Boot 部署自治服务&#xff0c;而 无须使用重量级应用服…...

R语言--森林图制作

#数据准备- data5 #install.packages("rmda")rm(list=ls())library(MASS)library(rmda)library(dplyr) #mutate依赖环境library(magrittr) #%>%依赖setwd("D:/R/nomo5new2")data...

Tomcat中利用war包部署

在Tomcat中利用war包部署Web应用程序时&#xff0c;默认情况下&#xff0c;应用程序的上下文路径&#xff08;也称为项目名称&#xff09;将是war文件的名称&#xff08;去除.war扩展名&#xff09;。这意味着您在访问Web应用程序时必须在URL中包含项目名称。例如&#xff0c;如…...

[JAVAee]线程安全

目录 线程安全的理解 线程不安全的原因 ①非原子性 ②可见性 ③代码重排序 体会何为不安全的线程 保证线程安全 一个代码在多线程的环境下就很容易出现错误. 线程安全的理解 线程安全是什么呢?通俗的来讲,线程安全就是在多线程的环境下,代码的结果是符合我们预期的,就…...

ELK环境搭建——概况

Elastic Stack,核心产品包括 Elasticsearch、Kibana、Beats 和 Logstash等等。能够安全可靠地从任何来源获取任何格式的数据,然后对数据进行搜索、分析和可视化。 目录 一:Elasticsearch: 1.1 从数据中探寻各种问题的答案 1.1.1 定义您自己的搜索方式...

面试知识点整理

计算机的物理内存是有限的&#xff0c;所以操作系统在遇到内存不足时&#xff0c;会通过换页机制暂时把 某个进程未使用的内存中的数据搬移到硬盘上&#xff08;比如 Linux 的 swap 分区&#xff09;&#xff0c;并在系统页表中 删除相应的表项。当该进程访问数据已经被搬移到硬…...

腾讯云服务器CVM计算型c6/c5实例CPU型号、处理器主频大全

腾讯云服务器CVM计算型C6、C5、C4、CN3、C3和C2实例&#xff0c;计算型C6云服务器CPU采用Intel Xeon Ice Lake处理器&#xff0c;主频3.2GHz&#xff0c;睿频3.5GHz&#xff0c;腾讯云服务器网分享更多计算型CVM云服务器CPU型号、处理器主频性能说明&#xff1a; 目录 云服务…...

vue3笔记-脚手架篇

第一章 基础篇 第二章 脚手架篇 vue2与vue3的一些区别 响应式系统&#xff1a; Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听&#xff0c;它对数据监听是一项项的进行监听&#xff0c;因此&#xff0c;当新增属性发生变化时&#xff0c;它无法监测到&…...

数字的补数

题目&#xff1a; 对整数的二进制表示取反&#xff08;0 变 1 &#xff0c;1 变 0&#xff09;后&#xff0c;再转换为十进制表示&#xff0c;可以得到这个整数的补数。 例如&#xff0c;整数 5 的二进制表示是 "101" &#xff0c;取反后得到 "010" &…...

Taskfile demo

https://github.com/yangyang5214/blog/issues/1 makefile 很好用&#xff0c;但是有些语法我不会。 go-task yml & shell 不错&#xff0c;推荐 Taskfile.yml https://github.com/go-task/task/blob/main/.golangci.yml # go install github.com/go-task/task/v3/cmd/ta…...

MyBatis学习笔记之高级映射及延迟加载

文章目录 环境搭建&#xff0c;数据配置多对一的映射的思路逻辑级联属性映射association分布查询 一对多的映射的思路逻辑collection分布 环境搭建&#xff0c;数据配置 t_class表 t_stu表 多对一的映射的思路逻辑 多对一&#xff1a;多个学生对应一个班级 多的一方是st…...

小程序如何删除/上架/下架商品

在小程序中&#xff0c;产品的删除、上架和下架是常见的操作&#xff0c;可以根据实际需求来管理商品的展示与销售。下面将介绍如何在小程序中删除上架下架商品的具体步骤。 进入商品管理页面&#xff0c; 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。…...

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式&#xff1a;https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下&#xff0c;然后引进页面里就行了&#xff0c;全局样式就放app.scss&#xff0c;单页面就引入单页面 注&#xff1a; .title…...

使用fastjson错误

说明&#xff1a;使用fastjson时&#xff0c;对象解析不成功&#xff0c;一直报错&#xff0c;但是json格式没有错&#xff1b; 错误信息&#xff1a;Method threw ‘com.alibaba.fastjson.JSONException’ exception. json数据是正确的 分析&#xff1a;注意看&#xff0c;fa…...

【GitOps系列】使用Kustomize和Helm定义应用配置

文章目录 使用 Kustomize 定义应用改造示例应用1.创建基准和多环境目录2.环境差异分析3.为 Base 目录创建通用 Manifest4.为开发环境目录创建差异 Manifest5.为预发布环境创建差异 Manifest6.为生产环境创建差异 Manifest 部署 Kustomize 应用部署到开发环境部署到生产环境 使用…...

Android kotlin高阶函数与Java lambda表达式介绍与实战

一、介绍 目前在Java JDK版本的不断升高&#xff0c;新的表达式已开始出现&#xff0c;但是在Android混淆开发中&#xff0c;kotlin的语言与Java的语言是紧密贴合的。所以Java lambda表达式在kotlin中以新的身份出现&#xff1a;高阶函数与lambda表达式特别类似。接下来我讲会先…...

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…...

7.26 Qt

用QT制作一个登陆界面 运行代码 login.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于输出 #include <QIcon> //图标类头文件 #include <QPushButton&…...

【MySQL】库和表的操作

目录 一、库的操作 1.1创建数据库 1.2创建数据库案例 1.3字符集和校验规则 &#xff08;1&#xff09;查看系统默认字符集以及校验规则 &#xff08;2&#xff09;查看数据库支持的字符集 &#xff08;3&#xff09;查看数据库支持的字符集校验规则 &#xff08;4&…...

(五)RabbitMQ-进阶 死信队列、延迟队列、防丢失机制

Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制 文章目录 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制死信队列延迟队列延迟队列介绍**延迟队列_死信队列_的实现**延迟队列_插件实现下载插件RabbitMQ 配置类RabbitMQ …...