时间转换

import time
a = '2020-03-06 19:18:00'
a1 = time.strptime(a,'%Y-%m-%d %H:%M:%S')  #格式化str为time格式
print(time.strftime('%Y%m%d',a1))  #格式化time格式为str
print(time.asctime(time.localtime(time.time())))  #格式化当前时间为   Thu Apr  7 10:29:13 2016
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))   # 格式化成2016-03-20 11:45:39形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))  # 格式化成Sat Mar 28 22:24:24 2016形式

a = "Sat Mar 28 22:24:24 2016"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))) # 将格式字符串转换为时间戳

import calendar
calendar.month(2016, 1)   #输出2016年1月份的日历

import pandas as pd
pd.to_datetime('2016-03-20').strftime('%Y%m%d')  #pandas 格式化str输出

from datetime import datetime,timedelta

datetime.today() # 返回当前时间时分秒都为0
now.isoweekday()# 返回的1-7代表周一--周日
now.weekday()# 返回的0-6代表周一--到周日

(pd.to_datetime('20200130')+timedelta(days=3)).strftime('%Y%m%d')  #格式化后三天的日期

now = datetime.now()+timedelta(days=3)
print(now.strftime('%Y-%m-%d')) #格式化当天后三天的日期

 

列表排序

a = ['e', 'a', 'u', 'o', 'i']
a.sort()  #升序 正序
a.sort(reverse=True)  # 降序 逆序   不能存变量
a.sort(key= lambda x : x[1]) # 根据第二个字母排序  默认根据第一个字母排序

sorted(a)  # 可存变量  保留原list  可传参数 reverse = True 降序 , reverse = False 升序(默认)
sorted([[6,7,8],[2,3,4],[1,2,3]], key=lambda x: x[2]) #多维列表 根据元素排序
sorted(lis,key=lambda x:cod.index(x[0])) #多维列表 根据单维列表进行指定排序  lis为多维 cod是单列表
[[k,v] for k,v in dict(new).items() if k not in dict(B1).keys()]  #二维列表转化成dict,比较两个列表i[0]的差集

['别墅' if '别墅' in i else '车位' if '车位' in i else '高层' for i in a]  #列表推导示例
[[i[0],i[2]] for i in old for v in new if i[0] == v[0] and i[2] != '0']


d = {'lily':25, 'wangjun':22, 'John':25, 'Mary':19}
sorted_keys = sorted(d) # 对字典而言,默认是对keys进行排序
print(sorted_keys)
sorted_keys1 = sorted(d, key=lambda x : x[1])
print(d_new2)

d_new = sorted(d.items(), key=lambda x: x[1], reverse=True) # 根据年龄排序,返回列表形式
print(d_new)
d_new = dict(d_new) # 使用内置函数把嵌套列表转换成字典
print(d_new)

sorted_values = sorted(d.values(), key=lambda x:x, reverse=False) # 排序值
print(sorted_values)

输出:
['John', 'Mary', 'lily', 'wangjun']
['wangjun', 'Mary', 'lily', 'John']
[('lily', 25), ('John', 25), ('wangjun', 22), ('Mary', 19)]
{'lily': 25, 'John': 25, 'wangjun': 22, 'Mary': 19}
[19, 22, 25, 25]


#互换dick的key和value
d = {'lily':25, 'wangjun':22, 'John':25, 'Mary':19}
d_new = {v:key for key,v in d.items()}
print(d_new)
输出:{25: 'John', 22: 'wangjun', 19: 'Mary'} 

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

编码转换

df.to_csv('abdata.csv', mode='a', encoding='utf_8_sig') # pandas导出csv 要指定编码

#python2 指定utf8
#coding:utf-8
import sys
reload(sys) 
sys.setdefaultencoding("utf-8")

f.write(unicode('%s-日期    成交:%s万   成交额:%s亿'%(i[0],i[1],i[2]),"utf-8")+ '\n')

 

pandas操作

from sqlalchemy import create_engine
from datetime import datetime,timedelta
import numpy as np
import pandas as pd
import tushare as ts 
import matplotlib.pyplot as plt
from matplotlib import colors
from pylab import mpl  #正常显示画图时出现的中文和符号
import time

ts.set_token("123")
pro = ts.pro_api()

pd.set_option('display.unicode.ambiguous_as_wide', True)  #设置中文列名对齐
pd.set_option('display.unicode.east_asian_width', True)  #设置列名对齐
pd.set_option('display.max_rows',None)     #显示所有行
pd.set_option('display.max_columns',None)  #显示所有列
pd.set_option('expand_frame_repr', False)  #设置不换行
pd.set_option('max_colwidth',100)   #设置显示最大字符
np.set_printoptions(suppress=True)  # 非科学计数法

mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

pd.options.mode.chained_assignment = None 

%matplotlib inline  #jupyter画图用
df['aa'].astype('float')  #转换整列格式
df.reset_index(drop=True)  #重置index索引 并删除原索引
dfs.drop_duplicates() #去除完全相同的行保留第一行
.loc['a1']#根据index获取行    .iloc[0].name #根据行号获取行的某个值
# loc和iloc 可以更换单行、单列、多行、多列的值
df1.loc[0,'age']=25      # 思路:先用loc找到要更改的值,再用赋值(=)的方法实现更换值
df1.iloc[0,2]=25         # iloc:用索引位置来查找

# at 、iat只能更换单个值
df1.at[0,'age']=25      # iat 用来取某个单值,参数只能用数字索引
df1.iat[0,2]=25         # at 用来取某个单值,参数只能用index和columns索引名称

#pivot()和unstack()实现行转列
dfcod = counts[['cod','key','日期1','日期2']].set_index(['key','日期1','日期2','cod']).unstack()
df1 , df2 = df[['日期1','日期2','key']] , df.pivot('日期2','cod',v)

#行转列 列转行参考
https://www.cnblogs.com/leohahah/p/9778304.html

#新增一行 用append 但必须要得先创建DataFrame才行
df1=df1.append(new,ignore_index=True)   # ignore_index=True,表示不按原来的索引,从0开始自动递增

#新增一列
tabsdetail['SH'] = sh.append([sh,sh,sh]).tolist()  #sh是Series
tabs.insert(0, '总金额', [m,m*2,m*3,m*4],allow_duplicates=True)  #指定位置添加一列

np.array(df0[['name','key']]).tolist()  #dataframe转化list

dfdata = pd.DataFrame()
dfdata  = dfdata.append(df1,ignore_index=True) #pandas append必须存入变量 否则不生效

pd.DataFrame([[1,2,3],[1,2,3]],columns=['a','b','c'],index=df0.index)  #创建dataframe
df0 = pd.DataFrame({'id':[3,4,5,6,7,3,4,5],
  'name':[10.54,11.11,12.80,10.05,11.21,10.98,11.12,10.55]},
  index=('a1','a2','a3','a4','a5','a6','a7','a8'))

df0.loc[df0['id'] == 3 ,'key'] = 1
df0.loc[df0['id'] == 5 ,'key'] = 0  # 进行布尔值判断 输出符合条件 
df0['key'] = np.where(df0['id'] == 3 ,1,0)

pd.concat([df0, df1], axis=1)  #合并两个dataframe 
df.index=pd.to_datetime(df.date)  # 将index 改为时间
df=df.sort_index() #排序index
df['ret']=df.close/df.close.shift(1)-1   # .shift(1) 获取下一个 .shift(-1) 获取上一个

data.sort_values(by=['标记','时间'],ascending=[False,True])  #多列排序指定升降序

df['当天'].fillna(method='ffill',inplace=True)  #根据一列nan值填充上一个不为nan的值

df['a'] = (df_new.ret+1.0).cumprod()  #计算当前值并累计连乘   .cumsum()累积连加

df1['ret'].diff()   # 比较上一值与当前值的差
[i for i in df["close"].rolling(k).mean()]   # 移动窗口list的均值
df['c'].rolling(window=10, min_periods=1, center=False).mean()  #Series中计算均值

#dataframe行转列 - 只能根据相同列名不同行名数据转置   适合matplotlib用 单index日期画图   比如多个日期 每个日期中需要转置的行名不得重复
df1 = df[['cod','盈亏','日期2']].pivot('日期2','cod','盈亏').rename_axis([None], axis=1)  # pivot 指定列名 行名 数据  只能固定这三个参数
df1 = df1.rename_axis(None, axis=1).reset_index()   # 取消第一个columns  将其拍平
df1.index=pd.to_datetime(df1.日期2)

#dataframe行转列 - 整合统计用   可以根据多个指定的index  但是set_index必须是前面列表-1的列 不然会乱 前面列表剩下的一个元素就是数据其他为index
dfcod = counts[['cod','key','盈亏','日期2','日期1']].set_index(['key','日期1','日期2','cod']).unstack()
dfcod.columns = [s1 +'_'+ str(s2) for (s1,s2) in dfcod.columns.tolist()]   # 将其拍平
# dfcod.reset_index(inplace=True)   # 重置index 转成正常的dataframe
dfcod.loc[['前10']]   # 根据key分组显示index和数据
dfcod

a1.index = a1.index.droplevel()  #删除一个多索引的index-names


# series 根据list 判断是否存在
df0[df0['id'].isin([3,4])]   #根据list获取列表信息
df0[~df0['id'].isin([3,4])]  #根据list获取列表信息 取反

# series 根据list 排序
df['words'] = df['words'].astype('category')  #必须转换成这个格式
  df['words'].cat.reorder_categories([1,2,3], inplace=True)  # list长度相等用这个
  df['words'].cat.set_categories([1,2,3], inplace=True) # list多 用这个
  df['words'].cat.set_categories([1,2,3], inplace=True)   # list少  用这个
df.sort_values('words', inplace=True)


#pandas 读写mysql
from sqlalchemy import create_engine
mysq = create_engine('mysql+pymysql://root:mysql.123@localhost/abdata?charset=utf8')
df.to_sql('coun',mysq,if_exists='append',index=False)  # 追加数据
df.to_sql('counts',mysq,if_exists='replace',index=False) #删除并写入表
df = pd.read_sql_query('select * from cod1',mysq)   # 查询mysql表


#pymysql读写mysql
import pymysql
conn = pymysql.connect('127.0.0.1', 'root', 'mysql.123', 'data',charset='utf8')
cur = conn.cursor()
sql1 = "SELECT * from (SELECT * from data1 ORDER BY id DESC LIMIT %s ) aa order by id" %sum
cur.execute(sql1)
c1 = cur.fetchall()  #读取mysql
conn.commit()  #写入mysql

cur.close()
conn.close()

 

DataFrame样式设置

def show(v):
col = 'black' if v > 0 else 'green'
return 'color:%s'%col

def background_gradient(s, m, M, cmap='PuBu', low=0, high=0.8):
rng = M - m
norm = colors.Normalize(m - (rng * low),M + (rng * high))
normed = norm(s.values)
c = [colors.rgb2hex(x) for x in plt.cm.get_cmap(cmap)(normed)]
return ['background-color: %s' % color for color in c]

def highlight_max(s,m):
is_max = s == m
return ['background-color:yellow' if v else '' for v in is_max]


tabs.style.applymap(show).background_gradient(cmap='Reds',axis = 1,low = 0,high = 1,subset = set1).\
apply(background_gradient,cmap='Purples',m=tabs[set2].min().min(),M=tabs[set2].max().max(),low=0,high=1,subset = set2).\
apply(highlight_max,m=tabs[set2].max().max()).background_gradient(cmap='Wistia',axis = 1,subset=['总金额'])

accdeteil.style.applymap(show).background_gradient(cmap='Reds',axis = 1,low = 0,high = 1).\
background_gradient(cmap='Reds',axis = 1,low = 0,high = 1 ,subset=set2).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前10',:'9']).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前20',:'9']).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前05','1_':]).\
background_gradient(cmap='Purples',axis = 1,low = 0,high = 1,subset = pd.IndexSlice['前15','1_':]).\
background_gradient(cmap='GnBu',axis = 0,low = 0,high = 1 ,subset=['SH_']).\
apply(highlight_max,m=tabs[set2].max().max())


#可参考
https://blog.csdn.net/xiaodongxiexie/article/details/71202279

#颜色样式
https://matplotlib.org/tutorials/colors/colormaps.html

 

pandas作图

import matplotlib.pyplot as plt

ax1 = df1[['策略净值','指数净值']].plot(figsize=(15,8))  #dataframe折线图
ax1 = ax1.axhline(y=1,ls=":",c="r"),ax1.legend(loc = 'upper right')   #标记0线和指定图例位置
plt.title('策略简单回测%s'%x,size=15)
plt.xlabel('')

for i in range(len(df1)):
    if df1['当天仓位'][i]==0 and df1['当天仓位'].shift(-1)[i]==1:
        plt.annotate('',xy=(df1.index[i],df1.策略净值[i]),arrowprops=dict(facecolor='r',shrink=0.05))   #标记买卖点
    if df1['当天仓位'][i]==0 and df1['当天仓位'].shift(1)[i]==1:
        plt.annotate('',xy=(df1.index[i],df1.策略净值[i]),arrowprops=dict(facecolor='g',shrink=0.1))

bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)  #指定文字边框样式
t = f'累计收益率:策略{TA1}%,指数{TA2}%;\n年化收益率:策略{AR1}%,指数{AR2}%;'+\
f'\n最大回撤:  策略{MD1}%,指数{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}'
plt.text(df1.index[0], df1['指数净值'].min(),text,size=13,bbox=bbox)   #指定位置加文字框
ax=plt.gca()   #设置图形样式
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()

 

requests

import requests
from bs4 import BeautifulSoup
from selenium import webdriver

htm = requests.get(url=url,headers=headers,timeout=30,stream=False).text
soup = BeautifulSoup(htm, 'html.parser')
txt = soup.find_all('div', class_='lax-s')


''.join(str(i)+',' for i in df1['cod'].tolist())[:-1] #list转换str

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄