• В чем проблема random.uniform?

    Maksim_64
    @Maksim_64
    Data Analyst
    При распаковке time_range у тебя 12 элементов а должно быть два. По всей видимости вот это 43200, 50400 это массив строк, а не два числа в массиве. Вот он тебе и распаковывает их в uniform("4","3","2"..,"0"). А должен распаковывать, в виде uniform(43200,50400). time_range приходит не в том виде в котором ты его ожидаешь.

    Пишет он takes 3 потому что он еще и self считает. И пишет он 13 по факту в time_range у тебя 12 их также self учитывает. Так и выходит 43200, 50400 - 10 цифр + 1 запятая + пробел = 12 + self = 13 элементов.
    Ответ написан
    Комментировать
  • Как правильно импортировать таблицу excel в бд postgre?

    Maksim_64
    @Maksim_64
    Data Analyst
    Я бы в принципе рекомендовал использовать pandas для таких целей.
    1. Читаем excel в pandas dataframe псевдокод будет такой.

    import pandas as pd
    df =pd.read_excel(data.xlsx,sheet_name=’Ткани’)

    у функции read_excel много параметров, в том числе header, index_col которые возможно придется настраивать.

    2. Глянул бы на него что таблица в порядке (это как фрейм запишется в базу), глянул бы на типы данных, df.dtypes что бы все типы колонок, были в том виде как их ожидает база. Если надо изменил бы их. Проверил бы есть ли пропущенные значения (nan, NA). Если есть провел бы работу с ними.

    3. Затем бы отправлял в базу методом to_sql(). Псевдо код будет такой.
    df.to_sql('table_name', connection, if_exists='replace')

    Параметр if_exists (если таблица существует) имеет также метод append просто весь фрейм добавит новыми строками, и fail тогда будет ошибка.

    У pandas хорошая документация и он силен в чтениях фалов любых форматов, так что если что то не получается, это почти всегда поправимо, ну и как писать в базу тоже конфигурируется очень удобно, так что если в этом будут проблемы то тоже решается.
    Ответ написан
    1 комментарий
  • Как определить, где запущен код python - в PyCharm или в Google Colab?

    Maksim_64
    @Maksim_64
    Data Analyst
    from tqdm.auto import tqdm
    И все для терминала будет обычное, а для notebook'a специальное.
    Ответ написан
    2 комментария
  • Как выбрать правильно выбрать период в pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну во первых ты не представил игрушечного датафрейма (входные данные), и каков желаемый результат (выходные данные).

    Вместо этого ты дал фрагмент кода не связанного с проблемой по всей видимости код был написан chatGPT, по скольку он очень низкого качества и попросту странный очень на вряд ли даже начинающий программист напишет такой pandas код.

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

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'temperature':[
            1.5,1,4,-2,1,-1,-1,4,3,2,1,-2,-3,-4,-5,-6,-1,2,-2,-2,-3,4,-5,-3,3,1,2,5,3,2
        ]
    }, index = pd.date_range('2023-01-01', periods=30))
    
    
    negative_groups = (
        df
        .query('temperature < 0')
        .groupby((df.temperature > 0).cumsum())
    )
    positive_groups = (
            df
            .query('temperature >= 0')
            .groupby((df.temperature < 0).cumsum())
    )
    start_date = [value for value in negative_groups.groups.values() if len(value) >=5][0][4]
    end_date = [value for value in positive_groups.groups.values() if len(value) >=5][0][4]
    
    df.loc[start_date:end_date]


    Я создал фрейм, и вытащил из него индексы даты, 5-го значения для последовательно отрицательных элементов. Как начало зимы и индекс даты 5-го значения для последовательности положительных элементов. И осуществил выборку между этими датами.

    Заметь, если у нас например 6 повторяющихся отрицательных элементов то он он возьмет дату 5 так как по условию если 5 то начало зимы и если 5 то конец.

    Ну распечатай фрейм и распечатай выборку подсета из фрейма и убедишься, что работает правильно. Бери мой пример и прикручивай его к своим данным. Не забудь дату поставить в индекс и не забудь что бы у даты был тип данных date а не object.
    Ответ написан
  • Почему Jupyter noteboor не видит torch?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты когда команду запускаешь, !pip3 show torch там тебе должно выдать в том числе и location (Путь). Ты не упомянул, у тебя стоит анаконда или ты просто jupyter поставил. Судя по всему анаконду ты не установил. Создай окружение посредством conda в терминале, активируй его conda activate environment name. Затем запусти, jupyter и тогда устанавливай torch.

    Еще в jupyter посмотри у тебя есть разные окружающие среды ты можешь сменить kernel? если нет установи ipykernel. И проделай то что я написал выше.

    Вот по ссылке пример, что бы с ipykernel не запутался https://www.geeksforgeeks.org/using-jupyter-notebo... . Это на случай если проблема в том что ipykernel не установлен. А так не забудь активировать свое окружение а не просто его установить.
    Ответ написан
  • Как отсортировать значение по группам?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри скажу прямо задачка для общего кейса безнадежная надо менять вводные, потому что с одной стороны мы можем создать категории например ОГСЭ но затем у них еще и индексы 01, 02 и т.д., для того куска что ты дал я сделал, ну как общее решение это надо на уровне дизайна проблемы решать.
    cat = pd.Categorical(df['Шифр дисциплины'].str.split('.').str[0], 
    categories=['ОГСЭ','ЕН','ОПЦ','МДК','УП','ПМ','ПП'])
    print(df
     .groupby(cat)
     .apply(lambda x: x.sort_values('Шифр дисциплины', key = lambda x: x.str.split('.').str[1]))
     .reset_index(drop=True)
    )

    По решению, трюк следующий, создаем категории, они имеют порядок индекс. Когда, мы группируем groupby он СОРТИРУЕТ по умолчанию, и затем мы сортируем снова. То есть хитрость в том что бы впихнуть двойную сортировку, сначала по категориям а потом по цифрам внутри каждой категории.

    Кстати имей ввиду во второй своей попытке ты был на правильном направлении и задачка вполне себе типичная, только вместо твоего кода надо писать вот так
    cat = pd.Categorical(df['Шифр дисциплины'].str.split('.').str[0], 
    categories=['ОГСЭ','ЕН','ОПЦ','МДК','УП','ПМ','ПП'])
    df.sort_values(by=['Шифр дисциплины'],key= lambda x: cat)
    Результат будет, как у тебя только кода меньше и без всяких созданий временных колонок.

    Но повторюсь, для общего кейса на уровне дизайна надо работать, такие сложные парсинги внутри колонок это плохо. Pandas он конечно может все (что помещается в память) но лучше для полезных задач его использовать.
    Ответ написан
    2 комментария
  • Как добавить готовый график в Figure (matplotlib)?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ты уверен что ты понимаешь что такое объект Figure в matplotlib? Это канва, на которой ты размещаешь axes (оси координат и уже на этих осях ты непосредственно рисуешь графики). Прямого api что бы засунуть sympy plot на matplolib figure, не существует. Потому что это не оси с графиками а своя ФИГУРА с осями и на них графиками.

    Можно ли это обойти, да конечно можно создать урода и присобачить на figure sympy plot.
    import matplotlib.pyplot as plt
    import numpy as np
    from sympy import Symbol
    from sympy.plotting import plot
    x = Symbol('x')
    X = np.linspace(-3,3,100)
    y = np.cos(X)
    def add_plot(p, ax):
        backend = p.backend(p)
        backend.ax = ax
        
        backend._process_series(backend.parent._series, ax, backend.parent)
        backend.ax.spines['right'].set_color('none')
        backend.ax.spines['bottom'].set_position('zero')
        backend.ax.spines['top'].set_color('none')
        plt.close(backend.fig)
    
    p = plot(x**2, (x, 0, 3), show=False)
    
    fig, ax  = plt.subplots(1,2, figsize=(18,9))
    ax[0].plot(X,y)
    add_plot(p, ax[1]);


    Вот мы имеем фигуру с двумя осями, одна нормальная matplob'вская вторая из sympy.
    Вот здесь кто то постарался и прикрутил. Почитай, что пишут.
    Ответ написан
    Комментировать
  • Почему не работает скрипт на python?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну разные они, строка из файла и твоя строка, да и все. Возможно пробелы лишние, когда из файла читаешь, там специальные символы могут быть, например \n, когда ты выводишь строку с помощью print, ты его не видишь и тебе зрительно кажется, что они одинаковые. Посмотри на print(repr(list_of_names[0])) и на свою строку, приведи их к одному виду, что бы list_of_names[0] == 'Абакус Прайм, СЭ' возвращал True. И будет работать.
    Ну и ошибка то наверное общего характера соответственно проведи работу над всеми строками, которые ты получаешь из файла.
    Ответ написан
    2 комментария
  • Как в python при чтении файла excel убрать дубликаты ячеек в одном столбце и сложить соответствующие значения в другом?

    Maksim_64
    @Maksim_64
    Data Analyst
    читай в pandas фрейм, методом read_excel.
    Затем группируй по номеру и аггрегируй функцией sum.
    Псевдо код будет такой.
    df = pd.read_excel('Твой Файл')
    df.groupby('Телефон A')['Сумма'].sum()

    Функция, read_excel имеет огромное количество параметров, возможно что то придется настраивать. Остальное называется группировкой, и аггрегацией, на каждой группе. Результатом будет сумма по каждому номеру.
    Ответ написан
    Комментировать
  • Как подобрать начальные входные весовые коэффициенты (веса) для нейронной сети?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну это инженерное решение, тут единственного правильного подхода нет. Случайная выборка, как от 0 до 1 например или случайная выборка от -1 до 1. Или по формулам разным Случайная выборка осуществляется из равномерного распределения или из нормального.

    В общем вот маленькая статья что бы не повторятся, там от простой выборки и до выборок по формулам в зависимости от функции активации, заодно там и пару коротеньких примеров на python имеется.
    Ответ написан
    Комментировать
  • Как удалить нумерацию и пустую строку в excel pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    Из коробки решения нет не для одной из твоих проблем. Ему нужен индекс, для того что бы сохранять иерархическую структуру.

    Можно ли это обойти, ну в программировании можно много чего обойти, вопрос а НУЖНО ли это, так или иначе, если хочется НЕНУЖНЫХ изобретений, то можно разбить проблему на две части отдельно писать иерархический header, отдельно данные, чего я бы на практике я не делал (чревато тем что, таблица "сдвинется куда нибудь") и вот тогда действительно проблематично.

    Удалить только пропущенную строку можно "относительно" безопасно.
    def write(df, xl_writer, startrow = 0,**kwargs):
       
        df.drop(df.index).to_excel(xl_writer, startrow = startrow,**kwargs)
        df.to_excel(xl_writer, startrow = startrow + 1,header = False,**kwargs)
        
    writer = pd.ExcelWriter("test_only_removed_empty_row.xlsx",engine='xlsxwriter')
    write(df, writer, sheet_name = 'Лист1')
    writer.close()

    Это более менее безопасно, удаление индекса все еще возможно, но приходится начинать ловить сдвиги, для общего случая ТАК ДЕЛАТЬ НЕЛЬЗЯ. Так или иначе, ужасная функция которая сделает это вот
    def write(df, xl_writer, startrow = 0,startcol=0,**kwargs):
       
        df.drop(df.index).to_excel(xl_writer, startrow = startrow,startcol=startcol,**kwargs)
        df.droplevel(0,axis=1).to_excel(xl_writer, startrow = startrow + 2, startcol=startcol+1,header = False,index=False,**kwargs)
        
    writer = pd.ExcelWriter("bad_practice.xlsx",engine='xlsxwriter')
    write(df, writer, sheet_name = 'Лист1')
    writer.close()


    Ну и в завершение, повторюсь, написание иерархических колонок, без индекса (index=False). Попросту выдает ошибку NotImplemented (Это не поддерживается текущим API). А вот такие "решения", как я продемонстрировал сомнительны. И да возможно, если не уставлен, придется установить xlsxwriter, или убрать параметр engine, что бы он использовал свой, там openpyxl по умолчанию стоит.
    Ответ написан
    Комментировать
  • Как работает оценка влияния признаков в методе vip() библиотеки vip в R?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри, vip - Variable Importance Plot. Это думаю ты и сама знаешь.

    1. Как измеряются - здесь все зависит от моделей и от задач которые они выполняют (задача регрессии или классификации). Много различных способов измерения важности предикторов (признаков) . По этому поговорим интуитивно, а не о деталях. Зачем это нужно в рамках анализа? В рамках нашей модели, какие предикторы (признаки) наиболее важные, на этот вопрос мы хотим ответить, например, мы можем выкинуть предикторы (признаки) со слабым влияниям (это может серьезно улучшить стабильность нашей модели, то как модель будет работать в продакшене потому что чем больше предикторов (признаков) тем больше ИСТОЧНИКОВ потенциальной ошибки, и если предиктор (признак не имеет практически никакого влияния для нас) то лучше от него избавится).

    2. В чем измеряется - и тут все зависит от модели и от метрики (на которой точность этой модели измерялась). Тут единица измерения ВАЖНОСТЬ. Для множественной линейной регрессии это это одна единица для деревьев другая. По этому у тебя на оси x VIP scores (Просто оценка важности). Что бы иметь более детальную интерпретацию, это надо брать модель, брать метод оценки MSE, RMSE, r_squared и т.д. и отдельно работать, в рамках данной функции это просто оценка важности.
    Ответ написан
    Комментировать
  • Как работать в ООП стиле в matplotlib - производить операции с графиками как с объектами?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну что ты имеешь ввиду под ООП стилем, не очень ясно из твоего примера. Во первых matplotlib имеет два интерфейса один matlab интерфейс а второй как раз таки ООП интерфейс.

    например
    import matplotlib.pyplot as plt
    import numpy as np
    X = np.linspace(-3,3,100)
    fig, ax = plt.subplots(2,1, figsize=(12,6))
    ax[0].plot(X, np.sin(X))
    ax[0].set_title('sin(x)')
    ax[1].plot(X,np.cos(X))
    ax[1].set_title('cos(x)')
    plt.show();

    Вот это пример двух графиков (поменять количество очень легко), на одной фигуре расположение и все остальное легко конфигурируется, вместо например xlabel и им подобным set_xlabel. Я продемонстрировал с title как устанавливать свой title для каждого графика отдельно. В документации этот подход упомянут, как explicit API еще его называют Объектно-ориентированный интерфейс. ax - это коллекция твоих графиков. a[0] - первый график и.т.д

    Так, как ты пытаешься ничего не получится. У тебя объект у которого ты пытаешься вызвать метод ylabel это список, а не то что ты думаешь.

    В matplotlib есть фигура и на ней ты можешь разместить столько графиков столько захочешь, в такой системе координат в которой захочешь и разместить их на этой фигуре так как захочешь.

    ДОПОЛНЕНИЕ К ОТВЕТУ.

    На случай, если OOP имелся ввиду python'вский а не OOP как интерфейс matplotlib.
    Смотри, если же тебе хочется создать свою структуру данных и на этой структуре запускать метод plot со всеми matplotlib возможностями, например pandas так делает. У pandas series или фрейма есть метод plot, если его запустить он тебе нарисует график напрммер.

    import pandas as pd
    
    df = pd.DataFrame({
        'Stock A':100 * np.cumprod(1 +  np.random.normal(0.01,0.05,30)),
        'Stock B':100 * np.cumprod(1 + np.random.normal(-0.01,0.05,30))
    }, index = pd.date_range('2023-01-01',freq='1D',periods=30))
    df.plot();

    Я сделал фрейм две фейковых акции обе стартуют со 100 рублей стоимости и затем одна имеет ожидание случайное нормальное распределение с одним процентом роста другая с одним процентом снижения в день. И вызвал метод plot. И он построит график, так вот если ты хочешь ПРИКРУТИТЬ метод plot для своего класса то можно сделать вот так.

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    class plotCreator:
    
        def __init__(self, x, y,**kwargs):
            self.x = x
            self.y = y
            self.axes_kwargs = kwargs
        def plot(self, ax=None, **kwargs):
            if ax is None:
                ax = plt.gca()
            ax.plot(self.x, self.y, **kwargs)
            ax.set(**self.axes_kwargs)
            return ax
            
    
    X = np.linspace(-2*np.pi,2*np.pi,100)
    y1 = np.cos(X)
    y2 = np.sin(X)
    
    img1 = plotCreator(X, y1,xlabel='X',title='cos(X)',ylabel='cos(X)')
    img1.plot().figure.savefig('cos.png');
    
    plt.cla()
    
    img2 = plotCreator(X, y2,xlabel='X',title='sin(X)',ylabel='sin(X)')
    img2.plot().figure.savefig('sin.png');


    Вообщем, работает, надо конечно до ума доводить (код мягко говоря так себе) ну это уже сам, конечно. Тут имей ввиду, после каждого создания экземпляра класса и вызова метода plot нужно чистить фигуру plt.cla() вот этим методом а то он естественно рисовать на одном и том axes будет. Остальное kwargs экземпляра класса это методы axes, (xlabel, ylabel) и им подобные, kwargs метода plot, это как рисовать, стили линии, толщина, цвет и т.д. (color, lw, alpha, и.т.д)

    В общем в виде черновика можно вот так. А так придется вчитываться в доки, как все это по уму обставить и привести код к приличному виду в общем время придется потратить.
    Ответ написан
    Комментировать
  • Как исправить ошибку TypeError: 'type' object is not subscriptable?

    Maksim_64
    @Maksim_64
    Data Analyst
    Версии python разные, по всей видимости на сервере более ранняя. Либо попробуй
    from typing import List
    def GetAllWorker(db_name: str) -> List[WorkerInformation]:

    либо обнови python до более поздней, например на 3.10 может и 3.9 (не уверен) твой код должен работать. Если тебе конечно вообще нужны аннотации типов, на выполнения скрипта они влияния не имеют (в том смысле если не соответствие то ошибок не выдаст), а существуют лишь для специальных type checker'ов типа mypy.
    Ответ написан
    1 комментарий
  • Как агрегировать данные по элементам вложенного массива?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну пустяковая для pandas проблема.

    import pandas as pd
    import numpy as np
    
    data = [{ "customer_id": "5f9d7b0a100400c6f00ad1cb",
      "customer_pet": "cat",
      "customer_cat_color": "gold",
      "customer_cat_name": "",
      "timestamp": "2023-05-15 12:22:22.111241 UTC",
      "list_cart": [
        "cart_1",
        "cart_2",
        "cart_3" ]},
      {"customer_id": "5f9d7b0a100400c6f00ad1cb",
      "customer_pet": "cat",
      "customer_cat_color": "gold",
      "customer_cat_name": "",
      "timestamp": "2023-05-15 13:33:33.111241 UTC",
      "list_cart": [
        "cart_3",
        "cart_7",
        "cart_1" ]}
    ]
    
    df = pd.DataFrame(data)
    print(df['list_cart'].explode().value_counts())


    Все результат как ты хотел, ну и вдобавок глянь на фрейм колонку list_cart можно, распарсить, как надо под любые нужды. Для других операций группировок и т.д.
    Ответ написан
    1 комментарий
  • Как заменить только отличные значения с помощью pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    В общем ждать ответа, на мой комментарий времени нет, если замена всегда одинаковая то вот так.
    import pandas as pd
    import numpy as np
    pd.DataFrame(np.where(dataframe_1 != dataframe_2, 'Ваше значение',dataframe_1), columns = dataframe_1.columns)


    если значения которые отличаются нужно выбрать из второго датафрейма то вот так.
    import pandas as pd
    import numpy as np
    pd.DataFrame(np.where(dataframe_1 != dataframe_2, dataframe_2,dataframe_1), columns = dataframe_1.columns)
    Ответ написан
  • Зачем комментируют перед написанием кода?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Пояснения к коду (когда откроешь спустя время даже свой собственный код он может казаться, как будто чужой).

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

    3. Как следствие второго, привычка писать комментарии со временем сделает тебя, как программиста лучше и разовьет важные для успешного программирования качества.
    Ответ написан
    Комментировать
  • Почему переменная изменяет значение?

    Maksim_64
    @Maksim_64
    Data Analyst
    Когда вы выбираете подсет фрейма и ИЗМЕНЯЕТЕ этот подсет то может меняться и сам фрейм из которого этот подсет был выбран. Это известная особенность pandas, причина которых лежит в numpy. Как поправить, для этого используют копию и уже от этой копии и берется подсет. В вашем коде comtraders2 = df_segment вот это строчку нужно заменить на comtraders2 = df_segment.copy() И тогда будет работать, как вы ожидаете.

    помните подобные операции, могут приводить к изменению оригинального фрейма.
    df = pd.DataFrame({
        'A':[1,2,3],
        'B':[4,5,6]
    })
    
    subset = df['A'] 
    subset[0] = 100
    print(df)

    И вы увидите ваш оригинальный df изменился. Существует несколько кейсов, при определенных он выдаст предупреждение, при таком как я привел выше и вовсе все произойдет молча.
    поправить также, использовать копию.
    df = pd.DataFrame({
        'A':[1,2,3],
        'B':[4,5,6]
    })
    
    subset = df['A'].copy() 
    subset[0] = 100
    print(df)

    Ну и немножко, не в тематику вашего вопроса, я не знаю какую задачу вы пытаетесь решить, но pandas код так не пишут (колонки со списками внутри это очень плохо), задача должна решаться по другому.
    Ответ написан
  • Как правильно сгенерировать дату в Pandas?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну смотри, первое ты говоришь количество строк 90, при этом формируешь временную последовательность, на 90 дней при этом у тебя есть желание иметь данные с повторяющемеся днями по количеству артистов их их песен, в примере ты приводишь 3 артиста по 3 песни на каждые то есть 9 ЗАПИСЕЙ на каждый день или 90 * 9 = 810 СТРОК.

    Второе ты показываешь желаемый результат для одно дня только надо так делать для временной последовательности. И в нем собственно ты и подтверждаешь, мою мысль выше. Что строчек, будет больше чем 90.

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

    import pandas as pd
    import numpy as np
    
    songs = {
        'ANNA ASTI': ['Девочка танцуй','Грустный дэнс','Гармония'],
        'Три дня дождя': ['Демоны','Где ты','Перезаряжай'],
        'MACAN': ['Кино','Пополам','Бенз'],
    }
    
    NUMBER_OF_DAYS = 3
    LENGTH_OF_FINAL_FRAME = sum(len(value) for value in (songs.values())) * NUMBER_OF_DAYS
    
    dates = pd.date_range('2023-01-01', periods=NUMBER_OF_DAYS, freq='1D')
    
    artists = []
    for key, value in songs.items():
        artists += [key] * len(value)
    
    dates_and_artists = []
    for date in dates:
        for artist in artists:
            dates_and_artists.append((date,artist))
    
    songs_arr = np.array(list(songs.values()) * NUMBER_OF_DAYS).reshape(-1,1)
    
    
    
    
    data = np.concatenate([np.array(dates_and_artists), 
                           songs_arr, 
                           np.random.randint(3000,1_000_000,LENGTH_OF_FINAL_FRAME).reshape(-1,1)], axis=1)
    
    df = pd.DataFrame(data=data, columns=['Date','Artist','Track','Start'])
    df


    Ну в целом там все понятно, сначала собираем артистов, по количеству песен, затем добавляем дату к каждой такой записи, затем все это дело в массив, плюс выбираем случайно, количество прослушиваний (обрати внимание это для каждой песни выбирается, а не для каждого дня), если надо подправь, я ориентиероваля на твой фрейм который представил как результат.

    Код для любого количества артистов и песен у них ну и количество дней тоже сколько надо задашь. NUMBER_OF_DAYS. Поменяй да и все.

    ДОПОЛНЕНИЕ К ОТВЕТУ
    Как и обещал, подработал я свое решение, так как оно должно быть, меньше кода, быстрее и больше функциональности.

    from itertools import chain
    import pandas as pd
    import numpy as np
    
    
    songs = {
        'ANNA ASTI': ['Девочка танцуй','Грустный дэнс','Гармония'],
        'Три дня дождя': ['Демоны','Где ты','Перезаряжай'],
        'MACAN': ['Кино','Пополам','Бенз'],
    }
    
    NUMBER_OF_DAYS = 3
    NUMBER_OF_SONGS_PER_DAY = sum(len(value) for value in (songs.values()))
    STARTING_DATE = '2023-01-01'
    
    dates = pd.date_range(STARTING_DATE, periods=NUMBER_OF_DAYS, freq='1D')
    artists = list(chain(*[[key] * len(value) for key, value in songs.items()]))
    songs_per_day = list(chain(*songs.values()))
    
    index = pd.MultiIndex.from_product([dates,artists],names=['Date','Artist'])
    
    df = pd.DataFrame({
        'Songs':songs_per_day * NUMBER_OF_DAYS,
        'Start':np.random.randint(3000,1000000,NUMBER_OF_DAYS * NUMBER_OF_SONGS_PER_DAY),
        
    }, index=index).reset_index()
    
    df


    Вот это хороший читабельный pandas код, теперь я спокоен, а то вопрос то решил, но просто в лоб, а не так как следует.

    кстати обрати внимание, если запустишь код без reset_index(), у тебя будет многоуровневый индекс, посмотри как обращаться к любому из уровней индекса в документации. Ну и посмотри все созданные мною списки, что бы посмотреть идею, как я декомпозировал задачу. Потому что задачу ты задал хорошую, по сути дела словарь это неполная запись за день, из которой нужно формировать данные.
    Ответ написан
    2 комментария
  • Как преобразовать массив чисел который возвращается функцией model.predict в нормальный вид?

    Maksim_64
    @Maksim_64
    Data Analyst
    Ну надо конечно догадываться что вы имеете ввиду под нормальным видом, данные в массиве представлены в научном виде. Например 1e-02 = 1*10^(-2) = 1/100. Соответственно, например 1.3135763e-05 = 1.3135763 * 10^(-5).

    Можно принудить конечно numpy отображать маленькие числа в "обычном виде" например
    np.set_printoptions(suppress=True)
    особо маленькие числа он будет показывать, как ноль, что бы преодолеть и это у вас -10 самая большая степень, можно добавить форматтер.
    np.set_printoptions(suppress=True, formatter={'float_kind':'{:0.10f}'.format})

    в обоих случаях при печати numpy массива он будет в том что вы называете "нормальным видом".
    Ответ написан
    Комментировать