热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python差值_利用SQL和Python分别实现人流量查询,考验逻辑思维的时候到了

本来这篇是要写Python的可视化的,但无意中发现了一道题目,发现通过这道题可以很好地锻炼一下逻辑思维能力,而且也可以复习下SQL和Pyt

本来这篇是要写Python的可视化的,但无意中发现了一道题目,发现通过这道题可以很好地锻炼一下逻辑思维能力,而且也可以复习下SQL和Python的编写,于是便决定先写这篇了。

通过这道题我们会发现,其实在分析工作中,最重要的能力是逻辑思维,程序只不过是实现逻辑的工具,没有逻辑思维能力,程序就是无本之源。而且,虽然实现一个结果会有多种逻辑,但好的逻辑会让我们的程序更具简洁性、可观性、高效性。

下面是结合自身理解所总结的两类实现逻辑,我相信肯定还会有更优秀的逻辑在某些大牛的脑中!

案例介绍

案例来源于LeetCode,这样的需求在时间序列数据中还是较为常见的。

某市体育馆每日人流量信息被记录在stadium表的三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people),找出至少连续三行人流量不少于100的记录。

76a04650a204a1d33991d994ed106c0e.png

思路分析

最简单的思路肯定是对stadium表进行三次笛卡尔积连接,但这种方式在数据量大时不可取,而且也不具备泛化性(譬如需求改成至少连续十行)。网上也流传着阿里的编程规范——禁止三表以上的连接。

总之,这种思路不是我们该采取的,我们需要寻找其它思路。

(1)构建等差数列

7b03d8a78de7ef5adce52e25203edca0.png

从上图中我们能发现一个规律,满足条件的数据区域在原始表和结果表中的行编号均是等差数列,两个等差数列的差值是固定的。譬如,数列A1和B1的差值均为1;数列A2和B2的差值均为2。

只要我们保证每块区域等差数列的差值各不相等,那我们就可以通过筛选差值出现的次数来筛选满足条件的区域。例如,差值2出现了4次,满足条件,那该差值对应的记录就是我们需要的数据。

构建差值的方式除了通过行编号外,也还有其它方式,大家可以想一想。

(2)数据切片

6cf5cfa5ddf812bda2dd0910999e39bd.png

从图中可看出,if_true是辅助列,表示是否满足条件,1为True,0为False。我们要选择满足条件的区域,可通过用0对该列进行切片,得到的是全为1的不同长度的小数列,根据每个小数列的长度来筛选满足条件的区域。

在图中就是得到了长度为a和b的数列,通过计算数列的长度来找出满足条件的区域。

程序实现

上节我们选择了两种思路,其中Python两种思路都可以实现,SQL可实现第一种思路。本节用SQL实现第一种思路,用Python实现第二种思路。

(1)SQL

select id,visit_date,peoplefrom(select t2.*,count(1) over(partition by rn2) rn3from (selectt1.*,rn1 - row_number() over(order by visit_date) rn2from(select *,row_number() over() as rn1from stadium order by visit_date)t1 #t1表对日期升序排列后生成行编号where people>=100) t2 #t2表筛选人数不低于100的数据,并用原行编号减去新生成的行编号得到差值where 1=1) t3 #t3表统计每类差值出现的次数where rn3>2 #筛选次数大于2的数据即为所需要的数据

因为实际中表中的ID几乎都不是连续的数字,所以为了保证泛化性就先生成了行编号,这样就不用依赖于ID了。

除此之外也还可以通过用户变量等方式实现,大家可以试着想一想。

(2)Python

import pandas as pddt=pd.DataFrame({"id":range(1,9), "visit_date":pd.date_range(start="2017-01-01",periods=8), "people":[10,109,150,99,145,1455,199,188]})dt["col1"]=dt["people"].apply(lambda x : 1 if x>=100 else 0)#生成人数是否不低于100的新列dt['counter'] = (dt["col1"]==0).cumsum()#按照col1列是否为0计算累计和,标记每个连续区域dt = dt[dt["col1"] !=0]#剔除人数低于100的记录gb=dt.groupby("counter")["id"].count()# 统计各标记值的次数result=dt[dt["counter"].isin(gb[gb>2].index)]#筛选满足条件的数据

这里有一点需要注意,如果直接将col1列转为字符串按0进行切片的话,虽然可以求出满足条件的区域数量和长度,但很难再寻找到具体的区域。

split_col1="".join([str(i) for i in dt["col1"]]).split("0")

原本是按照的这种思路,但发现寻找长度符合字符串在原列表中的索引时会比较麻烦,尤其是当需要查找多个索引值时。

但此种思路还是非常重要,因为在只是计算连续区域的最大值时会非常简单。

结语

以上只是两种简单的逻辑,其实还有一些逻辑方法,但其本质大都差不多,本文就不一一列举了。至于是否还有更高效的逻辑方法,就等着大牛们来指导吧。

如果有完整看完的朋友就会发现,一个简单的例子就可以有多种实现方法,在将每种方法都自己写一遍的过程中,就是对已有知识的一种梳理和复习。



推荐阅读
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 如何将Python与Excel高效结合:常用操作技巧解析
    本文深入探讨了如何将Python与Excel高效结合,涵盖了一系列实用的操作技巧。文章内容详尽,步骤清晰,注重细节处理,旨在帮助读者掌握Python与Excel之间的无缝对接方法,提升数据处理效率。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • Python 开发笔记:深入探讨字符串及其常用方法与技巧 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 本文介绍了如何使用Python的Paramiko库批量更新多台服务器的登录密码。通过示例代码展示了具体实现方法,确保了操作的高效性和安全性。Paramiko库提供了强大的SSH2协议支持,使得远程服务器管理变得更加便捷。此外,文章还详细说明了代码的各个部分,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 深入解析 SQL 数据库查询技术
    本文深入探讨了SQL数据库查询技术,重点讲解了单表查询的各种方法。首先,介绍了如何从表中选择特定的列,包括查询指定列、查询所有列以及计算值的查询。此外,还详细解释了如何使用列别名来修改查询结果的列标题,并介绍了更名运算的应用场景和实现方式。通过这些内容,读者可以更好地理解和掌握SQL查询的基本技巧和高级用法。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
author-avatar
pomngjkldjg_849_788
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有