2020import traceback
2121
2222import matplotlib
23+
2324# matplotlib.use("Agg")
2425import matplotlib .pyplot as plt
2526import matplotlib .animation
3031
3132import datetime
3233
33- from windrose import ( WindroseAxes , FIGSIZE_DEFAULT , DPI_DEFAULT )
34+ from windrose import WindroseAxes , FIGSIZE_DEFAULT , DPI_DEFAULT
3435
3536logging .Formatter .converter = time .gmtime
36- logging .basicConfig (format = ' %(asctime)s %(levelname)s %(message)s' , level = logging .DEBUG )
37+ logging .basicConfig (format = " %(asctime)s %(levelname)s %(message)s" , level = logging .DEBUG )
3738logger = logging .getLogger (__name__ )
3839
39- pd .set_option (' max_rows' , 10 )
40+ pd .set_option (" max_rows" , 10 )
4041
4142S_FIGSIZE_DEFAULT = "," .join (map (str , FIGSIZE_DEFAULT ))
4243
4344
4445def get_by_func (by = None , by_func = None ):
4546 if by is None and by_func is None :
46- by = 'MS'
47+ by = "MS"
4748
48- if by in [' year' , ' yearly' , 'Y' ]:
49+ if by in [" year" , " yearly" , "Y" ]:
4950 return lambda dt : dt .year
50- elif by in [' month' , ' monthly' , 'MS' ]: # MS: month start
51+ elif by in [" month" , " monthly" , "MS" ]: # MS: month start
5152 return lambda dt : (dt .year , dt .month )
52- elif by in [' day' , ' daily' , 'D' ]:
53+ elif by in [" day" , " daily" , "D" ]:
5354 return lambda dt : (dt .year , dt .month , dt .day )
5455 elif by is None and by_func is not None :
5556 return by_func
@@ -60,8 +61,8 @@ def get_by_func(by=None, by_func=None):
6061def generate (df_all , func , copy = True ):
6162 if copy :
6263 df_all = df_all .copy ()
63- df_all ['by' ] = df_all .index .map (func )
64- df = df_all .reset_index ().set_index (['by' , df_all .index .name ])
64+ df_all ["by" ] = df_all .index .map (func )
65+ df = df_all .reset_index ().set_index (["by" , df_all .index .name ])
6566 for by_val in df .index .levels [0 ]:
6667 yield df .loc [by_val ]
6768
@@ -71,19 +72,42 @@ def count(df_all, func):
7172
7273
7374@click .command ()
74- @click .option ("--filename" , default = "samples/sample_wind_poitiers.csv" , help = "Input filename" )
75+ @click .option (
76+ "--filename" , default = "samples/sample_wind_poitiers.csv" , help = "Input filename"
77+ )
7578@click .option ("--exit_at" , default = 0 , help = "premature exit (int) - must be > 1" )
76- @click .option ("--by" , default = ' month' , help = "Animate by (year, month, day...)" )
79+ @click .option ("--by" , default = " month" , help = "Animate by (year, month, day...)" )
7780@click .option ("--rmax" , default = 1000 , help = "rmax" )
78- @click .option ("--filename_out" , default = "windrose_animation.mp4" , help = "Output filename" )
81+ @click .option (
82+ "--filename_out" , default = "windrose_animation.mp4" , help = "Output filename"
83+ )
7984@click .option ("--dpi" , default = DPI_DEFAULT , help = "Dot per inch for plot generation" )
80- @click .option ("--figsize" , default = S_FIGSIZE_DEFAULT , help = "Figure size x,y - default=%s" % S_FIGSIZE_DEFAULT )
81- @click .option ("--fps" , default = 7 , help = "Number of frame per seconds for video generation" )
85+ @click .option (
86+ "--figsize" ,
87+ default = S_FIGSIZE_DEFAULT ,
88+ help = "Figure size x,y - default=%s" % S_FIGSIZE_DEFAULT ,
89+ )
90+ @click .option (
91+ "--fps" , default = 7 , help = "Number of frame per seconds for video generation"
92+ )
8293@click .option ("--bins_min" , default = 0.01 , help = "Bins minimum value" )
8394@click .option ("--bins_max" , default = 20 , help = "Bins maximum value" )
8495@click .option ("--bins_step" , default = 2 , help = "Bins step value" )
8596@click .option ("--fontname" , default = "Courier New" , help = "Font name" )
86- def main (filename , exit_at , by , rmax , dpi , figsize , fps , bins_min , bins_max , bins_step , fontname , filename_out ):
97+ def main (
98+ filename ,
99+ exit_at ,
100+ by ,
101+ rmax ,
102+ dpi ,
103+ figsize ,
104+ fps ,
105+ bins_min ,
106+ bins_max ,
107+ bins_step ,
108+ fontname ,
109+ filename_out ,
110+ ):
87111 # convert figsize (string like "8,9" to a list of float [8.0, 9.0]
88112 figsize = figsize .split ("," )
89113 figsize = map (float , figsize )
@@ -92,10 +116,10 @@ def main(filename, exit_at, by, rmax, dpi, figsize, fps, bins_min, bins_max, bin
92116
93117 # Read CSV file to a Pandas DataFrame
94118 df_all = pd .read_csv (filename )
95- df_all [' Timestamp' ] = pd .to_datetime (df_all [' Timestamp' ])
96- df_all = df_all .set_index (' Timestamp' )
119+ df_all [" Timestamp" ] = pd .to_datetime (df_all [" Timestamp" ])
120+ df_all = df_all .set_index (" Timestamp" )
97121
98- df_all .index = df_all .index .tz_localize (' UTC' ).tz_convert (' UTC' )
122+ df_all .index = df_all .index .tz_localize (" UTC" ).tz_convert (" UTC" )
99123
100124 dt_start = df_all .index [0 ]
101125 dt_end = df_all .index [- 1 ]
@@ -106,20 +130,28 @@ def main(filename, exit_at, by, rmax, dpi, figsize, fps, bins_min, bins_max, bin
106130First dt: %s
107131Last dt: %s
108132 td: %s
109- Slides: %d""" % (dt_start , dt_end , td , Nslides )
133+ Slides: %d""" % (
134+ dt_start ,
135+ dt_end ,
136+ td ,
137+ Nslides ,
138+ )
110139 logger .info (msg )
111140
112141 # Define bins
113142 bins = np .arange (bins_min , bins_max , bins_step )
114143
115144 # Create figure
116- fig = plt .figure (figsize = figsize , dpi = dpi , facecolor = 'w' , edgecolor = 'w' )
145+ fig = plt .figure (figsize = figsize , dpi = dpi , facecolor = "w" , edgecolor = "w" )
117146
118147 # Create a video writer (ffmpeg can create MPEG files)
119- FFMpegWriter = matplotlib .animation .writers ['ffmpeg' ]
120- metadata = dict (title = 'windrose' , artist = 'windrose' ,
121- comment = """Made with windrose
122- http://www.github.com/scls19fr/windrose""" )
148+ FFMpegWriter = matplotlib .animation .writers ["ffmpeg" ]
149+ metadata = dict (
150+ title = "windrose" ,
151+ artist = "windrose" ,
152+ comment = """Made with windrose
153+ http://www.github.com/scls19fr/windrose""" ,
154+ )
123155 writer = FFMpegWriter (fps = fps , metadata = metadata )
124156
125157 dt_start_process = datetime .datetime .now ()
@@ -133,23 +165,34 @@ def main(filename, exit_at, by, rmax, dpi, figsize, fps, bins_min, bins_max, bin
133165 msg = """ Slide %s/%s
134166 From %s
135167 to %s
136- td %s""" % (i + 1 , Nslides , dt1 , dt2 , td )
168+ td %s""" % (
169+ i + 1 ,
170+ Nslides ,
171+ dt1 ,
172+ dt2 ,
173+ td ,
174+ )
137175 logger .info (msg )
138176 remaining = Nslides - (i + 1 )
139177 now = datetime .datetime .now ()
140178 td_remaining = (now - dt_start_process ) / (i + 1 ) * remaining
141- logger .info (""" Expected
179+ logger .info (
180+ """ Expected
142181 time: %s
143182 end at: %s
144- """ % (td_remaining , now + td_remaining ))
183+ """
184+ % (td_remaining , now + td_remaining )
185+ )
145186
146187 title = " From %s\n to %s" % (dt1 , dt2 )
147188
148189 try :
149- ax = WindroseAxes .from_ax (fig = fig , rmax = rmax ) # scatter, bar, box, contour, contourf
190+ ax = WindroseAxes .from_ax (
191+ fig = fig , rmax = rmax
192+ ) # scatter, bar, box, contour, contourf
150193
151- direction = df [' direction' ].values
152- var = df [' speed' ].values
194+ direction = df [" direction" ].values
195+ var = df [" speed" ].values
153196
154197 # ax.scatter(direction, var, alpha=0.2)
155198 # ax.set_xlim([-bins[-1], bins[-1]])
@@ -162,7 +205,7 @@ def main(filename, exit_at, by, rmax, dpi, figsize, fps, bins_min, bins_max, bin
162205 # ax.contour(direction, var, cmap=cm.hot, lw=3, bins=bins)
163206
164207 ax .contourf (direction , var , bins = bins , cmap = cm .hot )
165- ax .contour (direction , var , bins = bins , colors = ' black' , lw = 3 )
208+ ax .contour (direction , var , bins = bins , colors = " black" , lw = 3 )
166209
167210 ax .set_legend ()
168211
0 commit comments