zoukankan      html  css  js  c++  java
  • python+MongoDB使用示例

      本博客起源于博主的大三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) 采用pymongoMongoClient类连接mongod

      (3) python中使用的mongo常用语法与mongoJSON语法基本相同。

     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频率)。

     感谢李老师的数据文件说明,如果有任何侵权问题,博主可以立即删除。

     博客好像发不了文件,如果需要数据文件的话请留言邮箱,看到了发给你。

  • 相关阅读:
    sqlhelper使用指南
    大三学长带我学习JAVA。作业1. 第1讲.Java.SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行 大三学长带我学习JAVA。作业1.
    pku1201 Intervals
    hdu 1364 king
    pku 3268 Silver Cow Party
    pku 3169 Layout
    hdu 2680 Choose the best route
    hdu 2983
    pku 1716 Integer Intervals
    pku 2387 Til the Cows Come Home
  • 原文地址:https://www.cnblogs.com/fa-learning/p/9074897.html
Copyright © 2011-2022 走看看