tushare是一个财经数据获取库,内置若干财经数据的获取爬虫,将各种数据的爬取封装在了一起。但是tushare有一个很大的缺点,就是其抓取的数据无法缓存在本地。故考虑实现一组自己的api用以缓存tushare数据。
1 2 3 |
import tushare as ts industry_info = ts.get_industry_classified() profit_info = ts.get_profit_data(2017,1) |
这是python中获取tushare数据的典型例子,我们考虑实现一个简单的装饰函数,将函数调用以及调用的参数进行记忆化!
1 2 3 4 5 |
ts.get_industry_classified = data_cacher(ts.get_industry_classified) ts.get_profit_data = data_cacher(ts.get_profit_data) industry_info = ts.get_industry_classified() profit_info = ts.get_profit_data(2017,1) |
这里面data_cacher函数包装后的ts.api增加了将返回值保存为以“函数名”、“参数”命名的文件中,供下次调用直接使用。
最后,如何实现data_cacher函数呢?直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import attr import pandas as pd def data_cacher(func): def inner_function(*args,**kwargs): path = 'data/'+func.__name__ for w in args: path += '&'+str(w) for w in kwargs: path += '&'+w+'='+str(kwargs[w]) try: data = pd.DataFrame().from_csv(path) print("Use cache :",path) except FileNotFoundError: if 'fast_mode' in kwargs.keys() and kwargs['fast_mode'] == True: return pd.DataFrame() elif 'fast_mode' in kwargs.keys(): del kwargs['fast_mode'] print("Online => ",path) data = func(*args,**kwargs) #print(data,type(data),len(data)) if len(data) == 0: print("Empty...") return data data.to_csv(path) data = pd.DataFrame().from_csv(path) return data return inner_function |