# -*- coding: utf-8 -*-
# @Author: fangbei
# @Date:   2017-08-26
# @Original:

price_str = '30.14, 29.58, 26.36, 32.56, 32.82'
price_str = price_str.replace(' ', '')  #删除空格
price_array = price_str.split(',')      #转成数组

date_array = []
date_base = 20170118
'''
# for 循环
for _ in range(0, len(price_array)):
    date_array.append(str(date_base))
    date_base += 1
'''

#推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。

#列表推导式
date_array = [str(date_base + ind) for ind, _ in enumerate(price_array)]
print(date_array)
# ['20170118', '20170119', '20170120', '20170121', '20170122']

# zip函数
stock_tuple_list = [(date, price) for date, price in zip(date_array, price_array)]
print(stock_tuple_list)
# [('20170118', '30.14'), ('20170119', '29.58'), ('20170120', '26.36'), ('20170121', '32.56'), ('20170122', '32.82')]

#字典推导式
stock_dict = {date: price for date, price in zip(date_array, price_array)}
print(stock_dict)
# {'20170118': '30.14', '20170119': '29.58', '20170120': '26.36', '20170121': '32.56', '20170122': '32.82'}

# 可命名元组 namedtuple
from collections import namedtuple
stock_nametuple = namedtuple('stock', ('date', 'price'))
stock_nametuple_list = [stock_nametuple(date, price) for date, price in zip(date_array, price_array)]
print(stock_nametuple_list)
# [stock(date='20170118', price='30.14'), stock(date='20170119', price='29.58'), stock(date='20170120', price='26.36'), stock(date='20170121', price='32.56'), stock(date='20170122', price='32.82')]

# 有序字典 OrderedDict
from collections import OrderedDict
stock_dict = OrderedDict((date, price) for date, price in zip(date_array, price_array))
print(stock_dict.keys())
# odict_keys(['20170118', '20170119', '20170120', '20170121', '20170122'])

#最小收盘价
print(min(zip(stock_dict.values(), stock_dict.keys())))
# ('26.36', '20170120')

#lambad函数
func = lambda x:x+1
#以上lambda等同于以下函数
def func(x):
    return(x+1)
#找出收盘价中第二大的价格
find_second_max_lambda = lambda dict_array : sorted(zip(dict_array.values(), dict_array.keys()))[-2]
print(find_second_max_lambda(stock_dict))
# ('32.56', '20170121')

#高阶函数
#将相邻的收盘价格组成tuple后装入list
price_float_array = [float(price_str) for price_str in stock_dict.values()]
pp_array = [(price1, price2) for price1, price2 in zip(price_float_array[:-1], price_float_array[1:])]
print(pp_array)
# [(30.14, 29.58), (29.58, 26.36), (26.36, 32.56), (32.56, 32.82)]

from functools import reduce
#外层使用map函数针对pp_array()的每一个元素执行操作,内层使用reduce()函数即两个相邻的价格, 求出涨跌幅度,返回外层结果list
change_array = list(map(lambda pp:reduce(lambda a,b: round((b-a) / a, 3),pp), pp_array))
# print(type(change_array))

change_array.insert(0,0)
print(change_array)
# [0, -0.019, -0.109, 0.235, 0.008]

#将涨跌幅数据加入OrderedDict,配合使用namedtuple重新构建数据结构stock_dict
stock_nametuple = namedtuple('stock', ('date', 'price', 'change'))
stock_dict = OrderedDict((date, stock_nametuple(date, price, change))
                         for date, price, change in
                         zip(date_array, price_array, change_array))
print(stock_dict)
# OrderedDict([('20170118', stock(date='20170118', price='30.14', change=0)), ('20170119', stock(date='20170119', price='29.58', change=-0.019)), ('20170120', stock(date='20170120', price='26.36', change=-0.109)), ('20170121', stock(date='20170121', price='32.56', change=0.235)), ('20170122', stock(date='20170122', price='32.82', change=0.008))])
#用filter()进行筛选,选出上涨的交易日
up_days = list(filter(lambda day: day.change > 0, stock_dict.values()))
print(up_days)
# [stock(date='20170121', price='32.56', change=0.235), stock(date='20170122', price='32.82', change=0.008)]

#定义函数计算涨跌日或涨跌值
def filter_stock(stock_array_dict, want_up=True, want_calc_sum=False):
    if not isinstance(stock_array_dict, OrderedDict):
        raise TypeError('stock_array_dict must be OrderedDict')

    filter_func = (lambda day: day.change > 0) if want_up else (lambda day: day.change < 0)

    want_days = list(filter(filter_func, stock_array_dict.values()))

    if not want_calc_sum:
        return want_days

    change_sum = 0.0
    for day in want_days:
        change_sum += day.change

    return change_sum

#偏函数 partial
from functools import partial
filter_stock_up_days    = partial(filter_stock, want_up=True,  want_calc_sum=False)
filter_stock_down_days  = partial(filter_stock, want_up=False, want_calc_sum=False)
filter_stock_up_sums    = partial(filter_stock, want_up=True,  want_calc_sum=True)
filter_stock_down_sums  = partial(filter_stock, want_up=False, want_calc_sum=True)

print('所有上涨的交易日:{}'.format(list(filter_stock_up_days(stock_dict))))
print('所有下跌的交易日:{}'.format(list(filter_stock_down_days(stock_dict))))
print('所有上涨交易日的涨幅和:{}'.format(filter_stock_up_sums(stock_dict)))
print('所有下跌交易日的跌幅和:{}'.format(filter_stock_down_sums(stock_dict)))
# 所有上涨的交易日:[stock(date='20170121', price='32.56', change=0.235), stock(date='20170122', price='32.82', change=0.008)]
# 所有下跌的交易日:[stock(date='20170119', price='29.58', change=-0.019), stock(date='20170120', price='26.36', change=-0.109)]
# 所有上涨交易日的涨幅和:0.243
# 所有下跌交易日的跌幅和:-0.128

Python量化教程 常用函数的更多相关文章

  1. Python 数据类型,常用函数方法分类

    Python基本数据类型:(int) 字符串(str)列表(list)元组(tuple)字典(dict)布尔(bool) python中可以简单使用 类型(数据)创建或转换数据 例: #字符串转数字 ...

  2. Python math库常用函数

    math库常用函数及举例: 注意:使用math库前,用import导入该库>>> import math 取大于等于x的最小的整数值,如果x是一个整数,则返回x>>> ...

  3. Python数据分析--Numpy常用函数介绍(2)

    摘要:本篇我们将以分析历史股价为例,介绍怎样从文件中载入数据,以及怎样使用NumPy的基本数学和统计分析函数.学习读写文件的方法,并尝试函数式编程和NumPy线性代数运算,来学习NumPy的常用函数. ...

  4. python笔记-正则表达式常用函数

    1.re.findall()函数 语法:re.findall(pattern,string,flags=0) --> list(列表) 列出字符串中模式的所有匹配项,并作为一个列表返回.如果无匹 ...

  5. Python 学习:常用函数整理

    整理Python中常用的函数 一,把字符串形式的list转换为list 使用ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from as ...

  6. Python基础:常用函数

    1:enumerate enumerate(sequence, start=0) 该函数返回一个enumerate对象(一个迭代器).其中的sequence参数可以是序列.迭代器或者支持迭代的其他对象 ...

  7. Python OS模块常用函数说明

    Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Wi ...

  8. .Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]

       今天主要记录,Python中函数的使用以及异常处理. 一.函数:    1.函数的创建以及调用. def Add(val1,val2): return val1+val2; print Add( ...

  9. Python基础(一)常用函数

    1.map() 此函数可以,将列表内每一个元素进行操作,并返回列表 原型 map(function,[list]) def fc(x): return x * 2 print(map(fc,[1,2, ...

随机推荐

  1. Labview按钮的机械动作

    LabVIEW 对于按钮控件的机械动作提供了六个不同的选择,它们可以通过右键按钮并选择机械动作来找到.这些不同的选项导致按钮输出的值的行为不同.下里将这六个选项做一个简短的总结: 单击时转换当用鼠标将 ...

  2. sqlldr导入数据(以PostgreSql>>>Oracle为例)

    1.在目标数据库中创建表 1.1点击源表,复制创建语句 1.2 修改数据类型以匹配目标数据库,如: 字符串类型:character varying(20)>>>varchar2(20 ...

  3. 第二章 入门(MyBatis)

    本章将会以简略的步骤告诉你如何安装和创建 MyBatis-Spring,并构建一个简单的数据访问事务性的应用程序. Installation 要使用 MyBatis-Spring 模块,你只需要包含 ...

  4. sftp,get命令使用*通配符的方式获取批量的文件

    需求描述: 今天在使用sftp进行get文件的时候,有很多文件名类似的文件,以为还是需要一个一个get 后来发现get也可以使用通配符的方式进行匹配获取多个文件,在此记录下 操作过程: 1.通过sft ...

  5. brew faq:call ISHELL_GetJulianDate always return 1980 1 6

    假设你当时系统的时间为20130804000000,那么如果你将系统的时间改为20140104000000,那么ISHELL_GetJulianDate  将返回20140104000000. 但如果 ...

  6. POJ 2392 Space Elevator(多重背包变形)

    Q: 额外添加了最大高度限制, 需要根据 alt 对数据进行预处理么? A: 是的, 需要根据 alt 对数组排序 Description The cows are going to space! T ...

  7. OnGlobalLayoutListener用法

    1.implements ViewTreeObserver.OnGlobalLayoutListener{} 2.mContentView.getViewTreeObserver().addOnGlo ...

  8. 《ASP.NET MVC4 WEB编程》学习笔记------乐观锁和悲观锁

    摘要:对数据库的并发访问一直是应用程序开发者需要面对的问题之一,一个好的解决方案不仅可以提供高的可靠性还能给应用程序的性能带来提升.下面我们来看一下Couchbase产品市场经理Don Pinto结合 ...

  9. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

  10. vue-学习笔记(更新中...)

    vue学习笔记 2017-08-23  11:10:28 Vue实例: var vm = new Vue({ // 选项 }) 实例化Vue.Vue实例,构造函数Vue.创建一个Vue的根实例,Vue ...