1、滑动窗口最小值
利用单调队列进行计算,
当遍历到某个元素j右侧时,若存在元素i在j左侧且lst[i] >= lst[j],则i是没有意义的,因为j元素永远比i元素更优先考虑。
维护单调队列,队列中的都是可能取得的有效值。假如范围超出,即sliding_window[0] <= i - period,则从队列左侧把元素弹出,保证在period之内。
def hdck(lst, period): # 求指定天数内滑动窗口的最小值,返回一个list
sliding_window = deque() # 设置滑动窗口,主要使用单调队列计算
l = len(lst)
ret = [] # 返回值
for i in range(l):
while sliding_window and lst[i] <= lst[sliding_window[-1]]:
sliding_window.pop()
sliding_window.append(i)
while sliding_window[0] <= i - period:
sliding_window.popleft()
ret.append(lst[sliding_window[0]])
return ret
2、使用mysql.connector连接数据库,如果连接时autocommit=False,在增加、删除、修改执行数据库语句之后记得commit,commit代表提交事务,查询目前来看不用提交事务也能获得结果。可以把excute很多语句之后一起commit,提高效率,excutemany()更快。
mydb = mysql.connector.connect(
host="127.0.0.1",
user="***",
passwd="***",
database="***",
autocommit=False
)
for i, code in enumerate(stock_info['code']): # 获取代码
individual_info = ak.stock_individual_info_em(symbol = code)
sql = "insert into mydatabase.gpxx values({},'{}','{}','{}');".format(id, code, name, industry)
mycursor.execute(sql)
mycursor.close()
mydb.commit()
3、dataframe类型某几列直接存入数据库,保证键相同
engine = create_engine("mysql+mysqlconnector://username:password@127.0.0.1:3306/dbname?charset=utf8")
dataframe[['a','b']].to_sql(name = 'gp' + code, con = engine, if_exists = 'append', index= False)
4、如何计算EMA
ret = [closes[0]] # EMA的第一个值就是他自己
for i, close in enumerate(closes[1:]):
tmp = (2 * close)
tmp2 = (num - 1) * ret[i]
ret.append((tmp + tmp2) / (num + 1))
5、列表生成式,实际就是for循环倒着写
# 二维转一维
code = [[1,2],[3,4]]
ret = [item for a in codes for item in a]
6、python连接数据库游标
如果不使用游标功能,直接使用select查询,会一次性将结果集打印到屏幕上,你无法针对结果集做第二次编程。使用游标功能后,我们可以将得到的结果先保存起来,然后可以随意进行自己的编程,得到我们最终想要的结果集。使用fetchone()或者fetchall()获取数据。
7、好久不用数据库,熟悉了一下基本操作
sql = "create table if not exists {}(id int primary key auto_increment,日期 DATE,开盘 float,收盘 float,涨跌幅 float,成交量 int)".format(name)
sql = "drop table if exists {}".format(name)
sql = "insert into mydatabase.gpxx values({},'{}','{}','{}');".format(id, code, name, industry)
sql = "select {} from {}".format(data, table)
8、对于千万条数据,一开始想直接存在一个数据库里,但是感觉应该太多了。于是分成5000张表,每张表2000条数据。不知道这样做对不对,再看看别人的操作或者以后操作的速度再优化。