В моей базе данных 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
содержит годовые данные:
Вы можете использовать:
# 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]
3-й вопрос: Кроме того, «BA» отображает 9 кварталов, в то время как «ADUS» отображает 8 кварталов, потому что ему не хватает самого последнего квартала, синхронизированного с «BA». Та же идея применима к годовым данным. Можно ли показать только 8 кварталов и 5 лет, независимо от того, отсутствуют они или нет? Вместо добавления другого?
вывод на самом деле неправильный. Для годовых данных CAH, NVEC показывают NAN для годовых данных. Но в моих файлах есть данные.
@сага. Я обновил свой ответ и исправил некоторые ошибки. Я также удалил MultiIndex из результата вывода.
Я использовал 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(). Итак, как мы должны это сделать?
Вы не должны менять свой вопрос по ходу дела, когда ответ решает исходный вопрос. Теперь вы добавляете 2 других файла. И что после этого?
Я использовал ваши концепции 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() для управления датами, чтобы позже мы могли назначить, к какому кварталу он принадлежит?
Необходимо сопоставить даты, чтобы выбрать правильные.
Ответ полезен. Если я использую точный код, я получаю следующее: dropbox.com/s/uv1iik6m0u23gxp/output.csv?dl=0. Первый вопрос: можно ли переместить названия столбцов [отрасль, сектор,..., 2022Q4... 2022] вниз на одну строку, чтобы они находились в той же строке, что и название столбца "бегущая строка"? потому что теперь есть пустая строка после имени столбца «бегущая строка». Второй вопрос: если я хочу добавить для отображения больше столбцов, таких как доход или данные из другой базы данных, должен ли я просто использовать ту же логику кода? Я не показывал вопрос только для того, чтобы он выглядел короче и читабельнее.