写点什么

动态规划 求最大连续子数组、Python range 函数指南、Postman 导出 curl 命令、AWS 知识图谱大赛架构设计、John 易筋 ARTS 打卡 Week 26

用户头像
John(易筋)
关注
发布于: 2020 年 11 月 15 日

1. Algorithm: 每周至少做一个 LeetCode 的算法题


笔者的文章:

算法:动态规划 最大连续子数组和 Maximum Subarray


题目

53. Maximum Subarray


Given an integer array nums, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.


Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.


Example 1:


Input: nums = [-2,1,-3,4,-1,2,1,-5,4]Output: 6
复制代码


Explanation: [4,-1,2,1] has the largest sum = 6.

Example 2:


Input: nums = [1]Output: 1
复制代码


Example 3:


Input: nums = [0]Output: 0
复制代码


Example 4:


Input: nums = [-1]Output: -1
复制代码


Example 5:


Input: nums = [-2147483647]Output: -2147483647
复制代码


Constraints:


1 <= nums.length <= 2 * 104-2^31 <= nums[i] <= 2^31 - 1
复制代码


动态规划解法

题意是求数组中子数组的最大和,这种最优问题一般第一时间想到的就是动态规划,我们可以这样想,当部分序列和大于零的话就一直加下一个元素即可,并和当前最大值进行比较,如果出现部分序列小于零的情况,那肯定就是从当前元素算起。其转移方程就是 dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);,由于我们不需要保留 dp 状态,故可以优化空间复杂度为 1,即 dp = nums[i] + (dp > 0 ? dp : 0);。


class MaxmumSubarray:    def maxSubArray(self, nums: List[int]) -> int:        if nums == None or len(nums) == 0:            return 0        for i in range(1, len(nums)):            if nums[i - 1] > 0:                nums[i] += nums[i - 1]        return max(nums)
复制代码


分而治之解法

题目也给了我们另一种思路,就是分治,所谓分治就是把问题分割成更小的,最后再合并即可,我们把 nums 一分为二先,那么就有两种情况,一种最大序列包括中间的值,一种就是不包括,也就是在左边或者右边;当最大序列在中间的时候那我们就把它两侧的最大和算出即可;当在两侧的话就继续分治即可。

class MaxmumSubarray:    def maxSubArray(self, nums: List[int]) -> int:        return self.helper(nums, 0, len(nums) - 1)
def helper(self, nums: List[int], left: int, right: int) -> int: if left >= right: return nums[left] mid = (int)((left + right) / 2) leftSub = self.helper(nums, left, mid) rightSub = self.helper(nums, mid+1, right) leftMax = nums[mid] rightMax = nums[mid + 1] temp = 0 for i in range(mid, left - 1, -1): temp += nums[i] if temp > leftMax: leftMax = temp
temp = 0 for k in range(mid+1, right + 1): temp += nums[k] if temp > rightMax: rightMax = temp
return max(max(leftSub, rightSub), leftMax + rightMax)
复制代码


2. Review: 阅读并点评至少一篇英文技术文章

笔者博客:

翻译: Python range 函数指南 -- 从入门到精通

说明

range 当您需要执行特定次数的操作时,Python 的内置函数非常方便。作为一个经验丰富的 Pythonista,您很可能曾经使用过它。但是它是做什么的呢?


在本指南结束时,您将:


  • 了解 Pythonrange 函数的工作原理

  • 了解 Python 2 和 Python 3 中的实现方式有何不同

  • 看到了许多动手的 range()例子

  • 有能力克服一些局限性

  • 让我们开始吧!


Pythonrange()函数的历史

尽管range()在 Python 2 和 Python 3 中可能共享一个名称,但是它们是完全不同的动物。实际上,range()在 Python 3 中只是 xrange 在 Python 2 中调用的函数的重命名版本。


最初,两者 range()和 xrange()产生的数字都可以使用 for 循环进行迭代,但是前者一次生成所有这些数字的列表,而后者则懒惰地产生数字,这意味着需要时一次返回一个数字。


闲逛着巨大的清单会占用内存,因此 xrange()替换 range(),名称和所有内容不足为奇。您可以在PEP 3100中阅读有关此决定和xrange() vsrange()背景的更多信息。


注意: PEP 代表 Python 增强建议。PEP 是可以涵盖广泛主题的文档,包括建议的新功能,样式,治理和理念。

他们有很多。PEP 1 解释了它们如何工作,是一个很好的起点。


在本文的其余部分,您将使用 Python 3 中存在的函数。


开始了!


让我们循环

在深入研究 range()工作原理之前,我们需要看一下循环工作原理。循环是计算机科学的关键概念。如果您想成为一名优秀的程序员,那么掌握循环就是您需要采取的第一步。


这是 Python 中 for 循环的示例:


captains = ['Janeway', 'Picard', 'Sisko']
for captain in captains: print(captain)
复制代码


输出如下:


JanewayPicardSisko
复制代码


如您所见,for 循环使您可以执行任意次数的特定代码块。在这种情况下,我们循环浏览了一系列队长并打印了他们的每个名字。


尽管《星际迷航》非常出色,但您可能要做的不只是简单地浏览一系列队长。有时,您只想执行一段代码特定次数。循环可以帮助您做到这一点!


尝试使用下面的代码将数字除以三:


numbers_divisible_by_three = [3, 6, 9, 12, 15]
for num in numbers_divisible_by_three: quotient = num / 3 print(f"{num} divided by 3 is {int(quotient)}.")
复制代码


该循环的输出将如下所示:


3 divided by 3 is 1.6 divided by 3 is 2.9 divided by 3 is 3.12 divided by 3 is 4.15 divided by 3 is 5.
复制代码


这就是我们想要的输出,因此循环充分完成了工作,但是还有另一种方法可以通过使用获得相同的结果 range()。


注意:最后一个代码示例具有一些字符串格式。要了解有关该主题的更多信息,可以查看Python字符串格式最佳实践和[Python 3 的 f 字符串:改进的字符串格式语法(指南)](https://realpython.com/python-f-strings/)。


现在您对循环更加熟悉了,让我们看看如何使用它 range()来简化生活。


Pythonrange()基础

那么 Python 的 range 功能如何工作?简而言之,它 range()允许您在给定范围内生成一系列数字。根据传递给函数的参数数量,您可以确定该系列数字在何处开始和结束以及一个数字与下一个数字之间的差值有多大。


这是 range()行动的先睹为快:


for i in range(3, 16, 3):    quotient = i / 3    print(f"{i} divided by 3 is {int(quotient)}.")
复制代码


在此 for 循环中,您可以简单地创建一系列可被整除的数字 3,因此您不必自己提供每个数字。

>注意:尽管此示例显示了的适当用法 range(),但 range()在 for 循环中使用它的频率通常过高。


例如,以下的用法 range()通常被认为不是 Pythonic:


captains = ['Janeway', 'Picard', 'Sisko']
for i in range(len(captains)): print(captains[i])
复制代码


range()这对于创建数字的可迭代变量非常有用,但是当您需要对可能被 in 运算符循环的数据进行迭代时,这并不是最佳选择。


如果您想了解更多信息,请查看如何使 Python 循环更 Pythonic。

您可以通过三种方式致电 range():


  1. range(stop) 有一个论点。

  2. range(start, stop) 有两个参数。

  3. range(start, stop, step) 需要三个参数。

1. range(stop)

当您 range()使用一个参数调用时,您将获得一系列数字,其起始于 0 并包括直到(但不包括)以所提供的数字为单位的所有整数 stop。


这是实际的情况:


for i in range(3):    print(i)
复制代码


循环的输出将如下所示:


012
复制代码


可以检查出:我们拥有从 0 到的所有整数,但不包括 3 您提供的 stop。


2. range(start, stop)

当 range()使用两个参数进行调用时,不仅要决定一系列数字的终止位置,而且还要决定其起始位置,因此您不必一直都在开始 0。您可以使用 range()来从一系列数字的一到乙使用 range(A, B)。让我们了解如何从开始生成范围 1。


尝试 range()使用两个参数进行调用:


for i in range(1, 8):    print(i)
复制代码


您的输出将如下所示:


1234567
复制代码


到目前为止,一切都很好:您拥有从 1(您提供的编号 start)到但不包括 8(您提供的编号 stop)的所有整数。


但是,如果再添​​加一个参数,则可以重用之前使用名为的列表时得到的输出 numbersdivisibleby_three。


3. range(start, stop, step)

当 range()使用三个参数调用时,不仅可以选择一系列数字的起始和终止位置,还可以选择一个数字与下一个数字之间的差值。如果不提供 step,那么 range()会自动表现得好像 step 是 1。


注意: step 可以是正数或负数,但不能是 0:


>>> range(1, 4, 0)Traceback (most recent call last):  File "<stdin>", line 1, in <module>ValueError: range() arg 3 must not be zero
复制代码


如果您尝试将其 0 用作步骤,则会收到错误消息。


现在,您知道如何使用它 step,您终于可以重新访问我们之前用除以看到的那个循环 3。


自己尝试:


for i in range(3, 16, 3):    quotient = i / 3    print(f"{i} divided by 3 is {int(quotient)}.")
复制代码


输出将看起来就像 for 循环您看到本文前面的输出,当你使用命名名单


numbers_divisible_by_three:
3 divided by 3 is 1.6 divided by 3 is 2.9 divided by 3 is 3.12 divided by 3 is 4.15 divided by 3 is 5.
复制代码


如本例所示,您可以使用 step 参数将其增加到更大的数字。这就是所谓的增量。

随着增加 range()

如果要增加,则需要 step 为正数。要了解这实际上意味着什么,请输入以下代码:


for i in range(3, 100, 25):    print(i)
复制代码


如果您 step 是 25,则循环的输出将如下所示:


3285378
复制代码


你有一定范围的各自大于由前面的数字号码 25 中,step 您所提供。


既然您已经了解了如何在范围内前进,那么现在该看看如何向后退。

递减 range()

如果您的观点 step 是肯定的,那么您将经历一系列递增的数字并且正在递增。如果您 step 为负数,那么您将经历一系列递减的数字并递减。这使您可以倒转数字。


在以下示例中,您 step 为-2。这意味着您将为 2 每个循环递减:


for i in range(10, -6, -2):    print(i)
复制代码


递减循环的输出将如下所示:


1086420-2-4
复制代码


您得到的数字范围分别比前面的数字小,即您提供 2 的绝对值 step。


创建递减范围的最 Pythonic 方法是使用 range(start, stop, step)。但是 Python 确实具有内置 reversed 功能。如果包裹 range()在中 reversed(),则可以按相反顺序打印整数。


试试看:


for i in reversed(range(5)):    print(i)
复制代码


您将获得:


43210
复制代码


range()使得可以对递减的数字序列进行迭代,而 reversed()通常用于以相反的顺序循环序列。


注意: reversed()也适用于字符串。您可以 reversed()在如何在Python中反转字符串中了解有关 with 字符串功能的更多信息。


Python range()函数的高级用法示例

既然您已经知道了如何使用的基础知识 range(),那么该深入了解了。


range() 主要用于两个目的:


  1. 执行 for 循环的主体特定次数

  2. 比使用列表或元组创建更有效的整数可迭代

第一次使用可能是最常见的用法,并且可以证明itertools为您提供了一种比构造 iterables 更有效的方式 range()。


使用范围时,请记住以下几点。


range() 是 Python 中的一种类型:


>>> type(range(3))<class 'range'>
复制代码


您可以 range()像按列表一样访问 by 索引中的项目:


>>> range(3)[1]1>>> range(3)[2]2
复制代码


您甚至可以在上使用切片符号 range(),但是一开始在 REPL 中的输出似乎有点奇怪:


>>> range(6)[2:5]range(2, 5)
复制代码


虽然该输出可能看起来很奇怪,但将 a 切片 range()仅会返回另一个 range()。


您可以访问 range() by 元素并切片 arange()的事实突出了一个重要事实:range()与列表不同,它是惰性的,但不是迭代器

浮动和 range()

您可能已经注意到,到目前为止,我们一直在处理的所有数字都是整数,也称为整数。那是因为 range()只能接受整数作为参数。


浮游物语

在 Python 中,如果数字不是整数,则为浮点数。整数和浮点数之间有一些区别。


整数(int 数据类型):


  • 是整数

  • 不包含小数点

  • 可以是正数,负数或 0


浮点数(float 数据类型):


  • 可以是任何包含小数点的数字

  • 可以是正数或负数


尝试 range()以浮点数进行通话,看看会发生什么:


for i in range(3.3):    print(i)
复制代码


您应该收到以下错误信息:


Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'float' object cannot be interpreted as an integer
复制代码


如果需要找到一种允许使用浮点数的解决方法,则可以使用 NumPy。


range()与 NumPy 一起使用

NumPy是第三方 Python 库。如果要使用 NumPy,则第一步是检查是否已安装它。


您可以在 REPL 中执行以下操作:


>>> import numpy
复制代码


如果您获得 ModuleNotFoundError,则需要安装它。为此,请转到命令行并输入 pip install numpy。


安装完成后,放入以下内容:


import numpy as np
np.arange(0.3, 1.6, 0.3)
复制代码


它将返回此:


array([0.3, 0.6, 0.9, 1.2, 1.5])
复制代码


如果要在每个行上打印每个数字,可以执行以下操作:


import numpy as np
for i in np.arange(0.3, 1.6, 0.3): print(i)
复制代码


这是输出:


0.30.60.89999999999999991.21.5
复制代码


哪里 0.8999999999999999 来的?


计算机在将十进制浮点数保存为二进制浮点数时遇到麻烦。这导致各种意外的数字表示。


注意:要了解有关为什么存在代表小数的问题的更多信息,可以查看本文和Python文档


您可能还想看一看十进制库,它在性能和可读性方面有些降级,但允许您精确地表示十进制数。


另一个选择是使用 round(),您可以在如何在Python中对数字进行四舍五入了解更多信息。请记住,round()它有自己的怪癖,可能会产生一些令人惊讶的结果!


这些浮点错误是否对您来说是一个问题,取决于您要解决的问题。错误将在小数点后第 16 位出现,这在大多数情况下都是无关紧要的。它们是如此之小,除非您正在计算卫星轨道轨迹或其他东西,否则您无需担心。


另外,您也可以使用 np.linspace()。它实际上执行相同的操作,但是使用不同的参数。使用 np.linspace(),您可以指定 start 和 end(包括两者)以及数组的长度(而不是 step)。


例如,np.linspace(1, 4, 20)给出 20 个等距的数字:1.0, ..., 4.0。另一方面,np.linspace(0, 0.5, 51)给出 0.00, 0.01, 0.02, 0.03, ..., 0.49, 0.50。


注意:要了解更多信息,您可以阅读Look Ma,No-Loops:使用NumPy进行数组编程,以及此便捷的 NumPy 参考。


前进并循环

现在,您了解了如何使用 range()和解决其局限性。您还应该了解此重要功能在 Python 2 和 Python 3 之间如何演变。


下次您需要执行特定次数的操作时,一切都准备好了!


快乐的 Pythoning!

参考

https://realpython.com/python-range/


3. Tips: 学习至少一个技术技巧

笔者的文章:

Postman 导出 curl命令 到命令行运行 Mac OS

说明

Postman 导出 curl 命令的步骤:

1. 请求链接:点击 Code


2. copy cURL 的请求链接

3. 导出 curl 到 Terminal 运行

curl -X POST \  https://run.mocky.io/v3/e95f6c35-b3c8-43d9-b9ab-f5ce8c1054cf \  -H 'cache-control: no-cache'
复制代码



4. Share: 分享一篇有观点和思考的技术文章

AWS知识图谱大赛 -- 负面新闻影响股票基金预测系统架构设计文档

1 设计概述

负面新闻影响股票基金系统,是根据历史新闻数据训练出来对股票基金模型,用近来的新闻通过图数据库关联,查找出可能有负面影响的股票、基金。

1.1 功能概述

负面新闻影响股票基金预测系统,主要功能包括,收集新闻数据,对新闻数据抽离出公司、关键人物等实体,舆情对实体的情感分析,和最终股票基金走势建立关联关系。最终得到训练出来的模型,经过不断的参数调优,使模型预测准确率能达到 95%以上的预测。

1.1.1 数据获取以及存储场景如下:

a) 获取新闻数据的渠道:爬虫系统、海知(第三方公司)提供、通联(第三方公司)提供。

b) 获取股票数据的渠道:通联(第三方公司)提供。

c) 分析系统对新闻数据、股票进 NLP 分析,比如对新闻数据进行情感分析,分析出负面新闻。

d) 图数据库 Neptune 导入数据(格式 CSV),新闻数据、股票数据;

用例图,主要角色有爬虫系统、海知(第三方公司)、通联(第三方公司)、分析系统、Neptune 图数据库。




1.1.2 训练模型以及预测用例图:

场景如下:

1)SageMaker 训练模型;

2)部署模型系统;

3)预测股票基金走势;

4)预测结果与实际结果进行对比,多维度打分;

5)重复上面的步骤,优化模型,提升预测分数。




1.2 ⾮功能约束

负面新闻影响股票基金预测系统,预计能在数分钟内预测股票走势。

1.查询性能⽬标:平均响应时间<300m s,95% 响应时间<500m s,单机 T PS>100;

2.监控性能⽬标:平均响应时间<800m s,95% 响应时间<1000m s,单机 T PS>30;

3.系统核⼼功能可⽤性⽬标:>99.99% ;

4.系统安全性⽬标:系统可拦截 DDDOS 攻击,密码数据散列加密,客户端数据 HT T PS 加密,外部系统间通信对称加密;

5.数据持久化⽬标:>99.999% 。


1.3 用户流程


1.4 产品概况


2. 系统部署图与整体设计

系统上线时预计部 9 台物理机, 1 台 API Gateway, 2 台 Cache,1 台 LoadBanlance Server, 2 台 LambdaServer,3 台 Neptune 图数据库 。




图片来自:

https://github.com/aws-samples/amazon-neptune-samples/blob/master/gremlin/visjs-neptune/README.md


2.1 知识图谱架构图




2.2 数据展示 时序图




2.3 新闻数据获取、以及导入图数据库 Neptune 场景系统序列图




说明:第三方数据,为比如通连、海知等第三方公司提供的数据。

2.4 模型训练及模型应用预测趋势时序图




3. 训练模型流程图 -- 负面新闻影响股票基金




基金经理查询影响股票流程图





3.1 模型状态图




a) 训练模型>评分满意或者不能继续优化 > 训练结束。

b) 训练模型>评分不满意> 回到上一步继续优化。

待讨论问题:

  1. 正向和负面新闻是否有抵消作用,还是参考 PageRank 类似算法加权算影响因子。

  2. 股票价值有三个流派:一、内在价值(巴菲特的价值投资);二、市场价值,比如内在价值只 100 块,但是市场都说值 90 块,那就值 90 块;3、历史数据推导出来的价值;如果用舆情判断股价,那么就属于市场价值流派。


API 数据格式

https://run.mocky.io/v3/358122ac-7139-4332-ae1b-e51acf82f842


{	"alerts": [{		"stock": "hsbc",		"news": [{			"title": "title1",			"link": "https://www.bing.com",			"entity": [{				"label": "label1",				"value": ["value1", "value2"]			}]		}]	}, {		"stock": "汇丰银行",		"news": [{			"title": "title1",			"link": "https://www.bing.com",			"entity": [{				"label": "label1",				"value": ["value1", "value2"]			}]		}]	}]}
复制代码


团队介绍


发布于: 2020 年 11 月 15 日阅读数: 55
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
动态规划 求最大连续子数组、Python range 函数指南、Postman 导出 curl命令、AWS知识图谱大赛架构设计、John 易筋 ARTS 打卡 Week 26