LINUX.ORG.RU

Сообщения scientistpython

 

git отказаться от изменений

Как отказаться от изменений в файле grpc/server/main.py (скорее всего что-то нечаянно поменял, но не помню где) и сказать гиту что я хочу использовать версию main.py с сервера:

error: Your local changes to the following files would be overwritten by merge:
	grpc/server/main.py
Please commit your changes or stash them before you merge.
Aborting
? я не хочу ни коммитить ни прятать, я просто хочу отказаться от изменений

 

scientistpython
()

python3 grpc

Имеется gRPC сервер с методами:

rpc monitoring (google.protobuf.Empty) returns (stream Status);
rpc getData (DataId) returns (stream Data);
Метод getData в потоке отдает данные, а monitiring позволяет следить за процессом передачи данных.

Пишу на Python клиента, в частности использующего эти процедуры. По аналогии с рабочим сишным кодом реализовал следующий алгоритм. Запустил поток забора данных с процедурой getData(), а затем в основном потоке запустил мониторинг:

with grpc.insecure_channel('localhost:50051') as channel:
    stub = data_service_pb2_grpc.DataServiceStub(channel)
    def upload(dataId):
        DataId = {'dataId': dataId}
        input_stream = stub.getData(data_service_pb2.DataId(**DataId))
         while True:
            element = next(input_stream)
            # ...
            if # ЗдесьУсловиеОкончанияПотока:
                break
            time.sleep(1)
            
    thread = Thread(target=upload, args=(newId,))
    thread.start()

    status_stream = stub.monitoring(empty_pb2.Empty())
    while True:
        status = next(status_stream)
        print(status) # вот здесь ПУСТО, но сервер точно передает статусы
        time.sleep(1)

При этом данные есть, а мониторинг возращает пустое значение. Как исправить ситуацию и заставить мониторинг monitoring читать данные? Да, что интересно. Если прервать работу скрипта и перезапустить, то данные не читаются (stub.getData) а статусы из мониторинга (stub.monitoring) читаются. Спасибо!

 , ,

scientistpython
()

pandas plot прорядить метки оси абсцисс для гистограммы

Имеется датафрейм df

            values
date              
2021-01-01       3
2021-01-02       0
2021-01-03       0
2021-01-04       0
2021-01-05       0
...
2021-02-05       0
2021-02-06       0
2021-02-07       1

При прорисовки гистограммы для него даты перекрывают друг други и не читаются

ax = df.plot(kind='bar') 

Если добавить метки только за месяц - то вообще ничего не отображается, хотя данных больше чем за месяц

ax.xaxis.set_major_locator(mdates.MonthLocator())

Как отформатировать (хотябы просто прорядить) прорисоку меток в pandas?

 , ,

scientistpython
()

sqlalchemy session in Process

Из [1] следует, что сессия Session() д.б. едина в приложениии. А что делать, если в основной программе нужно открыть сессию и в отдельном процессе-демоне нужно открыть сесссию к одной и тойже БД.

[1] https://docs.sqlalchemy.org/en/13/orm/session_basics.html

 , ,

scientistpython
()

Выбрать всю строку при группировки SQLAlchemy как?

Имеется табличка:

 id | createdDate | user | kind |  team  
----+-------------+------+------+--------
  2 | 2020-12-12  | y    | A    | red
  3 | 2020-12-12  | z    | A    | blue
  4 | 2020-12-12  | y    | A    | green
  1 | 2020-09-11  | x    | A    | red
  5 | 2020-12-13  | q    | B    | orange
  6 | 2020-12-22  | t    | A    | green

При выполнении группировки в список попадают значения поля user:

session.query(A.team, func.array_agg(A.user, type_=ARRAY(String)), 
              func.count(A.user)).group_by(A.team).filter(A.kind == 'A')
('blue', ['z'], 1)
('green', ['y', 't'], 2)
('red', ['y', 'x'], 2)
А как вместо значений поля user сделать элементом списка всю строку:
('blue', [('2020-12-12', 'z', 'A', 'blue', '2020-10-10')], 1)
('green', [('2020-12-12', 'y', 'A', 'green', '2020-11-10'), ('2020-12-22', 't', 'A', 'green', '2020-11-10')], 2)
('red', [('2020-12-12', 'y', 'A', 'red', '2020-10-10'), ('2020-09-11', 'x', 'A', 'red', '2020-10-10')], 2)
?????

P.S. вроде можно заджойница, но не могу синтаксически построить конструкцию никак

session.query(A.team, func.array_agg(A.id, type_=ARRAY(Integer)), 
              func.count(A.id)).group_by(A.team).filter(A.kind == 'A') ... .join(A ...)

 , ,

scientistpython
()

SQLAlchemy кустомный слайс

имеется таблица

 user | kind |  team  
------+------+--------
 y    | A    | red
 z    | A    | blue
 y    | A    | green
 x    | A    | red
 q    | B    | orange
 t    | A    | green

и вот такая выборка

session.query(A.team, func.array_agg(A.user, type_=ARRAY(String)), 
              func.count(A.user)).group_by(A.team)\
              .filter(A.kind == 'A')
('blue', ['z'], 1)
('green', ['y', 't'], 2)
('red', ['y', 'x'], 2)
Третий столбец - число user в списке из второго столбца.

Как бы мне к ней сделать метод slice(idx1, idx2), который будет порционно выдавать списки пользователей? Например,

slice(0,3)
('blue', ['z'], 1)
('green', ['y', 't'], 2)
slice(3,4)
('red', ['y', 'x'], 2)

 , ,

scientistpython
()

pandas: считать временной ряд, начиная с конкретной даты

Хочу считать строки, начиная с конкретной даты, например 2020.12.13, но почему-то цепляется строка до этой даты.

>>> df = pd.DataFrame({'date': ['2020-12-12','2020-12-13'], 'value': [4, 5]})
>>> df.index = pd.to_datetime(df['date'])
>>> df.drop(['date'], axis='columns', inplace=True)
>>> df.at_time(datetime(year=2020,month=12,day=13))
            value
date             
2020-12-12      4
2020-12-13      5

 ,

scientistpython
()

шаблон Repository с SQLAlchemy

Как корректно заюзать Engine и Session из SQLAlchemy для создания репозитория моделей? Нужно ли делать синглтон(ы) для них или пусть каждая модель запускает свой движек и сессию?

Base = declarative_base()
class A(Base):
    ...

class B(Base):
    ...

class Store:

    def __init__(self):
        psql = 'postgresql://user:123@localhost/pdb'
        self.engine = create_engine(psql)
        self.sessionMaker = sessionmaker(bind=self.engine)
        self.sessionMaker = self.sessionMaker()

    def __del__(self):
        self.sessionMaker.commit()
        self.sessionMaker.close_all()    

class AStore(Store):

    def reCreate(self):
        Base.metadata.drop_all(bind=self.engine, tables=[A.__table__])   
        Base.metadata.create_all(self.engine, tables=[A.__table__])  

    def adds(self, rows):     
        for row in rows:
            params = A(**row);
            self.sessionMaker.add(params)
        self.sessionMaker.commit()   

class BStore(Store):
    ...

 , , ,

scientistpython
()

sqlalchemy собственная функция при группировки

Как при группировки подставить собственную функцию, которая сожержимое столбцов запихивает в список.

class A(Base):
    
    __tablename__ = 'A'

    id = Column(Integer, primary_key=True)
    a = Column(String)
    b = Column(String)

=> select * from public."A";
 id | a | b 
----+---+---
  1 | q | w
  2 | q | v
  3 | e | r
(3 rows)

Нужна своя функция, которая при группировки будет добавлять в список содержимое столбца

session.query(A.a,  my_concatenate_funct).group_by(A.a)

('q', ['w', 'v'])
('e', ['r'])

 ,

scientistpython
()

Сконвертить данные класса Python3 в строку INSERT для Postgree

Привет, всем! Имеется множество классов Python с типизированными полями.

from datetime import date


class A:
    
    x: int = 1
    y: date = date(2020, 12, 12)
    
    def __init__(self, x:int, y:date):
        self.x = x
        self.y = y
        
    def getX(self) -> int:
        return self.x

    def getY(self) -> date:
       return self.y

    ...


class B:
    z: float = 2.2

...

Можно ли сделать универсальную процедуру (лучше метод базового класса), генерирующую запрос SQL INSERT в стиле psycopg2

query = ("INSERT INTO A (x, y, ...) VALUES (%s, %s, ...)", (a.x, a.y, ...))

Спасибо.

 

scientistpython
()

RSS подписка на новые темы