Jupyter Notebook
Untitled12
最后检查: 几秒前
(自动保存)
#1 数据类型
i=1
type(i)
f=1.1
type(f)
b=(1>2)
type(b)
price_str = '30.14, 29.58, 26.36, 32.56, 32.82'
type(price_str)
print ('旧的price_str id= {}'.format(id(price_str)))
price_str = price_str.replace(' ', '')
print ('新的price_str id= {}'.format(id(price_str)))
price_str
#2.1 生成列表
price_array=price_str.split(",")
price_array.append('9.99')
print(price_array)
#2.2 用列表生成集合
set(price_array)
#2.3 用for循环生成列表
date_array=[]
date_base=20200418
for _ in range(0,len(price_array)): #无用的循环计数变量建议用"_"声明
date_array.append(str(date_base))
date_base+=1
date_array
#2.4 用列表推导式简化
#enumerate()函数将列表转换为下标和数值二维列表
date_base=20200418
date_array=[str(date_base+ind) for ind,_ in enumerate(price_array)]
date_array
#3 可命名元组,namedtuple, zip函数
from collections import namedtuple
stock_namedtuple = namedtuple('stock', ('date','price'))
stock_namedtuple_list = [stock_namedtuple(date, price) for date,price in zip(date_array,price_array)]
stock_namedtuple_list
#4 字典推导式 {key:value for in}
from collections import OrderedDict
stock_dict=OrderedDict((date,price) for (date,price) in zip(date_array,price_array))
stock_dict.keys()
min(zip(stock_dict.values(),stock_dict.keys()))
min(zip(stock_dict.values(),stock_dict.keys()))
#5 匿名函数 返回最大值最小值
find_2nd_max_value=lambda dict_array: sorted(zip(dict_array.values(),dict_array.keys()))
find_2nd_max_value(stock_dict)[-1],find_2nd_max_value(stock_dict)[0]
#6 高阶函数
#map()函数,接收两个参数,一个是函数,一个是序列,map()把传入的函数依次作用于序列的每个元素,并把结果作为新的序列返回;
#filter()函数,接收两个参数,一个是函数,一个是序列,filter()把传入的函数依次作用于每个元素,根据返回值是True还是False决定是保留还是丢弃该元素,结果序列是所有返回值为True的子集;
#reduce()函数,把一个函数作用在一个序列上,这个函数必须接收两个参数,其中reduce()函数把结果继续和序列的下一个元素做累积计算,reduce()函数只返回值结果非序列。
#从收盘价格,推导出每天的涨跌幅度。
#首先将两两相邻的收盘价格组成tuple后装入list
#stock_dict是ordereddic,date已排序
price_float_array=[float(price_array) for price_array in stock_dict.values()]
pp_array=[(price1,price2) for price1,price2 in zip(price_float_array[:-1],price_float_array[1:])]
#下面使用高阶函数map()和reduce()结合lambda函数完成需求,推导出每天的涨跌幅度。
#外层使用map()函数针对pp_array的每一个元素执行操作,内层使用reduce()函数即两个相邻的价格,求出涨跌幅度,返回外层结果list。
#python3使用reduce需要import一下:
from functools import reduce
# round将float保留几位小数,以下保留3位
#map、reduce和嵌套lambda的结合运用
new_array = map(
lambda pp: reduce(lambda a, b: round((b - a) / a, 3), pp),
pp_array)
#注意,上面代码其实完全没必要用reduce,完全可以直接用下面代码更简洁而且能更好理解:
new_array = map(
lambda n: round((n[1] - n[0]) / n[0], 3),
pp_array)
# new_array是个迭代器,用list方法转换成列表,用 insert插入数据,将第一天的涨跌幅设置为0
change_array=list(new_array)
change_array.insert(0,0)
change_array
#从收盘价格,推导出每天的涨跌幅度。
#首先将两两相邻的收盘价格组成tuple后装入list
#stock_dict是ordereddic,date已排序
price_float_array=[float(price_array) for price_array in stock_dict.values()]
pp_array=[(price1,price2) for price1,price2 in zip(price_float_array[:-1],price_float_array[1:])]
#下面使用高阶函数map()和reduce()结合lambda函数完成需求,推导出每天的涨跌幅度。
#外层使用map()函数针对pp_array的每一个元素执行操作,内层使用reduce()函数即两个相邻的价格,求出涨跌幅度,返回外层结果list。
#map、reduce和嵌套lambda的结合运用
# round将float保留几位小数,以下保留3位
#python3使用reduce需要import一下
from functools import reduce
new_array = map(
lambda pp: reduce(lambda a, b: round((b - a) / a, 3), pp),
pp_array)
# new_array是个迭代器,用list方法转换成列表,用 insert插入数据,将第一天的涨跌幅设置为0
change_array=list(new_array)
change_array.insert(0,0)
change_array
#通过namedtuple重构数据结构加入变动,通过zip从date,price,change三个列表取数,用ordereddic组成字典用date作为key
stock_namedtuple=namedtuple('stock',('date','price','change'))
stock_dict=OrderedDict((date,stock_namedtuple(date,price,change)) for date,price,change in zip(date_array,price_array,change_array))
stock_dict
#通过filter函数筛选数据
up_days=filter(lambda day:day.change>0 ,stock_dict.values())
list(up_days)
#7 下面用一个通用的函数来完成筛选涨跌日和涨跌幅或求和的需求。
def filter_stock(stock_array_dict,want_up=True,want_calc_sum=False):
if not isinstance(stock_array_dict,OrderedDict):
#如果类型不是OrderedDict则产生错误
raise TypeError("stock_array_dict type must be OrderedDict!")
#python中的三目表达式的写法
filter_func=(lambda day: day.change>0 if want_up else change<0)
#使用filter_func作为筛选函数
want_days=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
list(filter_stock(stock_dic,want_up=True,want_calc_sum=False))
#filter_stock(stock_dic,want_up=True,want_calc_sum=True)
#8 偏函数 对多参数函数的简化
from functools import partial
filter_stock_updays=partial(filter_stock,want_up=True,want_calc_sum=False)
filter_stock_up_sum=partial(filter_stock,want_up=True,want_calc_sum=True)
print('上涨的天数明细{}\n总涨幅{}'.format(list(filter_stock_updays(stock_dic)),filter_stock_up_sum(stock_dic)))
(未完)
转载请注明链接:https://mp.csdn.net/console/editor/html/106218355