2022年 11月 9日

python数据分析简单实例-python数据分析实例(1)

1.获取数据:

想要获得道指30只成分股的最新股价

importrequestsimportreimportpandas as pddefretrieve_dji_list():try:

r= requests.get(‘https://money.cnn.com/data/dow30/’)exceptConnectionError as err:print(err)

search_pattern= re.compile(‘class=”wsod_symbol”>(.*?).*?(.*?).*? .*?class=”wsod_stream”>(.*?)’)

dji_list_in_text=re.findall(search_pattern, r.text)

dji_list=[]for item indji_list_in_text:

dji_list.append([item[0], item[1], float(item[2])])returndji_list

dji_list=retrieve_dji_list()

djidf=pd.DataFrame(dji_list)print(djidf)

整理数据, 改变列名, index等

cols=[‘code’,’name’,’lasttrade’]

djidf.columns=cols #改变列名

djidf.index=range(1,len(djidf)+1)

最后结果为:

1307805-20181127182817690-1698626124.png

数据的选择

djidf.code #获取code列+index

djidf[‘code’] #获取code列 , 两者同功能

djidf.loc[1:5,] #前5行

djidf.loc[:,[‘code’,’lasttrade’]] #所有行

djidf.loc[1:5,[‘code’,’lasttrade’]] #1-5行, loc表示标签index

djidf.loc[1,[‘code’,’lasttrade’]] #1行

djidf.at[1,’lasttrade’] #只有一个值的时候可以用at

djidf.iloc[2:4,[0,2]] #表示物理文职, 并且4取不到, 就只有第三行第四行

djidf.iat[1,2] #单个值

简单的数据筛选: 平均股价, 股价大于180的公司名

djidf.lasttrade.mean() # 121.132

djidf[djidf.lasttrade>=180].name

1307805-20181127183508844-463758911.png

找到股价前三名的公司 , 降序排列

tempdf=djidf.sort_values(by=’lasttrade’,ascending=False)

tempdf[:3].name

如何根据index排序呢? 专门有函数sort_index()

df=pd.DataFrame(np.random.randn(3,3),index=[‘c’,’b’,’a’],columns=list(‘xyz’))

df.sort_index()#根据index 进行排序

*获取AXP公司过去一年的股价数据获取

importrequestsimportreimportjsonimportpandas as pdfrom datetime importdatedefretrieve_quotes_historical(stock_code):

quotes=[]

url= ‘https://finance.yahoo.com/quote/%s/history?p=%s’ %(stock_code, stock_code)try:

r=requests.get(url)exceptConnectionError as err:print(err)

m= re.findall(‘”HistoricalPriceStore”:{“prices”:(.*?),”isPending”‘, r.text)ifm:

quotes= json.loads(m[0]) #m = [‘[{…},{…},…]’]

quotes = quotes[::-1] #原先数据为date最新的在最前面

return [item for item in quotes if not ‘type’ initem]

quotes= retrieve_quotes_historical(‘AXP’)

list1=[]for i inrange(len(quotes)):

x=date.fromtimestamp(quotes[i][‘date’])

y=date.strftime(x,’%Y-%m-%d’)

list1.append(y)

quotesdf_ori=pd.DataFrame(quotes,index=list1)

quotesdf_m= quotesdf_ori.drop([‘adjclose’], axis = 1) #删除adjclose列

quotesdf=quotesdf_m.drop([‘date’],axis=1)print(quotesdf)

上述需要对时间进行处理, 将时间转为’%Y-%m-%d’的格式, 并且将这个时间作为一个list 成为quotesdf的index.

1307805-20181127183312427-898004346.png

数据的筛选

quotesdf[(quotesdf.index>=’2017-03-01′) & (quotesdf.index<=’2017-03-31′)]

quotesdf[(quotesdf.index>=’2017-11-30′) & (quotesdf.index<=’2018-03-31′)&(quotesdf.close>=90)]

简单计算

(1) 统计AXP股价涨跌的天数 (close>open)

len(quotesdf.close>quotesdf.open)

(2) 相邻两天的涨跌

importnumpy as np

status=np.sign(np.diff(quotesdf.close))

status#250 的长度, 比quotesdf 少1

status[np.where(status==1)].size #np.where(status==1)是由下标构成的array#

上述统计还可以直接用describe函数, 得到基本统计信息

importpandas as pdimportnumpy as np

index_df= pd.DataFrame(np.random.rand(3,3), index=[‘a’,’b’,’c’], columns=[‘index_1′,’index_2′,’index_3’])

index_df.describe()#超级强大

1307805-20181127183825487-363916830.png

(3) 统计2018一月的交易日天数

t=quotesdf[(quotesdf.index>=’2018-01-01′) & (quotesdf.index<‘2018-02-01’)]

len(t) #21

进一步, 如何统计近一年每个月的交易日天数?

统计每个月的出现天数就行了, 如何提取月份信息? 要把时间的字符串转化为 时间格式,

importtime

list2=[]for i inrange(len(quotesdf)):

temp=time.strptime(quotesdf.index[i],’%Y-%m-%d’)

list2.append(temp.tm_mon)#取月份

tempdf=quotesdf.copy()

tempdf[‘month’]=list2 #新增一列月份的数据

print(tempdf[‘month’].value_counts()) #计算每个月的出现次数

注意:

strptime 将字符串格式化为time结构, time 中会包含年份, 月份等信息

strftime 将time 结构格式化一个字符串, 之前生成quotesdf中用到过

上述方法略微麻烦, 如何快速知道每个月的交易日天数? groupby

#统计每一月的股票开盘天数

x=tempdf.groupby(‘month’).count()#统计近一年每个月的成交量

tempdf.groupby(‘month’).sum().volume#先每个月进行求和, 但是这些对其他列也进行了求和, 属于无效计算, 如何避免?

tempdf.groupby(‘month’).volume.sum() #交换顺序即可

引申: 一般groupby 与apply 在一起用. 具体不展开了

deff(df):returndf.age.count()

data_df.groupby(‘taste of mooncake’).apply(f)

(二) 合并DataFrame: append, concat, join

#append

p=quotesdf[:2]

q=quotesdf[‘2018-01-01′:’2018-01-05’]

p.append(q)#concat

pieces=[tempdf[:5],tempdf[len(tempdf)-5:]]

pd.concat(pieces)

两个结构不同的DataFrame 如何合并?

piece1=quotesdf[0:3]

piece2=tempdf[:3]

pd.concat([piece1,piece2],ignore_index=True)

piece2有month 但是piece1中没有这个字段

1307805-20181127184912238-642375928.png

join函数中的各种参数, 可以用来实现SQL的各种合并功能.

#join 两个dataframe要有共同的字段(列名)#djidf: code/name#AKdf: volume/code/month#合并之后的字段: code/name/volume/month

pd.merge(djidf.drop([‘lasttrade’],axis=1),AKdf, on=’code’)