• python数据分析实例(1)


    1.获取数据: 

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

    import requests
    import re
    import pandas as pd
    
    def retrieve_dji_list():
        try:
            r = requests.get('https://money.cnn.com/data/dow30/')
        except ConnectionError as err:
            print(err) 
        search_pattern = re.compile('class="wsod_symbol">(.*?)</a>.*?<span.*?">(.*?)</span>.*?
    .*?class="wsod_stream">(.*?)</span>')
        dji_list_in_text = re.findall(search_pattern, r.text)
        dji_list = []
        for item in dji_list_in_text:
            dji_list.append([item[0], item[1], float(item[2])])
        return dji_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)

    最后结果为:

    数据的选择

    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

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

    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公司过去一年的股价数据获取

    import requests
    import re
    import json
    import pandas as pd
    from datetime import  date
    def retrieve_quotes_historical(stock_code):
        quotes = []
        url = 'https://finance.yahoo.com/quote/%s/history?p=%s' % (stock_code, stock_code)
        try:
            r = requests.get(url)
        except ConnectionError as err:
            print(err)
        m = re.findall('"HistoricalPriceStore":{"prices":(.*?),"isPending"', r.text)
        if m:
            quotes = json.loads(m[0])       # m = ['[{...},{...},...]'] 
            quotes = quotes[::-1]         # 原先数据为date最新的在最前面
        return  [item for item in quotes if not 'type' in item]
    quotes = retrieve_quotes_historical('AXP')
    list1=[]
    for i in range(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.

    数据的筛选

    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) 相邻两天的涨跌

    import numpy 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函数, 得到基本统计信息

    import pandas as pd
    import numpy 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() # 超级强大

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

    t=quotesdf[(quotesdf.index>='2018-01-01') & (quotesdf.index<'2018-02-01')]
    len(t)  #21

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

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

    import time
    list2=[]
    for i in range(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 在一起用.  具体不展开了

    def f(df):
         return df.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中没有这个字段

    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')
    ----END---- HAVE A GOOD ONE! 以上为本人课余自学工具书/blog的笔记整理, 常有更新, 非100%原创!且读且学习。
  • 相关阅读:
    openssl rsa 加密
    SVN
    day04-drf认证、限流、权限、过滤、排序、分页、异常处理、自动接口文档生成、Xadmin后台管理
    day03-drf视图相关
    day02-序列化与反序列化
    day01-drf引入、序列化反序列化前序
    restFul接口设计规范
    Mysql优化之innodb_buffer_pool_size篇
    Mysql(CAST)和Oracle(to_char)应用
    Mongo和Mysql查看查询任务并终止
  • 原文地址:https://www.cnblogs.com/xuying-fall/p/10028258.html
Copyright © 2020-2023  润新知