[Python] Timeseries: Pandas TimeGrouper

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Hieronymus
  • Registratie: Juli 2005
  • Niet online
Ik probeer een CSV te bouwen met twee timeseries. Één timeseries met occurences per uur, en één aan de hand van sentiment analysis. De input is een set CSV's met een tweet en een timestamp, en als output probeer ik dus het aantal tweets per uur te krijgen, en een gemiddeld sentiment per uur. Het eerste is natuurlijk niet zo spannend en ook het tweede hoort niet zo spannend te zijn: bij positive "assign" ik een 1 en en bij negative een 0. In principe is met het gemiddelde van de values dit te berekenen.

Ik kom er echter totaal niet uit. :') Ik weet dat ik in principe een DataFrame moet maken met die pos/neg (0/1) ratings erbij, daarna met Timegrouper uit Pandas moet in principe het gemiddelde wel uit te rekenen zijn, als ik naar de documentatie kijk.

Ter verduidelijking: dit is een voorbeeld van de input waarmee ik werk:

Afbeeldingslocatie: https://i.imgur.com/qlJVHTy.png

De achtste kolom bevat natuurlijk de timestamp (belangrijk voor de timeseries) en de vijfde kolom de inhoud (belangrijk voor sentiment).

Dit is de output die ik probeer te krijgen:

Afbeeldingslocatie: https://i.imgur.com/HT4fBD8.png

En dit is de code waarmee ik het probeer uit te voeren. De problemen centreren zich dus rond a] het creëren van een dataframe met die sentiment rating (0/1) en b] dat dataframe zo zien te bewerken dat dat gemiddelde sentiment in een timeseries terecht komt.

code: test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import os
import pandas as pd
import csv
import numpy as np

import nltk.classify.util
from nltk.classify import NaiveBayesClassifier
from nltk.corpus import movie_reviews

def word_feats(words):
    return dict([(word, True) for word in words])

negids = movie_reviews.fileids('neg')
posids = movie_reviews.fileids('pos')

negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids]
posfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'pos') for f in posids]

negcutoff = len(negfeats)*3/4
poscutoff = len(posfeats)*3/4

trainfeats = negfeats[:negcutoff] + posfeats[:poscutoff]
testfeats = negfeats[negcutoff:] + posfeats[poscutoff:]
print 'train on %d instances, test on %d instances' % (len(trainfeats), len(testfeats))

classifier = NaiveBayesClassifier.train(trainfeats)
# print 'accuracy:', nltk.classify.util.accuracy(classifier, testfeats)
# classifier.show_most_informative_features()






mydir = './CSV/'

for path, dirs, files in os.walk(mydir):
    for filename in files:

        if not filename.endswith('series.csv'):
            fullpath = os.path.join(path, filename)


            ## Read CSV
            dataframe = pd.read_csv(fullpath, parse_dates = {'Timestamp' : [7]}, index_col = 'Timestamp', header = None)
            dataset = dataframe[4].tolist()



            for sentence in dataset:
                pos = 0
                neg = 0

                sentiment = classifier.classify(word_feats(sentence))

                if sentiment == 'neg':
                    neg+=1
                elif sentiment == 'pos':
                    pos+=1

                print pos, neg

            hourlycount = dataframe.resample('H').count()

            dataframe = hourlycount[0].to_frame()
            dataframe['game'] = fullpath
            dataframe['nominal timeslot'] = dataframe.index.hour


            # print dataframe

            # dataframe.to_csv('alltimeseries.csv', sep=',', encoding='utf-8', mode='a', header=False)

So now, less than five years later, you can go up on a steep hill in Las Vegas and look West, and with the right kind of eyes you can almost see the high-water mark — that place where the wave finally broke and rolled back.