Un enfoque simple para publicar en la hora de la ranura que usted espera recibir más le gusta.
Su descripción sugiere que el espera que el componente de la serie de tiempo es de temporada por horas del día.
Para ser más precisos, supongamos que la influencia es el multiplicativo. Una parametrización de la realización de ese modelo para 30 días es la siguiente.
Si queremos normalizar y superposición de cada día, podemos realizar la regresión.
Como si por hacer trampa, hemos recuperado nuestro componente estacional.
El código.
import numpy as np
import pandas
from matplotlib import pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
def generate_ts(hours=24, days=30):
np.random.seed(123)
# Generate some iid like data
x = np.random.binomial(10, .5, hours * days)
# Generate your trend
slice = np.linspace(-np.pi, np.pi, hours)
hourly_trend = np.round(np.cos(slice) * 5)
hourly_trend -= hourly_trend.min()
rep_hourly_trend = np.tile(hourly_trend, days)
data = x * rep_hourly_trend
# Generate a index
ind = pandas.DatetimeIndex(freq='h',
start='2013-09-29 00:00:00',
periods=days * hours)
return pandas.Series(data, index=ind), hourly_trend
def recover_trend(ts, hours=24, days=30):
obs_trend = ts.values.reshape(-1, hours)
obs_trend = (obs_trend.T - obs_trend.mean(axis=1)) / obs_trend.std(axis=1)
y = obs_trend.ravel()
x = (np.repeat(np.arange(hours), days)).reshape(-1, 1)
model = KNeighborsRegressor()
model.fit(x, y)
rec_trend = model.predict(np.arange(hours).reshape(-1, 1))
return x, y, rec_trend
def main():
hours, days = 24, 30
ts, true_trend = generate_ts(hours=hours, days=days)
true_trend = (true_trend - true_trend.mean()) / true_trend.std()
ts.plot()
plt.title("Run Sequence Plot of Likes")
plt.ylabel("Likes")
plt.xlabel("Time")
plt.show()
x, y, rec_trend = recover_trend(ts, hours=hours, days=days)
plt.scatter(x.ravel(), y, c='k', label='Observed Trend')
plt.plot(np.arange(hours), rec_trend, 'g', label='Recovered Trend', linewidth=5)
plt.plot(np.arange(hours), true_trend, 'r', label='True Trend', linewidth=5)
plt.grid()
plt.title("Trend Regression")
plt.ylabel("Normalized Like Influence")
plt.xlabel("Hours")
plt.legend()
plt.show()
season_comp = pandas.Series(np.tile(rec_trend, days), index=ts.index)
season_comp.plot()
plt.title("Run Sequence Plot of Seasonal Component of Likes")
plt.ylabel("Likes")
plt.xlabel("Time")
plt.show()
if __name__ == '__main__':
main()
Antes de usar este, debo precaución que hay varias cuestiones.
Si hay un componente de tendencia, que deben ser tratados en primer lugar. Bajo orden de regresión polinomial o el gal operador son opciones populares.
La inspección cuidadosa de la autocorrelación y autocorrelación parcial de las parcelas puede revelar los componentes adicionales de la serie de tiempo a considerar.
Después de detrending su serie de tiempo, usted debe inspeccionar los residuos de estacionariedad.
No se da ninguna información sobre las distribuciones de los tiempos de que las publicaciones se hicieron en los datos recogidos.
Aunque puede parecer obvio que el óptimo de la publicación de el tiempo es anterior a la máxima de la recuperados tendencias de temporada, este puede no ser el caso.
El cambio de la publicación de el tiempo, puede cambiar la estacionalidad de los gustos.
La aglutinación de todos los puestos de la hora a la que recibe más le gusta, probablemente va a cambiar el comportamiento de los usuarios.
Este problema es más adecuado para el aprendizaje por refuerzo. El enfoque basado en principios es realizar secuencial de optimización de tiempo post por contextual de los bandidos.