在ETL,如果大家数据权限比较大的时候,可以做很多的数据清洗工作,就是个苦差事
import pymysqlimport pandas as pdfrom sqlalchemy import create_enginesql = "select * from company"engine = create_engine('mysql+pymysql://root:mysql@localhost:3306/data?charset=utf8')df = pd.read_sql(sql,engine)df字符串的format()函数,该方法收集位置参数和关键字参数的任意集合,并使用它们的值来替换字符串中的占位符;形式为{n}(n为整数)的占位符将被format()方法第n个参数所代替;形式为{name}的占位符将被参数中为name的参数所替代;如果要用format()输出{xx},必须使用{{xx}},否则会因为找不到对应的参数值而报错;灵活使用字符串:一方面用+/&拼接起来,一方面用format。def reader(query,db='data'): # reader读取器sql = queryengine= create_engine('mysql+pymysql://root:mysql@localhost:3306/{0}?charset=utf8'.format(db))df = pd.read_sql(sql,engine)return dfdf_company = reader("select * from company")reader('show tables')df_dataanalyst = reader('select * from dataanalyst')# 表连接merged = pd.merge(df_dataanalyst,df_company,on = 'companyId')merged# 得到结果result = merged.groupby(['city','companyFullName']).count()['positionId'].reset_index()result.head()# 更改数据类型result.info() # 写入到数据库之后,city数据类型成为了text# 写入数据库result.to_sql(name='newtable2',con='mysql+pymysql://root:mysql@localhost:3306/data?charset=utf8',if_exists='append',index = False)# name,con,schema=None,if_exists='fail',index=True,index_label=None,chunksize=None,dtype=None# name:数据库的表名(可新可老)# con:链接# schema:写好的链接器里已经设置好,用于创建数据库对象,基本上都是使用默认值# if_exists:三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;一般用append:若表存在,将数据写到原表的后面;若表不存在则新建一张表。默认为fail# index:是否将这个数据框的index列写入到数据库,单独写一列,一般不写入# 要注意这个append,执行次数不要多了# 数据框此时写入数据库,但是和我们想的数据表的形式可能不同# 建议先从数据库建表,然后再写入数据# id:INT,PK,NN,AI# city:VARCHER(45),中国的城市一般占不了多少20也可以;如果是公司名字,很长的话可以改为100# 其他数值类型 INT默认11就行# 写入的时候,可以比表里的字段少,但是不能多;少了会自动为NULL,多了则会报错(会产生ETL的错误)# 数值为不为空,建表的时候就会设置好ETL的简单操作已经闭环了# 比如每天都有两三张表要去进行数据清洗,或者想要去生成一个csv,我们都能通过这么一个简单的操作,利用pandas的功能,把整个环节都搞定result.to_csv('newtabke2.csv')# 生成csv反而会简单不少
