• Python 生成周期性波动的数据 可指定数值范围3


    import numpy as np
    import math
    import matplotlib.pyplot as plt
    import pandas as pd
    import pymssql
    from random import choice
    import json
    import time
    import os
    
    
    
    
    class MSSQL:
        # 类的构造函数,初始化数据库连接ip或者域名,以及用户名,密码,要连接的数据库名称
        def __init__(self,host,user,pwd,db): 
            self.host=host
            self.user=user
            self.pwd=pwd
            self.db=db
        
        # 得到数据库连接信息函数,返回: conn.cursor()
        def __GetConnect(self):
            self.conn=pymssql.connect(host=self.host,
                                      user=self.user,
                                      password=self.pwd,
                                      database=self.db,
                                      charset='utf8')
            cur=self.conn.cursor()  #将数据库连接信息,赋值给cur。
            if not cur:
                raise(NameError,"连接数据库失败")
            else:
                return cur
    
            
        #执行查询语句,返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
        def ExecQuery(self,sql):  
            cur = self.__GetConnect() #获得数据库连接信息
            cur.execute(sql)          #执行Sql语句
            resList = cur.fetchall()  #获得所有的查询结果
            self.conn.close()         #查询完毕后必须关闭连接
            return resList            #返回查询结果
        
        
        #执行Sql语句函数,无返回结果的,方向修改的
        def ExecNonQuery(self,sql):
            cur = self.__GetConnect()
            cur.execute(sql)
            self.conn.commit()
            self.conn.close()
    
    
    
    
    
    # new一个对象
    # mssql = MSSQL('192.168.2.51', 'sa', 'Sql123456', 'AEHMS20201216')
    # mssql = MSSQL('.', 'sa', 'sa', 'AEHMS20201216')
    mssql = None
    
    
    
    
    
    
    
    
    def randomSplit(total):# 随机分组数据
        
        foo = [60,80,150,200,300,600]
        count = 0
        arr= []
        bl = True
        
        while (bl):
            num = choice(foo)# 随机取值
            if count + num >= total:# 最后随机取的那个数 超出当前范围 break
                break
            arr.append(num)
            count+=num
    
        if total != count:# 追加最后一个元素
            arr.append(total-count)
    
        print(count)
        print(arr)
    
        
        seg = []# 值如:[(0,50),(50,200)]
        
        print('--------------')
        curCount=0
        for num in arr:
            start = curCount
            end = curCount + num
            seg.append((start, end))
            print(start, end)
            curCount=end
    
        print(seg)
        return seg
    
    
    
    
    
    
    
    
    def createData(pointNum, avgValue): # 生成周期性数据
    
        long=pointNum # 400个步长,x轴的总长度
        base=avgValue # 均值
        ybase = np.zeros((1,long))[0] + base # 所有数据
        
    
        period_multiply = 0.1 # 越大,幅值越大,调整波峰
        period_frequency = 500 # 越大,周期越大
        
        all_period_multiply = [0.1, 0,2]# 预设多个幅值 [0.1, 0,2, 0.3, 0.4, 0.5]
        all_period_frequency = [50, 150, 200, 300, 400, 600, 800, 1000, 1300]# 预设多个周期值
    
        
        seg = randomSplit(pointNum)# 原始: seg = [(0, pointNum)]
    
        for (i,j) in seg: # 一组一组数据的遍历
            print(i, j)
            
            period_multiply = choice(all_period_multiply)# 随机取值
            period_frequency = choice(all_period_frequency)# 随机取值
            
            n = j-i # n=40,40 50
            x = np.arange(n)
            season1 = 0.2 * np.array([math.sin(i*0.2/period_frequency*math.pi) for i in x])
            season2 = 0.5 * np.array([math.sin(i*0.5/period_frequency*math.pi) for i in x])
            noise = np.random.normal(0, 0.2, len(x))
            y = season1 + season2 + noise # 可以叠加多尺度周期和噪声
            # y = season1+season2
            
            for idx in range(i, j): # 遍历具体的点
                # print(idx, period_multiply)
                value1 = ybase[idx] + y[idx-i] * period_multiply
                value2 = round(value1, 3) # 保留三位小数
                ybase[idx] = value2
         
    
        # plt.figure(figsize=(15, 3.5))
        # plt.plot(ybase)
        # plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=2.0)
        # plt.show()
        
        return ybase
    
    
    # # 测试
    # points = createData(200, 1.2)
    # print(points)
    
    
    
    
    
    
    def getIdsByCode(code): # 获取 ids by code
        sql = "SELECT ID FROM tb_SensorRecord WHERE Code='{}' AND GetTime>='2021-01-01' AND GetTime<='2021-07-01' ORDER BY ID ASC".format(code)
        results = mssql.ExecQuery(sql)
        arr_ids = []
        for row in results:
            arr_ids.append(row[0])        
        return arr_ids
    
    
    # # 测试
    # ids = getIdsByCode('080906')
    # print(len(ids))
    
    
    
    # # 测试 执行sql语句
    # mssql.ExecNonQuery("UPDATE tb_SensorRecord SET NewValue1='1' WHERE ID='4178839'")
    # print('ok')
    
    
    
    
    
    
    def getSensor(): # 获取所有的传感器,从Excel中读取传感器
        arr_sensors = []
        df = pd.read_excel('1.xlsx', dtype={'编码': np.str_}) # dtype指定列的数据类型
        for index, row in df.iterrows():
            arr_sensors.append({"code":row["编码"], "avgValue":row["均值"]})
        return arr_sensors
    
    
    # # 测试
    # sensors = getSensor()
    # print(sensors)
    
    
    
    
    
    
    
    
    # 主逻辑
    
    startTime = time.perf_counter()
    curCode = ''
    
    try:
        dbConfig = {
            'host' : '',
            'user' : '',
            'pwd' : '',
            'db' : ''
        }
        with open('dbConfig.json', 'r') as f:# 从文件中读取配置信息
            dbConfig = eval(json.load(f))
        print(dbConfig)
    
        mssql = MSSQL(dbConfig["host"], dbConfig["user"], dbConfig["pwd"], dbConfig["db"])
    
        sensors = getSensor()
        for item in sensors: # 遍历传感器
            print(item)
            code = item["code"]
            avgValue = item["avgValue"]
            curCode = code
            
            ids = getIdsByCode(code)
            points = createData(len(ids), avgValue)
            
            sql = ""
            for index, value in enumerate(ids):
                print(index, value, points[index])            
                sql += "UPDATE tb_SensorRecord SET NewValue1='{0}' WHERE ID='{1}';".format(points[index], value)            
                if (index % 8000 == 0):# 间隔写入到数据库
                    print("正在写入到数据库1")                
                    mssql.ExecNonQuery(sql)
                    sql = ""
                
            if sql.strip() != '':
                print("正在写入到数据库2")
                mssql.ExecNonQuery(sql)
                sql = ""
          
        print('处理完成') 
    
    
    except Exception as e:
        print('Error:', e)
        with open('err.txt', 'w') as f:
            json.dump(str(e)+",当前传感器:"+curCode, f)
    
    
    finally:
        endTime = time.perf_counter()
        print("The function run time is : %.03f seconds" %(endTime-startTime))
        os.system('pause')# 避免执行完后自动关闭控制台
    
    
    

    需要的外部文件

    json配置文件,用于放数据库链接

    "{"host": ".", "user": "sa", "pwd": "sa", "db": "AEHMS20210629"}"
    

    Excel文件,用于指定需要修改的传感器和均值

    修改后的数据预览

  • 相关阅读:
    流式布局
    发送短信验证码 倒计时
    jQuery-qrcode.js 生成带Logo 的二维码
    bootstrap-daterangepicker插件运用
    html 转 pdf
    input placeholder 在chrome 浏览器自动填充时,背景色覆盖原有背景图片问题。
    jQuery.qrcode 生成二维码,并使用 jszip、FileSaver 下载 zip 压缩包至本地。
    java学习之super、final、static关键字及匿名对象
    java学习之数组
    java学习之循环语句
  • 原文地址:https://www.cnblogs.com/guxingy/p/14950371.html
Copyright © 2020-2023  润新知