import tensorflow as tf import pandas as pd import numpy as np from sklearn.metrics import r2_score def r2_(y, pred): ybar = np.sum(y) / len(y) ssreg = np.sum((pred - ybar)**2) sstot = np.sum((y - ybar)**2) return ssreg/sstot def time_series_sigmoid_classification(dataset, k, n0, x_columns, y_columns): inp = dataset[x_columns] out = dataset[y_columns] col = "day" x = [] y = [] input_shape = 0 output_shape = 0 for player in out["playerID"].unique(): XPlayer = inp[inp["playerID"] == player] YPlayer = out[out["playerID"] == player] for day in YPlayer[col][n0 - 1:]: prev = day - k xprev = XPlayer[XPlayer[col] == prev].drop(columns=[col, "playerID"]).to_numpy() if xprev.shape[0] != 1: continue else: xprev = xprev[0, :] yt = YPlayer[YPlayer[col] == day].drop(columns=[col, "playerID"]).to_numpy()[0, :] if input_shape == 0: input_shape = xprev.shape[0] else: if input_shape != xprev.shape[0]: print("INCONSISTENT INPUT DIMENSION") exit(2) if output_shape == 0: output_shape = yt.shape[0] else: if output_shape != yt.shape[0]: print("INCONSISTENT OUTPUT DIMENSION") exit(2) x.append(xprev) y.append(yt) x = np.array(x) y = np.array(y) model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=[input_shape]), tf.keras.layers.Dense(output_shape, activation=tf.nn.softmax) ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy', 'categorical_accuracy']) model.fit(x, y, epochs=50) loss, accuracy = model.evaluate(x, y) print(loss, accuracy) return model.get_weights() def time_series_dnn_classification(dataset, k, n0, x_columns, y_columns): inp = dataset[x_columns] out = dataset[y_columns] col = "day" x = [] y = [] input_shape = 0 output_shape = 0 for player in out["playerID"].unique(): XPlayer = inp[inp["playerID"] == player] YPlayer = out[out["playerID"] == player] for day in YPlayer[col][n0 - 1:]: prev = day - k xprev = XPlayer[XPlayer[col] == prev].drop(columns=[col, "playerID"]).to_numpy() if xprev.shape[0] != 1: continue else: xprev = xprev[0, :] yt = YPlayer[YPlayer[col] == day].drop(columns=[col, "playerID"]).to_numpy()[0, :] if input_shape == 0: input_shape = xprev.shape[0] else: if input_shape != xprev.shape[0]: print("INCONSISTENT INPUT DIMENSION") exit(2) if output_shape == 0: output_shape = yt.shape[0] else: if output_shape != yt.shape[0]: print("INCONSISTENT OUTPUT DIMENSION") exit(2) x.append(xprev) y.append(yt) x = np.array(x) y = np.array(y) model = tf.keras.Sequential([ tf.keras.layers.Dense(32, input_dim=input_shape,activation=tf.nn.softmax), tf.keras.layers.Dense(output_shape, input_dim=32, activation=tf.nn.softmax) ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy', 'categorical_accuracy']) print(output_shape) model.fit(x, y, epochs=50) loss, accuracy = model.evaluate(x, y) print(x.shape) print(y.shape) print(loss, accuracy) return model.get_weights() def time_series_linear_regression(dataset, k, n0, x_columns, y_columns): inp = dataset[x_columns] out = dataset[y_columns] col = "day" x = [] y = [] input_shape = 0 output_shape = 0 for player in out["playerID"].unique(): XPlayer = inp[inp["playerID"] == player] YPlayer = out[out["playerID"] == player] for day in YPlayer[col][n0 - 1:]: prev = day - k xprev = XPlayer[XPlayer[col] == prev].drop(columns=[col, "playerID"]).to_numpy() if xprev.shape[0] != 1: continue else: xprev = xprev[0, :] yt = YPlayer[YPlayer[col] == day].drop(columns=[col, "playerID"]).to_numpy()[0, :] if input_shape == 0: input_shape = xprev.shape[0] else: if input_shape != xprev.shape[0]: print("INCONSISTENT INPUT DIMENSION") exit(2) if output_shape == 0: output_shape = yt.shape[0] else: if output_shape != yt.shape[0]: print("INCONSISTENT OUTPUT DIMENSION") exit(2) x.append(xprev) y.append(yt) x = np.array(x) y = np.array(y) model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=[input_shape]), tf.keras.layers.Dense(output_shape) ]) model.compile(optimizer='adam', loss='mean_squared_error', metrics=[tf.keras.metrics.mean_squared_error]) model.fit(x, y, epochs=50, verbose=2) pred = model.predict(x) r2 = r2_(y, pred) hard_pred = model.predict(x[0]) hard_out = np.matmul(x[0], [0.03589787, -0.03472298, 0.24109702, -0.10143519]) - 0.890594 print(hard_pred, hard_out, y[0]) return r2, model.get_weights() def time_series_dnn_regressions(dataset, k, n0, x_columns, y_columns): inp = dataset[x_columns] out = dataset[y_columns] col = "day" x = [] y = [] input_shape = 0 output_shape = 0 for player in out["playerID"].unique(): XPlayer = inp[inp["playerID"] == player] YPlayer = out[out["playerID"] == player] for day in YPlayer[col][n0 - 1:]: prev = day - k xprev = XPlayer[XPlayer[col] == prev].drop(columns=[col, "playerID"]).to_numpy() if xprev.shape[0] != 1: continue else: xprev = xprev[0, :] yt = YPlayer[YPlayer[col] == day].drop(columns=[col, "playerID"]).to_numpy()[0, :] if input_shape == 0: input_shape = xprev.shape[0] else: if input_shape != xprev.shape[0]: print("INCONSISTENT INPUT DIMENSION") exit(2) if output_shape == 0: output_shape = yt.shape[0] else: if output_shape != yt.shape[0]: print("INCONSISTENT OUTPUT DIMENSION") exit(2) x.append(xprev) y.append(yt) x = np.array(x) y = np.array(y) model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=[input_shape]), tf.keras.layers.Dense(32, activation=tf.nn.softmax), tf.keras.layers.Dense(output_shape) ]) model.compile(optimizer='adam', loss='mean_squared_error', metrics=[tf.keras.metrics.mean_squared_error]) model.fit(x, y, epochs=100, verbose=2) loss, accuracy = model.evaluate(x, y) pred = model.predict(x) r2 = r2_(y, pred) return r2, model.get_weights() def main(): filename = "personal.csv" df = pd.read_csv(filename) x = ["day", "playerID", "sleepHoursSliding", "sleepHours", "sleepQuality", "acuteChronicRatio"] y = ["day", "playerID", "fatigueNorm"] k = 0 n0 = 30 r2, weights = time_series_linear_regression(df, k, n0, x, y) print("r2") print(r2) print("weights") print(weights) if __name__ == "__main__": main()