一、數據準備數組
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
二、構造日期數據結構
#推導式comprehensions(又稱解析式),是Python的一種獨有特性。推導式是能夠從一個數據序列構建另外一個新的數據序列的結構體。
#列表推導式函數
date_array = [str(date_base + ind) for ind, _ in enumerate(price_array)] print(date_array)
返回spa
['20170118', '20170119', '20170120', '20170121', '20170122']
三、生成日期價格對code
3.1 列表格式orm
# zip函數
stock_tuple_list = [(date, price) for date, price in zip(date_array, price_array)] print(stock_tuple_list)
返回blog
[('20170118', '30.14'), ('20170119', '29.58'), ('20170120', '26.36'), ('20170121', '32.56'), ('20170122', '32.82')]
3.2 字典格式ip
#字典推導式 stock_dict = {date: price for date, price in zip(date_array, price_array)} print(stock_dict)
返回it
{'20170118': '30.14', '20170119': '29.58', '20170120': '26.36', '20170121': '32.56', '20170122': '32.82'}
3.3 元組格式io
# 可命名元組 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)) 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