Сгенерируйте данные с помощью zipfian distribution и заполните базу данных MySQL данными - PullRequest
0 голосов
/ 09 мая 2020

Мне нужно сгенерировать данные, которые имеют zipfian-распределение, а затем заполнить базу данных этим набором сгенерированных данных. Если у меня есть таблица MySQL:

CREATE TABLE table1(
   id INT(11) PRIMARY_KEY AUTO_INCREMENT,
   x INT(11) NOT NULL,
   ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

, я хочу сгенерировать данные с распределением zipfian в соответствии с переменной 'x'. Эта переменная имеет диапазон от 1 до 10. Я использовал этот post для создания следующего python скрипта:

 import numpy as np
 import pymysql


 def Zipf(a: np.float64, min: np.uint64, max: np.uint64, size=None):
     """
     Generate Zipf-like random variables,
     but in inclusive [min...max] interval
     """
     if min == 0:
         raise ZeroDivisionError("")
         v = np.arange(min, max+1) # values to sample
         p = 1.0 / np.power(v, a)  # probabilities
         p /= np.sum(p)            # normalized

         return np.random.choice(v, size=size, replace=True, p=p)

 min = np.uint64(1)
 max = np.uint64(10)

 q = Zipf(1.2, min, max, 100)
 # print(q)

 db = pymysql.connect(host="localhost",    # your host, usually localhost
                 user="root",         # your username
                 passwd="password",  # your password
                 db="db2")        # name of the data base

 # you must create a Cursor object. It will let
 #  you execute all the queries you need
 cur = db.cursor()
 for i in q:
     cur.execute('INSERT INTO table1 (x) VALUES("%x")' % (int(i)) )
     db.commit()

Это дает мне следующую ошибку:

  File "/Users/alfie/PycharmProjects/zipfian/zipf.py", line 36, in <module>
    cur.execute('INSERT INTO table1 (x) VALUES("%x")' % (int(i)) )
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/connections.py", line 732, in _read_query_result
    result.read()
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/Users/alfie/PycharmProjects/zipfian/venv/lib/python3.7/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.InternalError: (1366, "Incorrect integer value: 'a' for column 'x' at row 1")

Если я использую 3 и 8 в качестве минимума и максимума, как это сделано в сообщении, которое я связал, ошибки нет, и все работает. Также, даже когда я изменяю диапазон, print (q) все еще работает. Любая помощь будет оценена

1 Ответ

1 голос
/ 09 мая 2020

Мне удалось исправить ошибку, заменив для l oop на это:

for i in q:
    val = {
        'x': int(i)
    }
    sql = "INSERT INTO table1 (x) VALUES (%(x)s)"
    cur.execute(sql, val)
    db.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...