Ну смотри, первое ты говоришь количество строк 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(), у тебя будет многоуровневый индекс, посмотри как обращаться к любому из уровней индекса в документации. Ну и посмотри все созданные мною списки, что бы посмотреть идею, как я декомпозировал задачу. Потому что задачу ты задал хорошую, по сути дела словарь это неполная запись за день, из которой нужно формировать данные.