Как присоединиться к другому фрейму данных с определенными критериями?

В моей базе данных MySQL stocks у меня есть 5 разных таблиц. Я хочу объединить все эти таблицы, чтобы отобразить ТОЧНЫЙ формат, который я хочу видеть. Должен ли я сначала присоединиться к mysql или сначала извлечь каждую таблицу как фрейм данных, а затем присоединиться к пандам? Как это сделать? Код тоже не знаю.

Вот как я хочу отображать: https://www.dropbox.com/s/uv1iik6m0u23gxp/ExpectedoutputFULL.csv?dl=0

Таким образом, каждый тикер представляет собой строку, содержащую все определенные столбцы из моих таблиц.

Дополнительная информация:

  • Мне нужно отображать только последние 8 кварталов за квартал и 5 лет за год.

  • Точная дата для разных тикеров для квартальных данных может отличаться. Если сделать это вручную, последние восемь кварталов можно легко скопировать и вставить в соответствующие столбцы, но я понятия не имею, как это сделать с помощью компьютера, чтобы определить, к какому кварталу он принадлежит, и показать его в том же столбце, что и в моем примере. выход. (Я использую термины с q1 по q8 просто как имена столбцов для отображения. Таким образом, если мои самые последние данные относятся к 30 мая, q8 не обязательно является последним кварталом второго года.

  • Если последний квартал или год для одного тикера недоступен (как в примере «ADUS»), но доступен для других тикеров, таких как «BA» в примере, просто оставьте это поле пустым.

1-я таблица company_info: https://www.dropbox.com/s/g95tkczviu84pnz/company_info.csv?dl=0 содержит информацию о компании:

2-я таблица income_statement_q: https://www.dropbox.com/s/znf3ljlz4y24x7u/income_statement_q.csv?dl=0 содержит квартальные данные:

3-я таблица income_statement_y: https://www.dropbox.com/s/zpq79p8lbayqrzn/income_statement_y.csv?dl=0 содержит данные за год:

4 стол earnings_q: https://www.dropbox.com/s/bufh7c2jq7veie9/earnings_q.csv?dl=0 содержит квартальные данные:

5 стол earnings_y: https://www.dropbox.com/s/li0r5n7mwpq28as/earnings_y.csv?dl=0 содержит годовые данные:

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать:

# Convert as datetime64 if necessary
df2['date'] = pd.to_datetime(df2['date'])  # quarterly
df3['date'] = pd.to_datetime(df3['date'])  # yearly

# Realign date according period: 2022-06-30 -> 2022-12-31 for yearly
df2['date'] += pd.offsets.QuarterEnd(0)
df3['date'] += pd.offsets.YearEnd(0)

# Get end dates
qmax = df2['date'].max()
ymax = df3['date'].max()

# Create date range (8 periods for Q, 5 periods for Y)
qdti = pd.date_range( qmax - pd.offsets.QuarterEnd(7), qmax, freq='Q')
ydti = pd.date_range( ymax - pd.offsets.YearEnd(4), ymax, freq='Y')

# Filter and reshape dataframes
qdf = (df2[df2['date'].isin(qdti)]
                      .assign(date=lambda x: x['date'].dt.to_period('Q').astype(str))
                      .pivot(index='ticker', columns='date', values='netIncome'))

ydf = (df3[df3['date'].isin(ydti)]
                      .assign(date=lambda x: x['date'].dt.to_period('Y').astype(str))
                      .pivot(index='ticker', columns='date', values='netIncome'))

# Create the expected dataframe
out = pd.concat([df1.set_index('ticker'), qdf, ydf], axis=1).reset_index()

Выход:

>>> out
  ticker                                  industry                  sector     pe    roe     shares  ...       2022Q4          2018          2019          2020          2021          2022
0   ADUS          Health Care Providers & Services             Health Care  38.06   7.56   16110400  ...          NaN  1.737700e+07  2.581100e+07  3.313300e+07  4.512600e+07           NaN
1     BA                       Aerospace & Defense             Industrials    NaN   0.00  598240000  ... -663000000.0  1.046000e+10 -6.360000e+08 -1.194100e+10 -4.290000e+09 -5.053000e+09
2    CAH          Health Care Providers & Services             Health Care    NaN   0.00  257639000  ... -130000000.0  2.590000e+08  1.365000e+09 -3.691000e+09  6.120000e+08 -9.320000e+08
3   CVRX          Health Care Equipment & Supplies             Health Care   0.26 -32.50   20633700  ...  -10536000.0           NaN           NaN           NaN -4.307800e+07 -4.142800e+07
4   IMCR                             Biotechnology             Health Care    NaN -22.30   47905000  ...          NaN -7.163000e+07 -1.039310e+08 -7.409300e+07 -1.315230e+08           NaN
5   NVEC  Semiconductors & Semiconductor Equipment  Information Technology  20.09  28.10    4830800  ...    4231324.0  1.391267e+07  1.450794e+07  1.452664e+07  1.169438e+07  1.450750e+07
6   PEPG                             Biotechnology             Health Care    NaN -36.80   23631900  ...          NaN           NaN           NaN -1.889000e+06 -2.728100e+07           NaN
7   VRDN                             Biotechnology             Health Care    NaN -36.80   40248200  ...          NaN -2.210300e+07 -2.877300e+07 -1.279150e+08 -5.501300e+07           NaN

[8 rows x 20 columns]

Ответ полезен. Если я использую точный код, я получаю следующее: dropbox.com/s/uv1iik6m0u23gxp/output.csv?dl=0. Первый вопрос: можно ли переместить названия столбцов [отрасль, сектор,..., 2022Q4... 2022] вниз на одну строку, чтобы они находились в той же строке, что и название столбца "бегущая строка"? потому что теперь есть пустая строка после имени столбца «бегущая строка». Второй вопрос: если я хочу добавить для отображения больше столбцов, таких как доход или данные из другой базы данных, должен ли я просто использовать ту же логику кода? Я не показывал вопрос только для того, чтобы он выглядел короче и читабельнее.

saga 19.02.2023 02:14

3-й вопрос: Кроме того, «BA» отображает 9 кварталов, в то время как «ADUS» отображает 8 кварталов, потому что ему не хватает самого последнего квартала, синхронизированного с «BA». Та же идея применима к годовым данным. Можно ли показать только 8 кварталов и 5 лет, независимо от того, отсутствуют они или нет? Вместо добавления другого?

saga 19.02.2023 02:14

вывод на самом деле неправильный. Для годовых данных CAH, NVEC показывают NAN для годовых данных. Но в моих файлах есть данные.

saga 19.02.2023 05:38

@сага. Я обновил свой ответ и исправил некоторые ошибки. Я также удалил MultiIndex из результата вывода.

Corralien 19.02.2023 09:09

Я использовал values=['revenue,'operatingIncome,'netIncome'] для репликации вашего кода и уже добавил доход, OperatingIncome, в дополнение к чистому доходу. Теперь я должен добавить eps. Я уже обновил ожидаемый результат (выделенные разделы) и добавил 4-ю и 5-ю таблицы доходов. Будет использоваться 'fiscalDateEnding'. Я не знаю, как действовать, потому что мои исходные данные (5-я таблица заработков_y), например, NVEC имеют как 2022-03-31, так и 2022-12-31. CAH имеет как 2022-06-30, так и 2022-12-31. Даты были изменены и имели дубликаты, когда я использовал pd.offsets(). Итак, как мы должны это сделать?

saga 19.02.2023 17:34

Вы не должны менять свой вопрос по ходу дела, когда ответ решает исходный вопрос. Теперь вы добавляете 2 других файла. И что после этого?

Corralien 19.02.2023 17:41

Я использовал ваши концепции qdf и ydf, чтобы развернуть новый df для доходов за квартал и год. Когда я запускаю код и достигаю новой строки df для заработка в год, он говорит о повторяющейся ошибке, потому что мой исходный файл, NVEC, содержит как 2022-03-31, так и 2022-12-31. CAH имеет даты 30 июня 2022 г. и 31 декабря 2022 г. Когда я манипулирую датами с помощью pd.offsets(), они становятся двумя строками с одинаковыми датами 2022-12-31 как для NVEC, так и для CAH. В этом случае, я знаю, что это зависит от меня, как справиться с этим. Но мой вопрос в том, нужно ли сначала использовать pd.offsets() для управления датами, чтобы позже мы могли назначить, к какому кварталу он принадлежит?

saga 19.02.2023 20:56

Необходимо сопоставить даты, чтобы выбрать правильные.

Corralien 19.02.2023 21:24

Другие вопросы по теме