Задать вопрос
  • Как в 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 массива он будет в том что вы называете "нормальным видом".
    Ответ написан
    Комментировать
  • Какой MacBook выбрать для Data Science/Machine Learning/AI?

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

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

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

    Maksim_64
    @Maksim_64
    Data Analyst
    у тебя у r status_code 403. Добавь хоть какой нибудь header.
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:91.0) Gecko/20100101 Firefox/91.0'
    }
    r = requests.get(url,headers=headers)

    Вот так сервер пришлет html.
    Имей также ввиду что парсить интерактивно (в рамках одного соединения) с bs не получится, придется переподключаться часто ну и схватишь блок или ерунду начнет присылать в ответ. Если ты перейдешь на страницу, зайдешь в инспектор, нажмешь на значек настройка в панели инспектора, затем поставишь галочку Disable JavaScript и обновишь страницу, вся инфа на странице перестанет обновляться. По скольку обновление происходит средствами JavaScript a bs не работает с JavaScript.
    Ответ написан
    3 комментария
  • Как нужно собирать датасет для модели бинарной классификации?

    Maksim_64
    @Maksim_64
    Data Analyst
    Бинарная классификация, подразумевает два варианта пост на IT тематику (True) или (False). Соответственно, только первый вариант, если учебный дата сет не будет содержать разных постов, то обучаться будет не на чем.

    Насчет пропорций, здесь интереснее. И так в реальности мы имеем куда более вероятное событие пост не IT чем IT. Но при создании модели нам нужно что бы наши пропорции были примерно равны или около того. Иначе мы будем иметь то что называется bias. У нас например в тренировочном сете значительно больше постов которые не IT и соответственно, мы уже имеем ПРЕДРАСПОЛОЖЕННОСТЬ. Что плохо. По этому изначально, для классификатора, не должно быть такого понятия, как НЕ IT пост более вероятен.

    Это общее правило с которого могут быть ответвления, например, когда есть датасет в котором одного класса сильно больше делают еще одну выборку с весами (resampling), то есть выбирают не с равными вероятностями. И потом получают близкое к равное распределение.

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

    Maksim_64
    @Maksim_64
    Data Analyst
    sorted(mylist, key=lambda x: int(x.split('.')[0]))
    Ответ написан
    Комментировать
  • Изменили выходные параметры в fitted.forecast в Python - как его теперь использовать в моем случае?

    Maksim_64
    @Maksim_64
    Data Analyst
    В общем ради интереса, получил модель как на графике в статье. Из тех данных что у вас есть.
    1. Модель имеет тренировочный сет 130 плюс предполагает предсказание на 39 дней то есть конечное количество это 169. В коде же об этом не слова и он берет его до конца временной последовательности
    2. Задана неправильная вариация параметра order. Что бы его задавать правильно требуется понимание.
    3. По мелочи поправили остальное.
    4. Самое главное, практическая ценность данной модели близка к нулю. Он предсказывает средние значения и как мы видим он "зацепил" ТРЕНД, кстати его параметром конечно же автор статьи тоже не указал, но я поправил.

    В общем хотели рабочий код, который из данного датасета строит и визуализирует авторегрессивную модель то вот.

    df = pd.read_csv("https://hands-on.cloud/wp-content/uploads/2022/02/catfish_sales_1986_2001.csv")
    train = df.Total[:130]
    test = df.Total[130:170]
    
    model = ARIMA(train, order=(1, 0, 0),trend='ct').fit()
       
    
    fc = model.get_forecast(39, alpha=0.05) 
    
    fc_series = pd.Series(fc.predicted_mean, index=test.index)
    lower_series = pd.Series(fc.conf_int().iloc[:, 0], index=test.index)
    upper_series = pd.Series(fc.conf_int().iloc[:, 1], index=test.index)
    
    plt.figure(figsize=(12,5), dpi=100)
    plt.plot(train, label='training')
    plt.plot(test, label='actual')
    plt.plot(fc_series, label='forecast')
    plt.fill_between(lower_series.index, lower_series, upper_series, color='k', alpha=.15)
    plt.title('Forecast vs Actuals')
    plt.legend(loc='upper left', fontsize=8)
    plt.show()
    Ответ написан
    Комментировать
  • Почему много кликов по рекламе, но мало установок?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. Надо посмотреть на распределение кликов по дням в теории просмотры, лайки, клики и тому подобное обычно следуют экспонентным распределениям (экспонентное понижение в данном случае). То есть каждый день (единицу времени , так точнее) вы получаете меньше (новых кликов, лайков и т.п ) чем в предыдущий. Нет ли аномалий в этом направлении.

    2. Надо глянуть корреляцию по дням между кликами и установками. То есть ли некая зависимость между количеством кликов в день и количеством установок.

    3. Нормальное ли это число, это бизнес вопрос смотря, какая монетизация, затраты и т.д. Вам виднее никто лучше вас вашего бизнеса не знает.

    4. Собирайте, как можно больше статистики и храните ее 14 дней и одна рекламная компания мобильного приложения совершенно не достаточно, для серьезных статистических выводов, и как следствие решений о том что мало и что много, что хорошо, а что нет, и как все это улучшить.
    Ответ написан
    Комментировать
  • Пожалуйста порекомендуйте с выбором проекта Data science?

    Maksim_64
    @Maksim_64
    Data Analyst
    Почитав, ваш ответ на мой комментарий, вот какие советы вам дать. То что вы ищете по уровню называется EDA (Explanatory Data Analysis). Это начальный поверхностный анализ, так сказать, глянуть что из себя представляет датасет, и в какую сторону двигаться дальше. Вы используете в нем pandas и matplotlib/seaborn. Если вы не проходили seaborn то ничего страшного, он сделан на matplolib и в целом используется совместно (упрощено говоря matplotlib c улучшенными графиками)

    Kaggle это хорошо, там все и возьмете. Например вот https://www.kaggle.com/code/imoore/intro-to-explor... на kaggle то не только датасеты есть но и notebook'и c кодом, что сообственно я и привел вам ссылке.

    Как искать на главной странице сайта есть поиск пишете в нем EDA затем в окошке слева отмечаете галачкой ipynb. И получаете список нотебуков, которые содержат EDA. Большинство нотебуков будут содержать манипуляции с pandas и визуализации matplolib/seaborn и объяснения что все значит. Читайте разбирайтесь, что не понятно и совсем не можете справится спрашивайте.

    Это так сказать гайд для вашего случая (когда плохо понимаете с чего вообще начать). Приготовьтесь серьезно потрудится, просто если на курсах не поняли толком ничего не будет.
    Ответ написан
    2 комментария
  • С помощью какой библиотеки(python) можно конвертировать xml в pdf?

    Maksim_64
    @Maksim_64
    Data Analyst
    Я бы не использовал одну библиотеку здесь. Процесс, вряд ли будет протекать без проблемно.
    Я бы конвертировал xml в pandas фрейм, методом pd.read_xml() глянул бы на него, может чего подкорректировал, из фрейма уже конвертировал (по этапно) в pdf. Вот в этой статье https://www.alixaprodev.com/how-to-convert-pandas-... есть рабочий код три способа (один с использованием matplotlib), второй способ он использует конвертацию фрейма в html таблицу и оттуда уже в pdf, и третий там библиотеку он использует.

    Так вот я бы использовал способом pandas + matplotlib он даст мне больше всего контроля и свободы, как и в каком виде все это запишется в pdf, то есть я смогу кастомизировать + справится с потенциальными ошибками при записи. Рабочий пример (там фрейм создаетс, а не читается из xml это сделаешь сам pd.read_xml()) есть в статье по ссылке от которого уже можно оттолкнуться.
    Ответ написан
    1 комментарий