pandas学习

作者: chliar | 来源:发表于2018-04-18 22:04 被阅读0次
    import pandas as pd
    
    a = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
    # print a[1:3]
    c = pd.Series(10, index=['a', 'b', 'c'])  #  自定义索引  默认索引也是存在
    print c
    类型为 <class 'pandas.core.series.Series'>
    
    ###########################################################
    #切割字符,split()获取下标为1的
    data['jobcreate']=data['jobcreate'].str.split(' ',).str.get(1)
    字符串方法
    
    Series对象在其str属性中配备了一组字符串处理方法,可以很容易的应用到数组中的每个元素
    
    t = pd.Series(['a_b_c_d','c_d_e',np.nan,'f_g_h'])
    t
    
    t.str.cat(['A','B','C','D'],sep=',') #拼接字符串
    
    t.str.split('_') #切分字符串
    
    t.str.get(0) #获取指定位置的字符串
    
    t.str.replace("_", ".") #替换字符串
    
    t.str.pad(10, fillchar="?") #左补齐
    t.str.pad(10, side="right", fillchar="?") #右补齐
    t.str.center(10, fillchar="?") #中间补齐
    
    t.str.find('d') #查找给定字符串的位置,左边开始
    t.str.rfind('d') #查找给定字符串的位置,右边开始
    
    lambda 函数:
    df['compname'] = df['compname'].apply(lambda x: x.replace('',''))
    ###################################################
    去重:
    df.duplicate(subset=u'公司名称')   可以查看 公司名这一列的字段重复值,不传值则按照整一行的数值全部相同才算重复
    删除重复值:
    df = df.drop_duplicates(subset=u'公司名称')
    print df
    ###################################################
    df['Director'].unique() 去重之后是列表
    df.str.split(',').str.get(0) #取切片后的第0个下标的值
    df['genre'].str.split(',').tolist() # 整个值变成一个大列表里有很多小列表
    
    查询:
    df[df[u'薪资'].str.contains('-')]
    data = data[data.classify.str.contains('1', na=False)]
    na = False 可以忽略空值
    查询薪资的字段中包含'-' 的所有行
    
    ##############################################################
    pandas 绘图
    
    import pymysql
    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置
    plt.rcParams['axes.unicode_minus'] = False
    
    sql_pd = """SELECT ljn.city,ljn.last_date,ljn.nums FROM (SELECT * FROM(SELECT * FROM (select a.city,a.last_date,a.use_type,count(*) nums,format(avg(case when a.avg_price like '% 元/平(均价)%' then a.avg_price else null end),2) avg_price from (
    select b.city,b.name,b.area,b.locate,b.use_type,max(b.avg_price) as avg_price,min(substr(b.time,1,10)) as last_date from lw_lianjia_realty b group by b.city,b.name,b.area,b.locate,b.use_type) a
    group by a.city,a.last_date,a.use_type order by 1,2) as lw WHERE lw.last_date BETWEEN  (select DATE_ADD(CURDATE(),INTERVAL -25 DAY)) and CURDATE() and lw.use_type='住宅')
     AS lw WHERE lw.city IN('北京','深圳','广州','上海'))AS ljn """
    
    
    sql_avg = """SELECT ljn.city,ljn.last_date,ljn.avg_price FROM (SELECT * FROM(SELECT * FROM (select a.city,a.last_date,a.use_type,count(*) nums,format(avg(case when a.avg_price like '% 元/平(均价)%' then a.avg_price else null end),2) avg_price from (
    select b.city,b.name,b.area,b.locate,b.use_type,max(b.avg_price) as avg_price,min(substr(b.time,1,10)) as last_date from lw_lianjia_realty b group by b.city,b.name,b.area,b.locate,b.use_type) a
    group by a.city,a.last_date,a.use_type order by 1,2) as lw WHERE lw.last_date BETWEEN  (select DATE_ADD(CURDATE(),INTERVAL -25 DAY)) and CURDATE() and lw.use_type='住宅')
     AS lw WHERE lw.city IN('北京','深圳','广州','上海'))AS ljn """
    
    
    def get_pd(sql):
        conn = pymysql.connect(host='', user='', passwd='', db='', charset='utf8')
        df = pd.read_sql(sql, conn, )
        conn.close()
        return df
    
    
    if __name__ == '__main__':
        avg_price = get_pd(sql_avg)
        avg_price['avg_price'] = avg_price['avg_price'].str.replace(u',', '').astype(np.float)
        print()
        avg_price_a = avg_price.pivot(index='last_date', columns='city', values='avg_price')
        avg_price_a = pd.DataFrame(avg_price_a)
        avg_price_a.columns.name = None
        avg_price_a.index.name = None
        plt.xlabel(u'周/城市')
        plt.ylabel(u'均价')
        plt.title(u'新增楼盘表')
        avg_price_a.plot(kind='bar')
        plt.xticks(rotation=0)
        plt.show()
    ##############################################################
    
    存mongod 
    for index, row in data.iterrows():   # 获取每行的index、row  
            for col_name in data.columns:  
                row[col_name] = exp(row[col_name]) # 把指数结果返回给data  
        return data 
    
    
    from pymongo import MongoClient
    import pandas as pd
    from sqlalchemy import create_engine
    import json
    
    db = MongoClient(host='192.1.64.101', port=27017)
    
    
    # print db.ark_lab
    # db = db['ark_lab'].get_collection('comp_anna_wind_weekly')
    # datas = list(db.find({}))
    #
    # df = pd.DataFrame(datas)
    # df = df.drop([u'_id'], axis=1)
    # data = df.T.to_dict()
    class sql():
        def __init__(self, ):
            self.user = ''
            self.passwd = ''
            self.host = ''
            self.db = ''
            sql = """mysql+pymysql://{}:{}@{}:3306/{}?charset=utf8"""
            self.engine = create_engine(sql.format(self.user, self.passwd, self.host, self.db), encoding='utf-8')
            self.client = MongoClient(host='192.1.64.119', port=27017, )
    
        def select(self):
            df = pd.read_sql_table(table_name='cxf_lagou_weekly', con=self.engine)
            return df
    
        def m_insert(self, sql=None, table_name=None, df=None, ):
            client = self.client
            db = client['question']
            data = json.loads(df.T.to_json()).values()
            data = list(data)
            # for i in data:
                # db.lagou.update(i, {"$set": i}, True)
                # db.lagou.update(i, {"$set": i}, True, True)
            print(data)
            # db.lagou.insert(data)
            # db.getCollection(table_name).insert(data)
    
            client.close()
    
        def m_select(self, dict):
            client = self.client
            db = client['question']
            data = db.lagou.find(dict)
            return len(list(data))
    
    
    
    #手动创建pd:
     pdlist=getpd("""select * from tianyancha_holdingcompany""")
    
     pdlist['关联公司'][0]   #   先取[columns]在取[index]  不能先取index在取columns
    
    #所以要转过来:
     data = pd.DataFrame([[x for x in pdlist['公司名称']], [x for x in pdlist['关联公司']]], index=['公司名称', '关联公司'])
        for i in range(len(data.columns)):
            # print(i)
            print(data[i]['公司名称'], data[i]['关联公司'])
    
    ##########################################
    dataNumPy = np.asarray([(1,2,3,4)])
    df = pd.DataFrame(dataNumPy, columns=['1','2','3','4'])
    
    #统计的对应关系:
       city   last_date  avg_price
    0    上海  2018-03-26   36400.00
    1    上海  2018-04-02   50514.29
    2    上海  2018-04-09   27166.67
    3    上海  2018-04-16   29350.00
    4    北京  2018-03-26   16500.00
    5    北京  2018-04-02   62333.33
    6    北京  2018-04-09   80000.00
    7    北京  2018-04-16   43666.67
    8    广州  2018-03-26   12000.00
    9    广州  2018-04-02   15333.33
    10   广州  2018-04-09   16066.67
    11   广州  2018-04-16   38700.00
    12   深圳  2018-03-26   34700.00
    13   深圳  2018-04-02   16500.00
    14   深圳  2018-04-09   41394.25
    15   深圳  2018-04-16   11750.00
    city              上海        北京        广州        深圳
    last_date                                         
    2018-03-26  36400.00  16500.00  12000.00  34700.00
    2018-04-02  50514.29  62333.33  15333.33  16500.00
    2018-04-09  27166.67  80000.00  16066.67  41394.25
    2018-04-16  29350.00  43666.67  38700.00  11750.00
    
    注意:数据中index的重复数量,不如上海4条,下面北京等等都要4条一致,否则报错
    
        avg_price = get_pd(sql_avg)
        avg_price['avg_price'] = avg_price['avg_price'].str.replace(u',', '').astype(np.float)
    
        avg_price_a = avg_price.pivot(index='last_date', columns='city', values='avg_price')
        avg_price_a = pd.DataFrame(avg_price_a)
    
        print(avg_price)
        print(avg_price_a)
    
    
    #pandas的遍历
    print(pdlist.ix[0])
        for i,k in pdlist.iterrows():
            print('*'*100)
            print(i)  # index值
            print('$'*10)
            print(k)  # row 值
            print('#'*10)
            print(pdlist['公司名称'][i], pdlist['关联公司'][i])
    
    
    for i in company.index:
            code, name, Serial_number = company[u'证券代码'][i], company[u'证券简称'][i], company[u'证券编号'][i]
    
    
    
    pandas 添加字段 和字典类型
    table['code'] = pd.Series([sql_code for i in range(len(table.index))])
    
    
    
    
    
    将pandas的DataFrame数据写入[MySQL](http://lib.csdn.net/base/mysql "MySQL知识库")[数据库](http://lib.csdn.net/base/mysql "MySQL知识库") + sqlalchemy
    
    1.  import pandas as pd  
    2.  from sqlalchemy import create_engine  
    
    4.  ##将数据写入mysql的数据库,但需要先通过sqlalchemy.create_engine建立连接,且字符编码设置为utf8,否则有些latin字符不能处理  
    5.  yconnect = create_engine('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')  
    6.  pd.io.sql.to_sql(thedataframe,'tablename', yconnect, schema='databasename', if_exists='append')  
    
    to_sql中,
    
    第一个参数thedataframe是需要导入的pd dataframe,
    
    第二个参数tablename是将导入的数据库中的表名
    
    第三个参数yconnect是启动数据库的接口,pd 1.9以后的版本,除了sqllite,均需要通过sqlalchemy来设置
    
    第四个参数databasename是将导入的数据库名字
    
    第五个参数if_exists='append'的意思是,如果表tablename存在,则将数据添加到这个表的后面
    
    sqlalchemy.create_engine是数据库引擎
    
    ('mysql+mysqldb://root:password@localhost:3306/databasename?charset=utf8')的解释
    
    mysql是要用的数据库
    
    mysqldb是需要用的接口程序  (一般用pymysql)
    
    root是数据库账户
    
    password是数据库密码
    
    localhost是数据库所在服务器的地址,这里是本机
    
    3306是mysql占用的端口
    
    elonuse是数据库的名字
    
    charset=utf8是设置数据库的编码方式,这样可以防止latin字符不识别而报错
    
    conn = create_engine('mysql+pymysql://user:password@127.0.0.1:3306/db?charset=utf8')
    df.to_sql('ipeorg', conn, if_exists='append', index=False)
    读取:
    sql = " select * from tablename '' "
    df = pd.read_sql(con=engine, sql=sql)
    

    相关文章

      网友评论

        本文标题:pandas学习

        本文链接:https://www.haomeiwen.com/subject/qaeskftx.html