2019python3基础
#coding=utf-8
序列a通用操作 | 解释 |
---|---|
子元素 in a | 判断是否包含 |
元素 not in a | |
a + a | 序列 链接 |
a * 6 | 序列 重复 |
a.index(‘子元素’) | 返回 子元素的 index |
a[0] | 索引 |
a[:] | 切片 |
a[::-1] | 步长 |
min(),max(),sum(),len() | 通用函数 |
str常用功能 | 解释 |
---|---|
s1.replace(‘子元素’,‘替换为’,‘替换几次’) | 不填次数,就会全替换 |
s.split(’ ') | 拆分,为list |
s1.join(s2) | 用s2中元素链接s1中各元素 |
s.startswith(‘str’) | 判断,是否以str开头 |
s.endswith(‘str’) | 判断,是否以str结尾 |
s.upper() | 全大写 |
s.lower() | 全小写 |
s.swapcase() | 大小写互换 |
s.capitalize() | 首字母大写 |
s.isnumeric() | 判断,字符串是否只包含数字 |
s.isalpha() | 判断,字符串是否至少有一个字符,且字符都是字母 |
s.rstrip() | 删除字符末尾的空格 |
%
格式化字符串a = 'demo'
b = '%s is 样本' %a
# %s 表示在这里要插入一个变量(字符串)
# %a 代表我们插入的变量是a
x = 4
y = 'haha'
z = 4.2
print('this is %i' %x)
print('this is %s' %y)
print('this is %f' %z)
print('this is %.2f' %z) # 输出2位小数,四舍五入
print('this is %.0f' %z) # 不四舍五入,直接切掉小数部分
print('this is %.2f' %x) #
df['col1'].apply(lambda x:"%.2f%%"%(x*100)) # 转换为百分数
df.style.format({'col1':'{:.2%}'}) # 列转换为百分数
str格式化 | 解释 |
---|---|
%i |
整型 |
%+i |
显示正号 |
'%.2f '% -0.01 |
负数会直接显示负号 |
%.0f |
不四舍五入,直接切掉小数部分 |
%f |
浮点型 |
%.2 |
保留2位小数,四舍五入 |
%.2e |
科学计数法 |
%.4E |
科学计数法 |
%g |
小数位数少时,自动识别为浮点数 数据复杂时,自动识别为科学计数法 |
%s |
字符型 |
%% |
% |
.format(),生成新的字符串
str1.format格式化 | 解释 |
---|---|
"User ID:{0}".format('demo') |
{}:占位符,其中数字可有可无 |
"{}哈哈{}".format('a','b') |
其中数字可有可无 |
"{}{}{}".format('a','b','c') |
不含数字时 |
"{0}{1}{2}{0}".format('a','b','c') |
含数字:明确了指定 |
"我的工作时{work}".format(work='数据分析师') |
变量指示(不一定是数字) |
"{:f}".format(3.1415) |
|
"{:.2f}".format(3.1415) |
保留2位 |
"{:e}".format(3.1415) |
科学计数法 |
"{:.0f}".format(3.1415) |
取整,不四舍五入 |
"{:%}".format(3.1415) |
转为百分数 |
"{:d}".format(10) |
整数 |
_foo | 不能直接访问的类属性 | 通过类提供的接口进行访问 不能有from xx import *导入 |
---|---|---|
__foo | 私有成员 | |
_foo_ | 代表python里特殊方法专用的标识 |
print默认是换行输出
变量末尾加逗号,实现不换行输出
# 换行输出
print('a')
print('b')
# 不换行输出
print(x,y)
# 不换行输出
print(x),
print(y),
str格式化
print('我今年%.2f岁,生于%i月' % (1,2))
map
根据字典key与col值相同,将value替换
a = {'col1_value1':'aa','col1_value2':'bb'}
df['col1'].map(a)#col1列中值,与dictionary的key相同的,变为对应values
apply
将函数套用到DataFrame上的行和列
函数和自定义函数
df['col'].apply(str.upper)
df['col'].apply(自定义函数)
def foo(x):
a = str(x)='_a'
return a
def.index.apply(foo)
匿名函数
df.apply(lambda x:x.max() - x.min())
df.apply(lambda x:x.max() - x.min(), axis=1)
各列 分组 统计
df.apply(pd.value_counts).fillna(0)
applymap
将函数套用到DataFrame上每个元素(elementwise)
str格式化
df.applymap(lambda x:'.2f'%x)
[str(x) for x in np.arange(10)] # 方法一
list(map(str,np.arange(10))) # 方法二
随机数 | 解释 |
---|---|
np.random.normal(loc, scale, size) | 正态分布 loc:均值 scale:标准差 |
np.random.rand() | 均匀分布 [0,1)之间的 |
np.randm.randn() | 标准正态分布 |
np.random.randint(100,200,10) | 随机整数 |
np.random.seed(1) | 种子 |
np.random.uniform(low,high,size) | 均匀分布 [low,high) |
np.random.poisson(lams,ize) | 泊松分布 lam随机事件发生概率 |
np.random.choice(a[,size,replace,p]) | 从一维数组a中以概率p抽取元素 形成size形状新数组 replace表示是否可以重用元素 |
np.random.choice(b,(3,2),p = b/np.sum(b)) |
按元素修改字体样式
# 小于0的元素,红色字体
def colors(val):
if val>48000:
color='red'
else:
color='black'
return('color:%s'%color)
df[['col']].style.applymap(colors)
按行列修改背景样式
# 最大值的背景高亮显示
def highlight_max(s):
is_max = s == s.max()
lst=[]
for v in is_max:
if v:
lst.append('background-color:yellow')
else:
lst.append('')
return(lst)
df.style.apply(highlight_max,axis=0)# 每列最大值
df.style.apply(highlight_max,axis=1,subset=['col1','col2'])# 两列对比,每行的最大值
样式的索引和切片
df.style.apply(highlight_max,subset=pd.IndexSlice[:2,:10])
按百分数显示
df.style.format('{:.2%}',subset=['col1','col2'])
指定每列,转换显示类型
df.style.format({'col1':'{:.2%}','col2':'{+.2f}','col3':'{.4f}','col':'{:d}'})
#对应列转换为百分数、显示正号的2位浮点数、四位浮点数、整数(转换为整数时,需要该列整型,而不是浮点型)
缺失值
df.style.highlight_null(null_color='red')
极值高亮显示
df.style.highlight_max()
df.style.highlight_min()
色彩映射
df.style.background_gradient()
df.style.background_gradient(cmap='Greens',axis=1,low=0,high=1)
条形图
df.style.bar(subset=['col1','col2'],color='#d65f5f',width=100)
分断式构建样式
df.style.\
highlight_min().\
bar(color='#d65f5f',width=100,subset=['col5','col6']).\
bar(color='#333333',subset=['col1','col2'],width=80)
.\
.\
.\
不能有空格和注释创建
s=pd.Series(data=None,
index=None,
dtype=None,# np.str,object(字符串型)等
name=None,
copy=False,
fastpath=False)
pd.Series(10,index=range(3))# 通过标量创建
s.index
s.values
s.name
s2 = s1.rename('abc')
索引
s[0] # 下标索引
s[['a','c','b']]# 标签索引 生成新Series
s[1:3]# [1:3)
s['a':'c']#标签切片,[a:c]
s[s>3]# 布尔型索引
基本技巧
s.head(3)
s.tail()
# reindex不更改,只是选取index
# 之前没有的index会返回NaN,这里填充
s.reindex([5,2,3,'aa'],fill_value=0)
# 对齐
s1 +s2 # 其值按索引一一对应相加
# 删除
s.drop('子index')
s.drop(['a','b'],inplace=True)# 按标签删除
# 添加
s['a']=100# 新标签index赋值,来添加
s1.append(s2)# 添加一个数组
创建
df = pd.DataFrame(data=None,
index=None,
columns=None,
dtype=None,
copy=False)
# 1 字典创建
a={'aa':['bb']}
pd.DataFrame(a)
# 2 序列、数组
b={'bb':np.random.rand(3),
'bbb':np.random.rand(3)}
pd.DataFrame(b) # values为序列、数组创建——两列元素必须相等
# 3 Series
c={'cc':pd.Series(np.random.rand(3)),
'ccc':pd.Series(np.random.rand(4))}
pd.DataFrame(c) # values为Series创建时——两个Series元素数量可以不相等
# 4 二维数组
pd.DataFrame(np.random.rand(9).reshape(3,3))
# 5 字典组成的——列表创建
data=[{'a':1,'b':2},{'a':2,'b':3,'c':33}]
pd.DataFrame(data)# 列表中两个字典值数量可以不一
# 6 字典组成的字典创建
data={'a':{'aa':1,'bb':2,'cc':3},
'b':{'aa':2,'bb':2,'cc':3},
'c':{'aa':3,'cc':33}}
pd.DataFrame(data,columns=['a','c','b'])# columns为字典的key
pd.DataFrame(data,index=['aa','A','bb'])# index为 子字典 的key,指定新标签,返回值为NaN
索引
df['col'] # 返回Series
df[['col']]# 返回DataFrame
df[['col1','col2']]
df[df>0][['col1','col2']]
df.loc[:,'col1':'col3']
df.loc[['index3','index2'],'col1']
df['col1'].loc[['index1','index2']]
df.iloc[:3,:3]
df[['col1','col2','col3']].iloc[:2]
df[df>0].loc[['index1','index3']]
df.query('col1 > 0')
# 通过索引赋值
基本操作
df.index
df.columns
df.values
df.dtypes
df.T
# 添加列
df['newcol']=
df[['new_1','new_2']]=
# 删除
del df['col'] # 删除列
df.drop(['ind1','ind2'],axis=0,inplace=True)# 删除行
df.drop(['col1','col2'],axis=1,inplace=False)#删除列
# 对齐
df1 + df2 # 元素按(index,columns)意义对应相加
# 排序
df.sort_values(['col1'],ascending=False)# 降序
df.sort_values(['col1','col2'],ascending=True)# 升序
常用数学、统计方法
df['col'].dtype
df.dtypes
df.info()
df.describe()
df.quantile(q=0.75) # 统计分位数
df.mean(axis=1,skipna=True)# 每行的均值,过滤掉空置
df.sum()
df.median() # 中位数
df.count() # 统计非NaN值的数量
df.min()
df.std() # 标准差
df.var() # 方差
df.skew() # 偏度
df.kurt() # 峰度
# 累计
df['col'].cumsum() # 累计和
df['col'].cumprod() # 累计积
df.cummax() # 累计最大值
df.cummin() # 累计最小值
# 唯一值
s.unique().sort() # 去重、排序
# 值计数
s.value_counts(sort=False) # 计算出不同值出现的频率 ,sort:是否排序
s.value_counts(normalize=True) # 频率是否转换为百分比
pd.value_counts(s,sort=False)
# 成员资格
s.isin([3,2]) # 返回布尔值的Series
df.isin(['a','bc'8]) # 返回布尔值的DataFrame
s.isin(['a']) # 一定要加 []:s中是否包含a
.str.
通过.str.
调用字符串
df['col'].str.upper() # 大写
df.columns.str.upper() # 大写
df['col'].str.lower() # 小写
df['col'].str.len() # len字符长度
df['col'].str.count('b') # 单列,每格中字符串,包含字符b 的个数
df['col'].str.startswith('b') # 判断每格字符的 起始是否为b
df['col'].str.endwith('a') # 判断结束是否为a
# 替换
df['col'].str.replace('替换谁','替换为',n=1) # n:替换个数
df['col'].str.replace(['替换1','替换2','替换为'])
df['col'].str.replace({'替换1':'替换为','替换2':'替换为2'})
# 拆分
df['col'].str.split('拆分符',expand=True) # 拆分后,返回DataFrame
s.str.split(',',expand=True,n=1)# n:拆分几刀
s.str.split(',').str.get(1) # 拆分后选第2列
s.str.split(',').str[0] # 拆分后选择第一列
# 从字符串末尾拆分
s.str.rsplit(',')# 从右到左,拆分
# 去除每格前后的空格,无法去重中间空格
df['col'].str.strip() # 去除字符串中空格
df['col'].str.lstrip() # 去除字符串中左空格
df['col'].str.rstrip() # 去除字符串中右空格
# 字符串索引
s.str[1:-1] # 去除收尾字符
s.str[:2] # 取前两个字符
s.str[0]# 取第一个字符
pd.merge合并
pd.merge(df1,df2,on='col')
pd.merge(df1,df2,on=['col1','col3']) # 多键连接
pd.merge(df1,df2,right_on='rcol1',lefg_on='lcol1')
pd.merge(df1,df2,on=['rcol1','lcol1'],how='inner')# how:合并方式
# 两个df的index作键
pd.merge(df1,df2,left_on='key',right_index=True)
pd.merge(df1,df2,left_index=True,right_on='2col')# 第一个df的index和第二个col作键
pd.merge(df1,df2,left_index=True,right_index=True) # 以2个df的index作键
pd.merge(df1,df2,on='key',sort=True,how='outer')# 排序,但会大大影响性能
sort=False
how=inner
inner,outer,left,right
suffixes=('_x', '_y')
:默认
suffixes=('_1', '_2')
join合并
df1.join(df2,how='outer')
df1,join(df2['col3'])
pd.concat
pd.concat([s1,s2])# 上下堆叠
pd.concat([s1,s2],axis=1) # 左右拼接 ,按index
pd.concat([s1,s2],join='inner')# {'inner':'交集','outer':'联合'}
pd.concat([s1,s2],join_axes(['index1','index2','index3'])) # 指定联合的index
pd.concat([s1,s2],keys=['one','two'])# 上下堆叠,keys为外层index
Pd.concat([s1,s2],keys=['a','b'],axis=1)# 左右拼接,keys覆盖其列名
pd.concat([df1,df2])# 上下堆叠,新增col,index的空值为NaN
combine_first
df1.combine_first(df2)
update
df1.update(df2)
.map
df['new_col'] = df['字典共有col'].map(dict_data变量)
duplicated
s.unique()
s.duplicated() # 返回布尔序列
s.drop_duplicates()# 移除重复值
功能
df.groupby(by=['col1','col3'],
axis=0,# 默认行分组
level=,
as_index=True,
sort=True,
group_keys=True,
squeeze=False
).mean() # 统计方法
分组——可迭代的对象
for n, g in df.groupby('col1'):# n:组名, g:分组后的DataFrame
print(n,g)
list(df.groupby('col1'))
操作
df.groupby('col1').groups # 返回字典{'组名':'DataFrame'}——查看分组后的结构
df.groupby('col1').get_group('组名1') # 返回一个组的DataFrame
df.groupby('col1').groups['组名2']# 返回组的DataFrame——字典的索引
df.groupby('col1').size()# 查看分组后的长度,每组元素数
按照数据类型分组
for n, p in df.groupby(df.dtypes,axis=1): # axis=1,列分组
print(n,p)
通过字典或Series分组
dic={'col1','one','col2','one','col3':'two','col4':'two'}
df.groupby(dic,axis=1)
# col1、col2列分组到one,col3、col4列分组到two
通过函数分组
df.groupby(lambda x:x.split('')[0])#对字符串型索引分组
df.groupby(df['timecol'].dt.week)#Datetime64[ns]类型列
df.groupby(len).sum()# 按index字符长度分组
函数方法
df.groupby(level=0)#唯一索引用,将统一index分为一组
grouped=df.groupby('')
grouped.first()#非NaN的第一个值
grouped.last() # 非NaN的最后一个值
grouped.sum() # 和
grouped.mean() # 均值
grouped.median() # 中位数
grouped.std()# 标准差
grouped.var()# 方差
grouped.prod()# 非NaN的积
多函数计算
df.groupby('col').agg(['mean',np.sum])# 分组后分别将isuan均值、求和
df.groupby('col')['col3'].agg({'result1':np.mean,
'result2':np.sum})#和上面一样,但可自定义列名,而不是自带的mean和sum
transform
df.groupby('col1').mean()
df.groupby('col1').transform(np.mean)#与上面比,其结构与df的结构一致
apply
df.groupby('col1').apply(lambda x:x.describe())
# 返回排序后的前n行
def f_df1(d,n):
return(d.sort_index()[:n])
# 返回分组后的'k1'列
def f_df2(d,k1):
return(d[k1])
df.groupby('col1').apply(f_df1,n=2)
df.groupby('col1').applyt(f_df2,'col2')
df.groupby(['col1','col2']).size().unstack().plot.barh(stacked=True,color=['r','k'])
f.groupby(['unique_carrier','delayed']).size().unstack().plot.barh(stacked=True,color=['red','k'])
pd.pivot_table()
交叉表
pd.crosstab()
pd.read_table
pd.read_table('demo.txt',delimiter=',', # 指定分隔符,也可用sep=','
header=0, # 第一行用作columns
index_col=1) # 指定第2列为索引
pd.read_csv
pd.read_csv('demo.csv',
engine='python', # 解析方式
encoding='gbk', # 指定字符集类型,即编码
)
engine='python'
pd.read_excel
pd.read_excel('demo.xlsx',
sheetname='读取页的名称', # 返回多表使用sheetname=[0,1],若sheetname=None则返回全表
header=0,
index_col=1 # 读取为索引,
)
sheetname=
pd.get_dummies(df['col']) # 创建虚拟变量
pd.concat([df,pd.get_dummies(df['col'])],axis=1) # 合并
时间转字符串
datetime.now().strftime('%Y-%m-%d')
字符串转时间
datetime.strptime('2017/4/12','%Y/%m/%d')
datetime转UNIX timestamp(UNIXtimestamp:从1970/1/1起,到现在,过了多少秒)
from time import mktime
mktime(datetime.now().timetuple())
UNIX timestamp转datetime
datetime.fromtimestamp(1492859823)
区分:
datetime.datetime
:Datetime模块的数据类型Timestamp
:pandas的时间数据类型
DatetimeIndex
:pandas的时间数据类型
TimeSeries
:时间序列
DatetimeIndex
的Series
datetime库
import datetime
datetime.date.today()
datetime.date(2019,2,12)
datetime.datetime.now()
t1 = datetime.datetime(2019,2,1)
t2 = datetime.datetime(2019,2,12,11,22,33)
t2 - t1 # 时间差,timedelta
t1 - datetime.timedelta(1)
parser.parse 日期字符串转换
from dateutil.parser import parse
date='12-30-2018'
# 将str转换为datetime.datetime
parse(date)
parse('5/1/2019',dayfirst=True) # 国际通用格式中,日在月之前,可以通过dayfirst来设置
parse('Jan 31, 1997 10:45 PM') # 解析各种格式的日期,不支持中文
pd.Timestamp()
时间戳-pandas的时间数据结构——Timestamp:单个时间点
# 数据类型pandas的Timestamp
pd.Timestamp('2019-1-20 13:00:22')
pd.to_datetime()
# 单个时间数据,转换为pandas的时间戳Timestamp
pd.to_datetime(datetime.datetime(2019,1,22))
pd.to_datetime('2018/11/11')
# 多个时间数据,转换为DatetimeIndex
pd.to_datetime(['2018/11/11','2017/11/11','2016/11/11'])
pd.to_datetime([datetime.datetime(2019,1,22),datetime.datetime(2019,1,23)])
# 当数据中包含其他格式数据是
pd.to_datetime(['2018/11/11','ABC','2016/11/11'],errors='ignore')
errors='ignore'
errors='coerce'
pd.DatetimeIndex
DatetimeIndex:多个时间点
pd.DatetimeIndex()
# 解析多个为DatetimeIndex
pd.DatetimeIndex(['2018/11/11','2017/11/11','2016/11/11'])
# 解析单个为Timestamp
pd.DatetimeIndex('2018/11/11')
pd.date_range()
生成DatetimeIndex
# 默认 日历日频率
pd.date_range('1/1/2017','1/1/2018',normalize=True,name='demo')
pd.date_range('1/1/2017',periods=10)
pd.date_range(end='1/1/2017 13:00:00',periods=10)
pd.date_range('20170101','20180101',closed='right')#左开右闭
pd.date_range('20170101','20180101',closed='left')#左闭右开
pd.date_range('20170101','20180101')#左闭右闭
# 默认 工作日频率
pd.bdate_range('20190101','20191230')#工作日频率
# 转换为list
list( pd.date_range('20170101','20180101',closed='right') )
normalize=
name=
tz=
freq
freq=’’ | 解释 |
---|---|
H | 每小时 |
B | 每工作日 |
D | 每日历日 |
T | 每分 |
MIN | 每分 |
S | 每秒 |
L | 每毫秒-千分之一秒 |
U | 每微秒-百万分之一秒 |
W-MON | 每周——从每月第一个星期一开始算起 |
星期缩写 | MON/TUE/WED/THU/FRI/SAT/SUN |
W-2MON | 每2周——每月的第2个星期一开始算 |
M | 每月最后一个日历日 |
Q-月 | 指定月为季度末,每个季度末最后一月的最后一个日历日 |
A-月 | 每年指定月份的最后一个日历日 |
月缩写 | JAN/FEB/MAR/APR/MAY/JUN/JUL/AUG/SEP/OCT/NOV/DEC |
BM | 每月最后一个工作日 |
BQ-月 | 指定月为季度末,每个季度末最后一月的最后一个工作日 |
BA-月 | 每年指定月份的最后一个工作日 |
符合频率
freq='' |
---|
7D |
2h30min |
2M |
时间频率转换——asfreq
df.asfreq('4H',method='ffill')# 频率改为4H
method=
.shift()
df.shift(2)# 正数: 数值后移(滞后)
df.shift(-2)# 复数: 数值前移(超前)
df['newcol'] = df['col1'] / df.shift(1)['col1'] -1 # 元素与 前一天比较
df.style.format('{.2%}',subset='newcol')# 转换为百分数
df.shift(2,freq='D') # 对时间戳进行位移
df.shift(2,freq='T') #
pd.Period()
创建时期_时间段
p = pd.Period('2019',freq='M') # 生成一个月为频率的时间构造器,2019-01
p+1 # 2019-02
p-1 # 2018-12
# 频率转换
p = pd.Period('2019','A-DEC')
p.asfreq('M',how='start') # 转换成别的频率,2019-01
p.asfreq('D',how='end') # 2018-12-31
pd.period_range()
创建时期范围
pd.period_range('2019/1/1','2020/1/1',freq='M')
频率转换
p=pd.Period_range('2018','2019',freq='M')
p.asfreq('D',how='start') # 由月,变为当月的第一天(start),end是当月最后一天
时间 | 解释 |
---|---|
pd.Timestamp() |
时间戳 单个时间点 |
pd.to_datetime() |
多个时间点 |
pd.DatetimeIndex() |
多个时——多个时间点、时间戳 |
pd.date_range() |
生成DatetimeIndex |
pd.bdate_range() |
生成DatetimeIndex 非工作日 |
df.shift(2) |
超前、滞后——值 |
s.shift(2,freq='D') |
超前、滞后——索引 |
pd.Period(‘2019’,freq='M') |
时间段 pandas的Period |
pd.period_range() |
PeriodIndex 数据类型创建时期范围 |
s1.to_timestamp() |
每月,转化为当月第一天 |
s1.to_period() |
每月最后一天,转化为每月 |
df['dayofweek']=pd.to_datetime(df['time']).dt.dayofweek
df['week']=pd.to_datetime(df['time']).dt.week
索引
rng = pd.date_range('2018/1','2019/1')
ts=pd.Series(np.random.rand(len(rng)),index=rng)
# 索引
ts.loc['20180101']
ts['20190101']
ts['1/1/2019']
ts[datetime.datetime(2018,2,1)]
# 切片
ts[::2] # 下标切片
ts['2018/02']# 传入月,直接切片
ts['1/2019']
ts['2019-1'][::2]
ts['2018/01/01':'2018/12/12']
ts.loc['2018/01/01':'2018/12/12']
重复的index
ts.index.is_unique #判断index是否有重复值
ts['2018/12/23']# index不唯一时,返回多个值
ts.groupby(level=0).mean()# 对重复index分组
resample()
重采样——从一个频率,转为另一个频率,且有数据的聚合
ts.resample('5D').sum() #重采样
# 降采样
ts.resample('M',closed='left',label='left').mean()
closed=
参数
label=
参数
升采样
ts.resample('T').asfreq() # 不做填充,返回NaN
ts.resample('T').ffill() # 向上填充
ts.resample('T').bfill() # 向下填充
时期period的采样
prng=pd.period_range('2018','2019',freq='M')
pts = pd.Series(np.arange(len(prng)),index=prng)
pts.resample('3M').sum() # 降采样
pts.resample('15D').ffill() # 升采样
聚合方法 | |
---|---|
ts.resample('3D').mean() |
|
ts.resample('3D').max() |
|
ts.resample('3D').min() |
|
ts.resample('3D').median() |
|
ts.resample('3D').first() |
返回第一个值 |
ts.resample('3D').last() |
返回最后一个值 |
ts.resample('3D').ohlc() |
OHLC重采样 金融领域的时间序列聚合方式 |
OHLC返回多列:Open开盘,High最大值,Low最小值,close收盘 |