-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions.py
117 lines (91 loc) · 4.39 KB
/
functions.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import numpy as np
import pandas as pd
from datetime import datetime as dt
from scipy.interpolate import interp1d
def week_year_to_timestamp(row):
date = "{}-{}-1".format(row["year"], row["week"])
return dt.strptime(date, "%Y-%W-%w").timestamp()
def create_interpolation_from(df, ucolumn='timestamp', columns=[]):
"""Gibt einen DataFrame mit interpolierten Werten zurück.
Wird kein Parameter `unique` übergeben, wird `timestamp` als Wert verwendet.
Parameters
----------
df : DataFrame, required
The DateFrame to be used
ucolumn : str, optional
Column of DataFrame for the x values
columns : list
Columns of DataFrame that should be adjusted
"""
df_copy = df
df_interpolation = pd.DataFrame()
df_interpolation.index = np.arange(
df_copy[ucolumn].min(), df_copy[ucolumn].max(), 100)
for column in columns:
cubic_interpolation = interp1d(
df_copy[ucolumn], df[column], kind="cubic")
df_interpolation[column] = cubic_interpolation(df_interpolation.index)
df_interpolation.index.name = ucolumn
df_interpolation = df_interpolation.reset_index(ucolumn)
return df_interpolation
def plot_trendlines(df, on_axis=None, ucolumn='timestamp', colors=[], columns=[]):
"""Gibt einen DataFrame mit interpolierten Werten zurück.
Wird kein Parameter `unique` übergeben, wird `timestamp` als Wert verwendet.
Parameters
----------
df : DataFrame, required
The DateFrame to be used
ucolumn : str, optional
Column of DataFrame for the x values
columns : list
Columns of DataFrame that should be adjusted
"""
for index in range(len(columns)):
z = np.polyfit(df[ucolumn], df[columns[index]], 1)
p = np.poly1d(z)
on_axis.plot(df[ucolumn], p(df[ucolumn]), color=colors[index])
def merge_data_week_year(df, from_column='topic', to_columns=[]) -> pd.DataFrame:
df_all = None
for column in to_columns:
# Betrachte nur die Artikel des aktuellen Themengebiets
df_column = df.loc[df[from_column] == column]
# Gruppiere die Artikel nach Woche (eindeutig) und aggregiere die Anzahl der Artikel pro Woche
df_column = df_column.groupby(
["week", "year"]).size().reset_index(name=column)
# Füge ein neues Feature hinzu: Datum
df_column['date'] = "KW " + \
df_column['week'].astype(str) + " " + df_column['year'].astype(str)
df_column['timestamp'] = df_column.apply(
week_year_to_timestamp, axis=1)
# Lösche zwei Features: Woche, Jahr
df_column.drop(['week', 'year'], axis=1, inplace=True)
# Falls der df der Gesamtdaten bereits Daten von vorherigen Themengebieten enthält, merge die Daten des aktuellen Themengebiets
if (isinstance(df_all, pd.DataFrame)):
df_all = pd.merge(df_all, df_column, how='outer',
on=["timestamp", "date"])
# Initialisiere den df der Gesamtdaten mit den Daten des aktuellen Themengebiets
else:
df_all = df_column
return df_all
def merge_data_week_year2(df, from_column='topic', to_columns=[], perform_group=None) -> pd.DataFrame:
df_all = None
for column in to_columns:
# Betrachte nur die Artikel des aktuellen Themengebiets
df_column = df.loc[df[from_column] == column]
# Gruppiere die Artikel nach Woche (eindeutig) und aggregiere die Anzahl der Artikel pro Woche
df_column = perform_group(df_column, column)
# Füge ein neues Feature hinzu: Datum
df_column['date'] = "KW " + \
df_column['week'].astype(str) + " " + df_column['year'].astype(str)
df_column['timestamp'] = df_column.apply(
week_year_to_timestamp, axis=1)
# Lösche zwei Features: Woche, Jahr
df_column.drop(['week', 'year'], axis=1, inplace=True)
# Falls der df der Gesamtdaten bereits Daten von vorherigen Themengebieten enthält, merge die Daten des aktuellen Themengebiets
if (isinstance(df_all, pd.DataFrame)):
df_all = pd.merge(df_all, df_column, how='outer',
on=["timestamp", "date"])
# Initialisiere den df der Gesamtdaten mit den Daten des aktuellen Themengebiets
else:
df_all = df_column
return df_all