开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情
前言
相信自己,一定可以实现小目标,撸起袖子就是干,加油!!!⛽️
上一章我们讲了获取单个股票行情,并存入csv文件
今天我们的任务是:
- 完成数据的更新,就是每次我们在获取数据的时候,先根据股票代码,读取csv文件,获取当前csv的最后一天的时间,在更新文件中最后一天到今天的数据进行查询,写入到csv文件中
- 读取csv文件,获取
更新csv文件中当前股票数据
- 首先判断当前股票的
csv文件是否存在- 不存在-重新获取
- 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
# 全局变量
data_root = '/Users/wson/Desktop/Trader/data/';
def update_daily_price(stock_code, start_data):
# 是否存在文件:不存在-重新获取, 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
file_root = data_root + '/' + stock_code + '.csv';
# 如果存在对应文件
if os.path.exists(file_root):
# 读取csv文件,并获取csv文件中最后一天的时间
startdate = pd.read_csv(file_root, usecols=['date'])['date'].iloc[-1];
# 请求csv文件中最后一天到今天的数据
df = get_single_stock_price(stock_code, startdate, datetime.datetime.today().strftime('%Y%m%d'));
# 添加到csv文件中
export_stock_data(df, stock_code, 'price', 'a');
else:
# 重新获取该股票行情数据
df = get_single_stock_price(stock_code);
export_stock_data(df, stock_code, 'price');
print('数据已经更新成功', stock_code);
但是我们此时发现一个问题,如果我们想获取的数据的开始时间小于csv文件中的开始时间怎么办,所以我们还得在方法中添加一个参数start_data,用来判断start_data是小于csv文件的时间列的第一个值
- 大于等于:不用更新数据
- 小于: 更新从
start_data到csv文件第一个时间的数据,存入csv文件
# 判断start_data是小于csv文件的时间列的第一个值
csv_start_data = date_columns_data['date'].iloc[1];
# 转化为时间戳
t1 = pd.Timestamp(start_data)
t2 = pd.Timestamp(csv_start_data)
if t1 < t2:
print("执行了");
# 请求t1到t2的时间
df = get_single_stock_price(stock_code, start_data, csv_start_data);
# 添加到csv文件中
export_stock_data(df, stock_code, 'a');
最后的update_daily_price函数
def update_daily_price(stock_code, start_data):
# 是否存在文件:不存在-重新获取, 存在-获取csv文件中的最后一天,然后请求csv文件中的最后一天到今天的数据,并写入csv文件中
file_root = data_root + '/' + stock_code + '.csv';
date_columns_data = pd.read_csv(file_root, usecols=['date']);
# 如果存在对应文件
if os.path.exists(file_root):
# 读取csv文件,并获取csv文件中最后一天的时间
startdate = date_columns_data['date'].iloc[-1];
# 请求csv文件中最后一天到今天的数据
df = get_single_stock_price(stock_code, startdate, datetime.datetime.today().strftime('%Y%m%d'));
# 添加到csv文件中
export_stock_data(df, stock_code, 'a');
else:
# 重新获取该股票行情数据
df = get_single_stock_price(stock_code);
export_stock_data(df, stock_code);
# 判断start_data是小于csv文件的时间列的第一个值
csv_start_data = date_columns_data['date'].iloc[0];
# 转化为时间戳
if start_data < csv_start_data:
print("执行了");
# 请求t1到t2的时间
df = get_single_stock_price(stock_code, start_data, csv_start_data);
# 添加到csv文件中
export_stock_data(df, stock_code, 'a');
print('数据已经更新成功', stock_code);
获取csv文件中的数据
这个获取数据就很好获取了,但是有时候我们只是获取某些列,并不是全部的列,这个时候我们可以加一个column, 类型为list, 用来告诉读取csv文件的时候,只读取部分列,并不是全部的列
def get_csv_price(code, start_date, end_date, columns=None):
"""
获取本地数据,且顺便完成数据更新工作
:param code: str,股票代码
:param start_date: str,起始日期
:param end_date: str,起始日期
:param columns: list,选取的字段
:return: dataframe
"""
# 使用update直接更新
update_daily_price(code, start_date);
# 读取数据
file_root = data_root + 'price/' + code + '.csv';
if columns is None:
data = pd.read_csv(file_root, index_col='date');
else:
data = pd.read_csv(file_root, usecols=columns, index_col='date')
# 根据日期筛选股票数据
return data[(data.index >= start_date) & (data.index <= end_date)];
接下来进行测试
import data.stock as st;
code = '000001';
data = st.get_csv_price(code, '2019-10-20');
print(data);
good 没有来问题