利用Pandas獲取Mysql數據
在python中操作mysql,雖說方便,但是頻繁的從服務器獲取數據,效率是很低的。今天嘗試了一下用pandas從Mysql數據庫中提取數據,確實很方便,而且獲取一次數據以後,利用pandas豐富的函數進行各種分析,也是得心應手。
- 首先建立數據庫連接,建立一個公用的conn作爲連接對象
import pymysql
import pandas as pd
class cardb():
conn = None
def connect_db(self):
db_host = "XXXX"
user = "XXXX"
pw = "XXXX"
try:
# 創建連接數據庫
self.conn = pymysql.connect(db_host, user, pw, "yiche_car_info", use_unicode=True, charset='utf8mb4')
return self.conn
except Exception as e:
print("數據庫連接異常!錯誤%s", e)
return None
- pandas利用建立的連接獲取數據
try:
self.conn.ping(reconnect=True)
except Exception as e:
print("%s" % e)
return None
sql=“select * from viewcarinfo”
df = pd.read_sql_query(sql % (str_info, str_viewname), con=self.conn)
print(df)
得到了數據,是一個dataframe格式。一行一行的索引稱爲index,一列列則是column像表格。
pz_id cartype_id pz_name ... 車型級別 車身型式 前大燈
0 m139120 m4758 2020款1.2L手動超值版 ... 小型車 兩廂 鹵素
1 m111122 m2790 2014款1.3L標準版 ... 小型車 三廂 鹵素
2 m133807 m3067 2019款1.5L手動進取版 ... 小型車 三廂 LED
3 m133409 m4758 2019款1.2LAMT舒適版 ... 小型車 兩廂 鹵素
4 m139423 m3167 2020款1.4L手動煥新版 ... 小型車 三廂 鹵素
.. ... ... ... ... ... ... ...
343 m129677 m4586 2018款5.3L手自一體白宮一號4座 ... 全尺寸SUV SUV LED
344 m136613 m3859 2020款6.0TW12標準版 ... 豪華車 三廂 LED
345 m131852 m4373 2019款S680雙調典藏版 ... 豪華車 三廂 矩陣LED
346 m132800 m2078 2019款GT6.0TW12敞篷版 ... 豪華車 敞篷車 矩陣LED
347 m125538 m3044 2017款6.8T手自一體長軸距版 ... 豪華車 三廂 氙氣
- 先用python建立好需要保存的json字典
json_res = {}
json_res["item_name"] = []
json_res["item_option"] = {}
json_res["item_value"] = []
json_res["car_prosys_name"] = car_prosys_name
json_res["car_prosys_value"] = []
json_res["car_prosys_series_value"] = []
json_res["car_pricezone_name"] = car_pricezone_name
json_res["car_pricezone_value"] = []
json_res["car_pricezone_series_value"] = []
- 用pandas分析數據
數據查詢的用法:df.loc是定位數據行,加上條件就可以實現數據過濾。
A.相等過濾或者數據大小過濾
item="鹵素"
item1 = df.loc[df["前大燈"] == item]
等於==,大於小於<,>可以篩選出所有相等的或者數值上滿足大小條件的數據行。
n1 = item1[str_feild].count()
統計出所有前大燈==“鹵素”的行數。
B.文本模糊查找過濾
而文本的模糊查找則可以利用.str.contains這個函數
如
item="鹵素"
item2 = df.loc[df["前大燈"].str.contains(item)]
可以統計出所有所有與鹵素相關的數據行。
n2 = item2[str_feild].count()
C.聯合條件查找
統計出所有前大燈包含“鹵素”的行數。
還可以聯合2個以上條件查找,如"&"是 and的效果,而“|”是 or的效果。
item3 = df.loc[(df[str_feild] == item) & (df[prosys_name] == ps_name)]
n3 = item2[str_feild].count()
統計同時滿足df[str_feild] == item以及df[prosys_name] == ps_name)的數據列。
- 導出字典爲json格式,可用於flask,Django的數據源。
save_path = sys.path[0] + json_path + str_feild_id + ".json"
with open(save_path, 'w') as wr:
json.dump(json_res, wr)
- 用pandas分析數據
pandas起始還有很多用法,可以說是numpy的升級版,numpy更多用於數組和矩陣,而pandas更多用於
類似excel和sql的高級數據處理,也可以直接與數據庫對接,並且還有多種格式的接入和導出(常見的
如csv,excel,json),可以說一大數據處理利器。