LINUX.ORG.RU

Сообщения scientistpython

 

jupyter-notebook удаленная эксплуатация

На удаленной машине имеется docker с jupyter, что очень даже удобно для набора кода в браузере и запуска не долгих расчетов. Но, если расчеты долгие, то при закрытии браузера и, через некоторое время, открытие скрипта - результатов новых расчетов обнаружить не удается - или расчеты прерываются после закрытия браузера или просто доступ к результатам пропадает.

Как можно запускать расчеты + наблюдать результаты в удаленном jupyter и при этом не держать связь между браузером и ядром jupyter постоянно?

 ,

scientistpython
()

python по дате определить рабочий день или нет

Собственно, есть ли какая нибудь библиотечка, которая по дате вернет - был ли день рабочий. С учетом локдаунов, выходных, праздников … не только сб. и вс. Интересуют российские рабочие дни.

 

scientistpython
()

два timeseris на одном рисунке

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

index = pd.DatetimeIndex([
    np.datetime64('2021-01-01 00:01:02.000001'), 
    np.datetime64('2021-01-03 00:01:02.000001'), 
    np.datetime64('2021-01-05 00:01:02.000001'), 
    np.datetime64('2021-01-07 00:01:02.000001'), 
], dtype='datetime64[ns]', name='time', freq=None)

df = pd.DataFrame(
    {'val': np.arange(1, 5)},
    index = index)

нужно отобразить его на графике и подсветить, например, первые 2 значения другим цветом. Пробую прорисовать два датафрейма

ax = df.val.plot(kind='bar', color='blue')
df.val.iloc[:2].plot(kind='bar', color='red', ax=ax)
plt.show()
При этом часть первого датафрейма теряется. Как можно сделать, чтобы оба датафрейма отображались?

P.S. если более длинный датафрейм поставить последним, то увидим оба датафрейма, но это очень не красиво:

ax = df.val.iloc[:2].plot(kind='bar', color='red', width=0.2)
df.val.plot(kind='bar', color='blue', ax = ax, width=0.1)

 ,

scientistpython
()

Инвертировать cmap в imshow

Можно ли в matplotlib.pyplot.imshow с параметром cmap='gray' инвертировать карту цветов так, чтобы 0 рисовался белым и числа больше нуля серыми оттенками. По умолчанию ноль черный, а числа больше нуля более светлые. Отображаемый массив значений содержит значения больше и равные нулю.

P.S. Отображаемый массив менять не желательно при этом, так как, например, при умножении отображаемых данных на -1 получается нужная картинка, но на colormap при этом не объяснимые значения.

 ,

scientistpython
()

увеличить диапазон индексов у ДатаФрейма

Имеется Series, например, s

             x
2020-01-02  22
2020-01-04  33
2020-01-07  55

Как можно увеличить диапазон индексов до

pd.date_range("2020-01-01", periods=10, freq="d")
заполнив нулями не существующие в s даты?
               x
2020-01-01   0.0
2020-01-02  22.0
2020-01-03   0.0
2020-01-04  33.0
2020-01-05   0.0
2020-01-06   0.0
2020-01-07  55.0
2020-01-08   0.0
2020-01-09   0.0
2020-01-10   0.0

 ,

scientistpython
()

pandas уникальная пара полей

Как вернуть уникальные пары полей x и y? Например, для датафрейма:

> df = pd.DataFrame({'x': [1, 2, 3, 1, 2], 'y': [2, 1, 3, 2, 1]})
   x  y
0  1  2
1  2  1
2  3  3
3  1  2
4  2  1
результат такой:
[(1, 2), (2,1), (3, 3)]

 ,

scientistpython
()

визуализация DataFrame

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

df = pd.DataFrame(
    {'x': [5, 0, 5, 1]},
    index = pd.DatetimeIndex(['2021-05-02', '2021-05-03', '2021-05-04',
                              '2021-05-05'])
)
если прорисовать его просто методом
start = '2021-05-01'
end = '2021-05-21'
df.plot(grid=True, color='green', xlim=(start,end))
то отобразиться график с осью абсцисс имеющий каждодневные метки.

Как заставить plot() ставить метки пореже, например, поставить метки: 1 мая, 10 мая, 21 мая?

P.S. если воспользоваться xticklabels из matplotlib.AxesSubplot (в DataFrame.plot подобного не нашел) то и дни и три даты налепляются друг на друга:

index1 = pd.date_range(start=start, end=end, freq='10D')
ax = df.plot(grid=True, color='green', xlim=(start,end), xticks=index1)
ax.set_xticklabels(index1.date, rotation=45)

ну и т.д. много чего пока не удалось дожать до конца, хотелось бы встать на true way в вопросах визуализации )

 , ,

scientistpython
()

numpy.datetime64 обнулить время

как обнулить время в datetime64

t = numpy.datetime64('2021-03-04 17:18:19.20')
нужно получить datetime64('2021-03-04').

Можно конечно через datetime, но не хочу привелекать для этого целую библиотеку )))

>>> np.datetime64(t.astype(datetime.date).date())
numpy.datetime64('2021-03-04')

 ,

scientistpython
()

sqlalchemy как обновить таблицу

Имеется DB модель и DTO к ней. После выполнения выборки из БД в виде списка DTO, с элементами списка выполняется работа — поля обновляются и нужно подключиться к БД и обновить строки таблицы, соответсвующие DTO-шкам.

Как это сделать? застрял опять

@dataclass
class MyData1:
    name: str
    id: int = None
    @classmethod
    def fromMyTable1(cls, elem):
        return cls(id=elem.id, name=elem.name)

    @classmethod
    def toMyTable1(cls, elem):
        return MyTable1(id=elem.id, name=elem.name)

class MyTable1(Base):

    __tablename__ = 'MyTable1'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)


def getAll() -> List[MyData1]:
    result = []
    with sessionScope() as session:
        rows = session.query(MyTable1).all()
        for row in rows:
            result.append(MyData1.fromMyTable1(row))
    return result

def insertAll(datas: List[MyData1]):
    with sessionScope() as session:
        for data in datas:
            row = MyData1.toMyTable1(data)
            print(row.id, row.name)
            # HOW TO UPDATE  ???

P.S. Нужно разделить выборку данных и обновление, и делать это не в рамках одной сессии. Т.е. я выбрал данные, поработал и потом сохранил:

myDatas = getAll()
for data in myDatas:
    data.name = 'my_{}'.format(data.name)
insertAll(myDatas)

P.S.2 почемуто не элегантным мне кажеться такое решение

def insertAll(datas: List[MyData1]):
    with sessionScope() as session:
        for data in datas:
            row = MyData1.toMyTable1(data)
            rows = session.query(MyTable1).filter(MyTable1.id==row.id) \
                          .update({'name': row.name})
как всегда, сам не знаю, но что-то не устраивает ))) может можно не перебирать все поля?

 ,

scientistpython
()

как правильно обращаться с Алхимией

Как вернуть реальные данные из БД в Академии в виде объектов класса MySubject с заполненными полями?

в этом коде возвращается список словарей с ключем '_sa_instance_state' и значением sqlalchemy.orm.state.InstanceState:

def getMySubject(
        creation_date: datetime.date) -> List[MySubject]:

    subjects= []

    with sessionScope() as session:
        rows = (session 
               .query(MySubject) 
               .filter(MySubject.creation_date ==
                   creation_data)
               # ...
               .all()
        )
        for row in rows:
            subjects.append(row)
    return subjects

 ,

scientistpython
()

копировать данные между объектами классов

Имеются классы.

@dataclass
class A:
    x: int
    y: str
    z: float


class B:
    x: int
    y: str
    u: str

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def __repr__(self):
        return str(self.__dict__)

Нужно написать мэпперы, которые помогут копировать данные между объектами этих классов. Представим что методов много, и банальный перебор полей не хотелось бы делать и поддерживать:

a = A(x=1, y='a', z=2.2)
b = B(x=a.x, y=a.y, u='b')

Какие паттерны тут существуют?

Словарь распаковывать или что-то еще есть?

b = B(**{k:v for k,v in a.__dict__.items() if k in ['x', 'y']}, u='b')

А можно организовать волшебный метод, который может организовать присвоение:

b=a
или
b=B(a)
?

 ,

scientistpython
()

установить тип объекта

Как оказалось оператор isinstance считает различными типы объектов в зависимости от пути к ним. Т.е. разные по типам объекты

<class '__main__.MyClass22'>

и

<class 'module2.module22.MyClass22'>

Как правильно установить тип объекта? У меня есть функция, которая в зависимости от типа объекта реализует различные алгоритмы ...

P.S. помогло object.__class__.__name__ , но как-то без магических методов не по-питонски это

 ,

scientistpython
()

PEP8 вызвать много методов

А стандарт регламентирует вызов множества методов в в одном выражении?

def my_funct(x: int, yy: MyClass) -> int:
    res: int
    if x > 0:
        res = yy.my_very_hard_and_very_long_name_method_1() \
                .my_very_hard_and_very_very_very_long_name_method_2() \
                .my_methdod_3().my_method_4().my_meth_5()
    else:
        res = 0
    return res

 ,

scientistpython
()

sqlalchemy проверить на дубликат перед вставкой

В sqlalchemy существует метод для проверки на дубликат перед вставкой записи?

Есть модель-таблица

class MyTable(Base):

    __tablename__ = 'MyTable'

    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False)
    date = Column(Date, nullable=False)
    count = Column(Integer, nullable=False)

    __table_args__ = (UniqueConstraint('name', 'date', name='uniq_idx_1'), )

Метод вставки

def insert(myTable: MyTable) -> None:
    with sessionScope() as session:
        session.add(myTable)
будет бросать исключение, если идет дубликат по комбинации уникальных полей name и date. Как бы предварительно перед session.add прочекать строчку для вставки на отсуствие дубликата? обязательно ли все записи выбирать?

 ,

scientistpython
()

DTO в Python

Как можно запретить добавлять новые поля (кроме x и y в примере)?

class MyDTO:
    x: int
    y: str

    def __init__(self, **kwa):
        self.__dict__.update(kwa)

    def __repr__(self):
        return str(self.__dict__)


dto = MyDTO(x=2, z='22') # хотелось бы, чтобы интерпретатор не допустил z из-за отсуствия ее в явно выписанных полях
print(dto) # {'x': 2, 'z': '22'}

Делать

__init__ (self, x: int, y: str)
не хочу, т.к. полей будет очень много и с ними будет путаница.

 

scientistpython
()

git как узнать что изменилось в незакоммиченном файле

Часто попадаю в такую ситуацию. Имеется проект и git status сообщает о наличии изменений в файле (а что делал - ну совсем забыл)

$ git status
On branch development

	modified:   service/package1/module2.py
...

Как узнать --- что изменилось в файле не выполняя коммит?

 

scientistpython
()

Python типизация с DataFrame

Функция возвращает pandas.DataFrame. Как указать тип возвращаемого значения?

FrameDTO = {'x': pd.Series(dtype='int'),
            'y': pd.Series(dtype='str')}
	
DataFrameDTO = pd.DataFrame(FrameDTO) \
                 .astype('datetime64[ns]')	


def make_df() -> type(DataFrameDTO): # error: Invalid type comment or annotation
                                     #  note: Suggestion: use type[...] instead of type(...)
	x = pd.Series([1, 2, 3])
	y = pd.Series(['a', 'b', 'c'])
	df = pd.DataFrame({'x': x, 'y': y})
	df.index = pd.date_range(start='1/1/2021', end='1/3/2021')
	return df

P.S. mypy 0.812

p.S.2. вот такой дизайн не устраивает, хотелось бы четко определиться с типами колонок и индексов и их названием :

def make_df() -> pd.core.frame.DataFrame:

 ,

scientistpython
()

Python3 попытка указать тип из numpy

Можно ли в Python3 использовать не только базовые типы для типизирования параметров функции? Если да, то как?

import numpy as np

def my_funct(int: days, np.datetime64: date) -> (int, str):
  File "<ipython-input-48-27844e51a60c>", line 1
    def my_funct(int: days, np.datetime64: date) -> (int, str):
                              ^
SyntaxError: invalid syntax

 , ,

scientistpython
()

SQL засунуть LOOP в SELECT

Имеется Постргя. Как уменьшить код и генерить строки автоматом?

Проблема следующая.

Получаю уникальные значение val1, val2, val3, ...

SELECT DISTINCT "field_2" FROM "MyTable" ;

Потом ручками фигачу:

SELECT "field_1" as "f1", 
    SUM(CASE "field_2" WHEN 'val1' THEN 1 ELSE 0 END) AS "val1", 
    SUM(CASE "field_2" WHEN 'val2' THEN 1 ELSE 0 END) AS "val2",
    # ... можно ли в цикле сгенерить строки с val3, val4 ...
    COUNT(1) AS "summa"
FROM "MyTable" 
GROUP BY "f1";

Как бы в рамках SQL (без высокоуровневых pivot или crosstab) упростить последнеее выражение, заставив Постгрю генерить SUM(...) самостоятельно в цикле?

 , ,

scientistpython
()

python3 сгенерить методы можно ли?

Привет, всем! А ведь наверняка можно в Питоне сгенерить методы.

Ну, например, ниже __init__ и __repr__ набивать руками очень неблагодарное дело.

Подскажите, как генернуть __init__ и __repr__???

class MyTable(Base):
    
    id = Column(Integer, primary_key=True)
    field1 = Column(String, nullable=False)
    field2 = Column(String, nullable=False)
    # ...
    fieldN = Column(String, nullable=False)    


    def __init__(self, field1, ... fieldN):

        self.field1 = field1
        #
        self.fieldN = fieldN


    def __repr__(self):

        return "<MyTable({} ... {})>".format(field1, ... fieldN)

 

scientistpython
()

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