本博客起源於博主的大三NoSQL課程設計,採用python+MongoDB結合方式,將數據從txt文件導入MongoDB之中,再將其取出以作圖。主要技術是採用python與MongoDB結合存儲讀取方案,所以本博客截取了課設的部分內容,主要講解python操作MongoDB方案實現,以給想要學習py ...
本博客起源於博主的大三NoSQL課程設計,採用python+MongoDB結合方式,將數據從txt文件導入MongoDB之中,再將其取出以作圖。主要技術是採用python與MongoDB結合存儲讀取方案,所以本博客截取了課設的部分內容,主要講解python操作MongoDB方案實現,以給想要學習python+MongoDB編程開發的同學學習練手。
設計思路
1、Python編程語言和MongoDB有驅動包pymongo連接,使用pymongo對MongoDB進行編程開發、數據讀取,以及後續的畫圖分析和數據可視化處理
2、使用的數據文件sample.txt.txt。
設計內容
1、先使用dataToMongo.py將文件清洗後導入MongoDB中。
(1) 創建並連接到MongoDB 中的nosql資料庫;
(2) 創建並連接到nosql資料庫的集合sample;
2、對讀出的數據進行可視化處理。
(1) 畫圖主要使用的Python包為matplotlib.plot。
設計步驟及結果測試
1、先使用dataToMongo.py將文件清洗後導入MongoDB中。
(1) 採用pymongo連接驅動
(2) 採用pymongo的MongoClient類連接mongod
(3) python中使用的mongo常用語法與mongo的JSON語法基本相同。
MongoDB啟動:
啟動Python腳本dataToMongo.py將數據從文件中讀出並存入MongoDB中:
註意要使用以下命令 (由於前期使用python+Hadoop的方式編寫,所以使用了unix輸入輸出流來讀數據):
# cat sample.txt.txt | ./dataToMongo.py
數據成功存入MongoDB:
dataToMongo.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- # 這個文件是用來將數據存入MongoDB中資料庫nosql的 # collection為 sample (db.sample.find()) # 格式為:"line1": [data1,data2...] from pymongo import MongoClient import sys # Connect to mongod, use DB: 'nosql', use COLLECTION: 'sample' conn = MongoClient('127.0.0.1', 27017) #連接mongod db = conn.nosql #連接'nosql'資料庫,沒有則自動創建 sample = db.sample #使用sample集合,沒有則自動創建 n = 1 data = list() for line in sys.stdin: data = line.strip().split() linenum="line"+str(n) # linenum是line字元串+數字組成的字元串,後面插入數據集時會用到 if n==1: pass # 第一行數據是沒用的,清洗掉 elif n==2: data = data[4:] # 實測觀察數據從第四個數據開始 data[0] = '-3.1415926536' # 原數據是‘Real=-3.1415926536’,所以將數據修改下 for index,item in enumerate(data): data[index] = float(item) # 將原來是字元串的數據轉為float類型 sample.insert({ # 將數據插入(insert)MongoDB中的sample集合 "line":linenum, # 這裡我為了後續作圖方便,插入了一個{line:linenum}的鍵值對 "value":data # {value: data}鍵值對, data是一個list變數哦 }) else: data = data[2:] # 和第二行的數據不一樣,實測觀察出的,有時候編程是要一步步觀察修改的 for index,item in enumerate(data): # 考驗自己的動手能力,怎麼觀察實現要自己想辦法了 data[index] = float(item) sample.insert({ "line":linenum, "value":data }) n+=1
2、對讀出的數據進行可視化處理。
畫圖腳本:main.py
(1) 第一個圖:
藍色的線是在1.0*10^9頻率下,phi=0
橙色的線是在1.0*10^9頻率下,phi=1.5707963268。
橫坐標是Theta(degree),範圍從-Pi ~Pi;縱坐標是電場值。
相同頻率下,theta角度越大,電場值越小。
main.py
#!/usr/bin/python3 # -*- coding:utf-8 -*- # file : main.py # 這個文件是用來讀取MongoDB中nosql資料庫.sample集合數據 # 讀出之後作圖 from pymongo import MongoClient import matplotlib.pyplot as plt # Connect to mongod, use DB: 'nosql', use COLLECTION: 'sample' conn = MongoClient('127.0.0.1', 27017) #連接mongod db = conn.nosql #連接'nosql'資料庫,沒有則自動創建 sample = db.sample #使用sample集合,沒有則自動創建 angle_theta_radian=sample.find_one({"line":"line2"})['value'] #使用find_one查找第2行的數據,取其名為‘value’的鍵值對的值 data_phi0=sample.find_one({"line":"line3"})['value'] #使用find_one查找第3行的數據,取其名為‘value’的鍵值對的值 data_phi90=sample.find_one({"line":"line48"})['value'] #使用find_one查找第48行的數據,取其名為‘value’的鍵值對的值 plt1, = plt.plot(angle_theta_radian,data_phi0) #作圖1 plt2, = plt.plot(angle_theta_radian,data_phi90) #作圖2 plt.legend([plt1,plt2],['Electrial Field1','Electrial Field2'],loc='upper right') #設置圖例 plt.xlabel('Theta (degree)') #設置x軸標簽 plt.ylabel('Electrical field (V/m)') #設置y軸標簽 plt.show() #以上一起顯示出來
(2) 第二個圖:
藍色的線是,在1.0*10^9頻率下,phi=0;
橙色的線是,在1.02*10^9頻率下,phi=0;(第93行: line93)
橫坐標是Theta(degree),範圍從-Pi ~Pi;縱坐標是電場值。
相同theat角度下,頻率越高,電場值絕對值越大。
實現:將main.py腳本文件中的
data_phi90=sample.find_one({"line":"line48"})['value']
修改為:
data_phi90=sample.find_one({"line":"line93"})['value']
即可得出。
數據文件說明:
1、數據文件概述:是測試的電場強度數據文件。
包括多個頻率測試的電場強度,每個頻率的數據是一個數據塊。
在一個頻率點測試的數據(每一塊數據裡面),又包括多行數據(每行是一個theta角度的數據)和多列數據(每一列為一個phi角度的數據)。
2、數據文件含義:
3、實驗測試與數據的關係如下
對於文件sample.txt.txt,只有兩個頻率(109頻率和1.2*109頻率)。
感謝李老師的數據文件說明,如果有任何侵權問題,博主可以立即刪除。
博客好像發不了文件,如果需要數據文件的話請留言郵箱,看到了發給你。