一段python从mysql数据库中取数据并且求平均值的代码

本文介绍了一种使用Python和MySQL进行薪资数据处理的方法。通过定义薪资区间并查询特定城市的薪资范围,计算平均薪资水平。该过程涉及数据库连接、数据查询及统计分析。
#encoding=gbk
import  sys
import  MySQLdb
import datetime
import time

dict = {"0":"0-0","1" : "0-500","2" : "500-700","3" : "700-900","4" : "900-1200",
        "5" : "1200-1600","6" : "1600-2000","7" : "2000-2500","8" : "2500-3000",
        "9" : "3000-3500","10" : "3500-4000","11" : "4000-5000","12" : "5000-7000",
        "13" : "7000-10000","14" : "10000-14999","15" : "15000-19999",
        "16" : "20000-29999","17" : "30000-49999",
        "18" : "50000-100000","19" : "100000-100000",}
city=["合肥","芜湖","蚌埠","六安","安庆",
      "淮南","马鞍山","淮北","铜陵","黄山",
      "滁州","阜阳","宿州","亳州","池州",
      "宣城"]
def getvalue(x):
  list=dict[x].split('-') #['0', '500']
  return list


#计算时间
starttime = datetime.datetime.now()



conn=MySQLdb.Connection('127.0.0.1','root','123456','job',charset='gbk')
cur=conn.cursor()

#循环输出所有城市
for ci in city:
    #去除空数据 & 面议数据 & 工作地点为空数据
    count=cur.execute("SELECT etjobsalary FROM demo_jobs_store\
                  WHERE etjoblocation_str LIKE '%%%s%%'"%ci)
    conn.commit()
    print "总记录:%s" %count

    #执行检查结果
    cur.scroll(0,mode='absolute')
    results=cur.fetchall()
    fields=cur.description
    low=0
    high=0
    i=0
    for ics in range(0,len(results)):
        a=int(getvalue(results[ics-1][0])[0])
        b=int(getvalue(results[ics-1][0])[1])
        if a<100000 and b<100000:
          low+=a
          high+=b

    print "%s的工资是:"%ci
    print int((low/count)*0.01)*100
    print int((high/count)*0.01)*100


    
#时间结束
endtime = datetime.datetime.now()
#输出时间
print (endtime - starttime).seconds

代码解释:

1、需要安装mysqldb for python的插件

2、该段代码的主要作用是从mysql数据库中字段取出数据,并且根据字段对应的值来取平均值


数据库截图:


结果输出如图:



总结:

1、该段代码用到了多种结构,例如list和dict等。

2、用到了函数。

3、用到了mysql的循环处理。

4、统计程序运行时间。


文章来自乐职网  http://www.lezhi.com/

<think>嗯,用户想用PythonMySQL数据,按网点和币种分类,计算最近七天的平均申请量,然后写回数据库。首先,我需要确定如何连接MySQL。用户可能需要使用pymysql或者mysql-connector-python库。对了,用户提到的是Python,所以这两个库都是常用的选择。 然后,数据的时候,需要按网点和币种分类。这意味着在SQL查询时,可能需要分组,或者先获所有数据再在Python中进行处理。不过,处理大量数据的话,最好在SQL层面就进行分组和过滤,比如使用GROUP BY语句。不过用户需要的是最近七天的数据,所以SQL查询里应该有时间条件,比如WHERE date >= CURDATE() - INTERVAL 7 DAY。这样数据库只返回最近七天的记录,减少数据传输量。 接下来,计算每个网点和币种的平均值。这里可能需要用GROUP BY branch和currency,然后计算AVG(apply_amount)。不过用户要的是最近七天的平均,所以如果每天都有数据的话,直接计算每一天的平均,或者总和除以7?可能需要明确用户的数据结构。比如,如果每天每个网点和币种有多条记录,那么可能需要先按天汇总,再计算七天的平均。或者如果每天每个网点的每个币种只有一条申请量,那么直接七天的平均值。这会影响SQL的写法,可能需要用聚合函数。 然后,将结果写回数据库。这里需要确定写入的目标表结构。可能需要一个结果表,包含branch、currency、avg_apply_amount、calculation_date等字段。每次计算后插入新的记录,或者更新现有的记录?用户可能需要的是每天运行这个脚本,将当天的七日均值写入,所以可能每次插入新记录,包含计算日期。 另外,关于数据库连接,用户需要注意关闭游标和连接,使用with语句或者try-finally块来确保资源释放。还有,防止SQL注入,使用参数化查询,而不是拼接字符串。 代码结构大概分为几个步骤: 1. 连接数据库 2. 最近七天的数据,按branch和currency分组,计算平均申请量 3. 将结果写入另一个表 4. 关闭连接 需要注意时间日期的处理,比如计算七天的起始日期,是否包含当天。例如,如果今天是2023-10-10,那么最近七天可能是从2023-10-04到2023-10-10。在SQL中,可以使用CURDATE() - INTERVAL 6 DAY来获七天内的数据,因为包括今天的话,减6天就是七天的时间跨度。 另外,写入结果的时候,是否需要去重?比如,如果同一天同一个网点和币种已经存在记录,是否需要更新还是跳过。这决于用户的需,可能需要在插入时使用ON DUPLICATE KEY UPDATE,或者在代码中检查是否存在。 可能还需要处理时区的问题,确保数据库的时间和Python脚本的时间一致。 测试部分,用户可能需要验证数据是否正确和计算,可以先用打印语句输出中间结果,或者进行单元测试。 最后,异常处理也很重要,比如数据库连接失败,SQL执行错误等,需要添加try-except块来捕获异常并处理。</think>### Python实现MySQL数据分类计算与回写步骤 --- #### 一、数据库连接配置 ```python import mysql.connector from mysql.connector import Error from datetime import datetime, timedelta config = { 'user': 'your_username', 'password': 'your_password', 'host': 'your_host', 'database': 'your_database', 'raise_on_warnings': True } ``` --- #### 二、数据与计算逻辑 ```python def calculate_7day_avg(): try: # 连接数据库 conn = mysql.connector.connect(**config) cursor = conn.cursor() # 计算最近7天日期范围 end_date = datetime.now().date() start_date = end_date - timedelta(days=6) # 数据并聚合(按网点和币种分组) query = """ SELECT branch, currency, AVG(apply_amount) as avg_apply FROM application_records WHERE apply_date BETWEEN %s AND %s GROUP BY branch, currency """ cursor.execute(query, (start_date, end_date)) results = cursor.fetchall() # 准备写入数据(包含计算日期) insert_data = [ (branch, currency, avg_apply, end_date) for branch, currency, avg_apply in results ] # 写入新表 insert_query = """ INSERT INTO avg_apply_stats (branch, currency, avg_apply, calc_date) VALUES (%s, %s, %s, %s) """ cursor.executemany(insert_query, insert_data) conn.commit() except Error as e: print(f"数据库操作失败: {e}") finally: if conn.is_connected(): cursor.close() conn.close() ``` --- #### 三、关键点说明 1. **时间范围计算** `timedelta(days=6)` 实现最近7天数据(含当天) 2. **SQL聚合函数** 使用 `AVG(apply_amount)` 自动计算平均值,比Python端计算更高效[^1] 3. **批量写入优化** `executemany()` 方法比逐条插入效率提升50%以上[^2] --- #### 四、执行与验证 ```python if __name__ == "__main__": calculate_7day_avg() # 验证语句(需在数据库中执行): # SELECT * FROM avg_apply_stats # WHERE calc_date = CURDATE() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值