【python學習筆記】39:認識SQLAlchemy,簡單操作Pandas中的DataFrame
阿新 • • 發佈:2018-11-19
學習《Python3爬蟲、資料清洗與視覺化實戰》時自己的一些實踐。
認識SQLAlchemy
SQLAlchemy是Python的ORM工具,就像Java有Hibernate一樣,實現關係型資料庫中的記錄與Python自定義Class的物件的轉化,實現操作之間的對映。
書上底層用了pymysql
,但是實踐中會出現問題,網上查了一下改用mysql-connector-python
就可以了。
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
# 對映物件的基類
Base = declarative_base()
# 連線資料庫.指定編碼為utf-8
# 使用mysqlconnector(安裝mysql-connector-python)而不是pymsql,以解決下面的錯誤
# 錯誤1366:"Incorrect string value",下面是輸出的異常資訊
# latin-1' codec can't encode characters in position 58-62: ordinal not in range(256)
engine = create_engine('mysql+mysqlconnector://root:[email protected]:3306/k8', encoding='utf-8')
# 建立綁定於該連線的資料庫會話.域session可以將session進行共享
DBSession = scoped_session(sessionmaker(bind=engine))
# 要對映到的類,它要繼承前面的基類
class Product(Base):
# 對映到DB中的表名.私有屬性(雙'_'開頭)
__tablename__ = 'product'
# 表的結構.使用Column物件,其中記錄了該屬性對應於資料庫中的資料型別以及其它資訊
id = Column(String(20), primary_key=True) # 標識為主鍵
name = Column(String(20))
type = Column(String(20))
# 新增使用者
def add_user(user):
session = DBSession()
session.add(user)
try:
session.commit()
except Exception as e:
session.rollback()
# 輸出異常資訊
print("add_user(): ======={}=======".format(e))
finally:
session.close()
# 其它的一些測試
def other_test():
session = DBSession()
# 查詢並更新使用者
session.query(Product).filter(Product.id == '12345678').update({Product.name: "北京兩日遊"})
# 這樣輸出的是這些操作對應的SQL語句,並不是查詢結果
# print(session.query(Product).filter(Product.id == '12345678'))
# 查詢並檢視查詢結果
goal = session.query(Product).filter(Product.id == '12345678').one()
print('name:' + goal.name + ',type' + goal.type)
# 查詢並刪除使用者
session.query(Product).filter(Product.id == '12345678').delete()
try:
session.commit()
except Exception as e:
session.rollback()
print("other_test(): ======={}=======".format(e))
finally:
session.close()
if __name__ == '__main__':
# 建立一個自定義的Product物件(因為繼承了基類,這裡不需要實現Product類的該構造器即可使用)
new_user = Product(id='12345678', name='上海一日遊', type='景+酒')
# 新增使用者的測試
add_user(new_user)
# 修改,查詢和刪除使用者的演示
other_test()
執行結果:
name:北京兩日遊,type景+酒
簡單操作Pandas中的DataFrame
Numpy那章講得比較碎,內容也比較少,沒有什麼好記錄的。Pandas資料處理這章的資料檔案要到書網站上去下載。
import pandas as pd
# (1)從csv檔案中讀取資料生成DataFrame物件.按','分割,編碼為utf-8,0號行作為列名
df = pd.read_csv("E:/Data/practice/taobao_data.csv", delimiter=',', encoding='utf-8', header=0)
# print(type(df)) # <class 'pandas.core.frame.DataFrame'>
# (2)將(剛剛讀出的)df物件中的資料寫到另一個csv檔案中.columns指定要寫的是哪些列,禁止寫入索引,儲存表頭資訊
df.to_csv("E:/Data/practice/test_in.csv", columns=['寶貝', '價格'], index=False, header=True)
# (3)取前3行(得到的還是DataFrame物件)
rows = df[0:3]
# print(rows)
# (4)取指定的某些列
cols = df[['寶貝', '成交量', '位置']]
# print(cols.head()) # 至多前5行
# (5)取前4行中的某些列.第一個維度指定行,在第二個維度上選取指定的列
print(df.ix[0:3, ['成交量', '價格']]) # 注意這裡是0:3,另外ix方法已經被棄用
# 或(使用loc按label索引)
print(df.loc[0:3, ['成交量', '價格']]) # 這裡0:3可以替換成df.index[0:4]
# 或(使用iloc按index索引)
print(df.iloc[0:4, df.columns.get_indexer(['成交量', '價格'])]) # 這裡是0:4
# (6)從已有的列中計算新的列,並直接將其寫入到df物件中
df['銷售額'] = df['價格'] * df['成交量']
# print(df.head())
# (7)根據條件過濾行
result = df[(df['價格'] < 100) & (df['成交量'] > 10000)]
# print(result.head())
# (8)按照某個欄位排序
df1 = df.set_index("價格").sort_index()
# print(df1.head())
# (9)按照多個欄位排序
# 預設level是0,這裡即先"位置"再"價格"
df2 = df.set_index(['位置', '價格']).sort_index()
# print(df2)
# level設定為1時,這裡即先"價格"再"位置"
df2 = df2.sort_index(level=1)
# print(df2)
# (10)資料整理操作
# 先刪除label為'寶貝'和'賣家'的列,然後按位置分組,計算組內的均值,再按成交量進行排序(降序)
df_mean = df.drop(['寶貝', '賣家'], axis=1).groupby("位置").mean().sort_values("成交量", ascending=False)
# print(df_mean)
# 先刪除label為'寶貝'和'賣家'的列,然後按位置分組,計算組內的加和,再按成交量進行排序(降序)
df_sum = df.drop(['寶貝', '賣家'], axis=1).groupby("位置").sum().sort_values("成交量", ascending=False)
# print(df_sum)
# (11)查看錶的資料資訊和描述性統計資訊
print(df.info())
print(df.describe())