Как я могу создать мультииндексный фрейм данных со следующими наборами данных? - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно создать многоиндексный фрейм данных, содержащий данные, содержащиеся в двух разных фреймах данных. Для каждого индекса второго фрейма данных (Date), для каждой строки первого фрейма данных, если значение в столбце Date первого фрейма данных равно индексу второго фрейма данных, то создайте многоиндексный фрейм данных с каждой датой - количество твитов, публикуемых каждый день, и особенности каждой строки.

Это первый фрейм данных с данными из Twitter:

        Date            Full text   Retweets    Likes
333     2018-04-13  RT @Tesla...    2838             0
332     2018-04-13  @timkhiggins... 7722             40733
331     2018-04-13  @TheEconomist.. 1911             18634

Это второй фрейм данных с данными с фондового рынка Tesla:

                Open        High     Low         Close  Volume       Gap
Date                        
2018-04-13  283.000000  296.859985   279.519989  294.089996 8569400  11.089996
2018-04-14  303.320000  304.940002   291.619995  291.970001 7286800  -11.349999
2018-04-25  287.760010  288.000000   273.420013  275.010010 8945800  -12.750000

Вот что я пытался сделать:

for i in TeslaData.index:
    for row in sortedTweetsData.iterrows():
        if row[1]==i:
            NumTweetsByDay+=1
            for num in NumTweetsByDay:
                idx=pd.MultiIndex.from_product([[i],[NumTweetsBy]])
                colum=col
                df= pd.DataFrame(row,idx,column)

Вывод, который я ищу, следующий:

Date        Number of Tweets    Full text       Retweets    Likes

2018-04-13        1              RT @Tesla...    2838        0
                  2              @timkhiggins... 7722        40733
                  3              @TheEconomist.. 1911        18634

1 Ответ

0 голосов
/ 19 апреля 2019

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

Вы можете сделать это с помощью isin ():

# convert datatypes first:
sortedTweetsData['Date'] = pd.to_datetime(sortedTweetsData['Date'])
TeslaData.index = pd.to_datetime(TeslaData.index)

# do filtering
df = sortedTweetsData[sortedTweetsData['Date'].isin(TeslaData.index.values)]

Далее вы можете определить, сколько твитов в каждой группе:

groupsizes = df.groupby(by='Date').size()

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

tups = [(ix, gs + 1) for ix in groupsizes.index.values for gs in range(groupsizes[ix])]

наконец:

df.index = pd.MultiIndex.from_tuples(tups, names=['Date', 'Number of Tweets'])
...