1. 程式人生 > >【python學習筆記】39:認識SQLAlchemy,簡單操作Pandas中的DataFrame

【python學習筆記】39:認識SQLAlchemy,簡單操作Pandas中的DataFrame

學習《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())

在這裡插入圖片描述